CloudWatchLogsのログをFirehose経由でS3に出力してみた
はじめに
AWSチームのすずきです。
Amazon CloudWatch Logs (Vended Logs)はサブスクリプションフィルタを利用して、 Lambda、Kinesis Stream、Kinesis Data Firehose、Amazon Elasticsearch Serviceと連携する事が可能です。(2018年7月現在)
今回、サブスクリプションフィルタの連携先としてKinesis Data Firehoseを指定し、 Vended Logs(VPCフローログ)のS3への出力を試す機会がありましたので紹介させて頂きます。
設定
LambdaとElasticsearch以外のサブスクリプションフィルタは、AWS CLIなどを利用して設定します。
今回の検証環境は、以下のCloudFromationテンプレートを利用して設定を行いました。
CloudFromation
- 検証に利用したCloudFormationテンプレートです。
- CloudWatchのLogGroup、SubscriptionFilter、Firehoseのストリーム、S3バケットを設置します。
AWSTemplateFormatVersion: '2010-09-09'
Description: cloudwatchlogs to firehose direct (no lambda) 20180520
Parameters:
CWlogsExpiredate:
Description: Number of days to keep Cloudwatch logs
Type: String
Default: 10
S3Expiredate:
Description: Number of days to keep S3 file
Type: String
Default: 10
Resources:
Step1LogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub '/aws/logs/${AWS::StackName}'
RetentionInDays: !Ref 'CWlogsExpiredate'
Step2SubscriptionFilter:
Type: AWS::Logs::SubscriptionFilter
Properties:
DestinationArn: !GetAtt 'Step3deliverystream.Arn'
FilterPattern: ''
LogGroupName: !Ref 'Step1LogGroup'
RoleArn: !GetAtt 'Step2LogsRole.Arn'
Step2LogsRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: !Sub 'logs.${AWS::Region}.amazonaws.com'
Action:
- sts:AssumeRole
Path: /
Policies:
- PolicyName: root
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- firehose:*
Resource: !GetAtt 'Step3deliverystream.Arn'
Step3deliverystream:
DependsOn:
- Step3deliveryPolicy
Type: AWS::KinesisFirehose::DeliveryStream
Properties:
ExtendedS3DestinationConfiguration:
BucketARN: !Sub 'arn:aws:s3:::${Step4S3bucket}'
BufferingHints:
IntervalInSeconds: '60'
SizeInMBs: '50'
CompressionFormat: GZIP
Prefix: firehose/vpc_flowlog_direct/
RoleARN: !GetAtt 'Step3deliveryRole.Arn'
ProcessingConfiguration:
Enabled: 'false'
Step3deliveryRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: ''
Effect: Allow
Principal:
Service: firehose.amazonaws.com
Action: sts:AssumeRole
Condition:
StringEquals:
sts:ExternalId: !Ref 'AWS::AccountId'
Step3deliveryPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: firehose_delivery_policy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- s3:AbortMultipartUpload
- s3:GetBucketLocation
- s3:GetObject
- s3:ListBucket
- s3:ListBucketMultipartUploads
- s3:PutObject
Resource:
- !Sub 'arn:aws:s3:::${Step4S3bucket}'
- !Sub 'arn:aws:s3:::${Step4S3bucket}*'
Roles:
- !Ref 'Step3deliveryRole'
Step3LogGroupFirehose:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub '/aws/firehose/${Step3deliverystream}'
RetentionInDays: 7
Step4S3bucket:
Type: AWS::S3::Bucket
DeletionPolicy: Delete
Properties:
LifecycleConfiguration:
Rules:
- Id: AutoDelete
Status: Enabled
ExpirationInDays: !Ref 'S3Expiredate'
VPCフローログ設定
- CloudFormationで作成されたLogGroupを出力先とするVPCフローログ設定を行いました。
確認
- Firehoseの出力先からファイルをダウンロード、GZIP圧縮を展開しJSON形式で保存されたログを参照する事ができました。
1 2 3 | cd /tmp aws s3 cp s3: // <S3バケット名> /firehose/cw_logs_firehose/2018/07/15/05/aaa-Step3deliverystream-bbbbbb /tmp/ cat aaa-Step3deliverystream-bbbbbb | gzip -d| jq . |
出力例
- VPCフローログ出力例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | { "messageType" : "DATA_MESSAGE" , "owner" : "00000000000" , "logGroup" : "/cw_logs/aaa" , "logStream" : "eni-xxxxxxxx-all" , "subscriptionFilters" : [ "aaa-Step2SubscriptionFilter-ccc" ], "logEvents" : [ { "id" : "34156565544237522570852594165671859978202113352719663104" , "timestamp" : 1531633371000, "message" : "2 00000000000 eni-xxxxxxxx 192.168.0.XX 54.239.25.XX 41314 443 6 1 40 1531633371 1531633405 ACCEPT OK" }, { "id" : "34156565544237522570852594165671859978202113352719663105" , "timestamp" : 1531633371000, "message" : "2 00000000000 eni-xxxxxxxx 60.191.38.XX 192.168.0.XX 46389 8000 6 1 44 1531633371 1531633405 REJECT OK" } ] } |
AWS費用
2018年7月現在、東京リージョンで投入データ1GBあたりの利用費用は以下の通り。
- CloudWatchLogs: $0.76
- Kinesis Data Firehose: $0.036
今回紹介したFirehoseを利用したS3へのエクスポート、CloudWatchLogs費用の5%程度の増加で利用可能です。
まとめ
CloudwatchLogs、S3へのエクスポート機能を備えていましたが、 サブスクリプションフィルタによるFirehose連携でより簡単にS3出力が可能になりました。
CloudwatchLogsに登録されたログデータの集計や検索処理などのためS3へのログ保存が望ましい場合、 今回紹介させて頂いた手順をお試しください。
また、CloudwatchLogsのサブスクリプションフィルタはLambdaと連携する事も可能です。 Firehoseへの投入前処理をLambda関数で実施し、S3 Selectや、Athenaを利用したログ参照については、 次の記事で紹介させて頂きたいと思います。