CloudWatchLogsのログをFirehose経由でS3に出力してみた

はじめに

AWSチームのすずきです。

Amazon CloudWatch Logs (Vended Logs)はサブスクリプションフィルタを利用して、 Lambda、Kinesis Stream、Kinesis Data Firehose、Amazon Elasticsearch Serviceと連携する事が可能です。(2018年7月現在)

CloudWatch Logs Subscriptionsを利用したZabbixへのログ転送

今回、サブスクリプションフィルタの連携先としてKinesis Data Firehoseを指定し、 Vended Logs(VPCフローログ)のS3への出力を試す機会がありましたので紹介させて頂きます。

設定

LambdaとElasticsearch以外のサブスクリプションフィルタは、AWS CLIなどを利用して設定します。

例 3: Amazon Kinesis Data Firehose のサブスクリプションフィルタ

今回の検証環境は、以下の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フローログ設定を行いました。

【新機能】VPC Flow LogsでVPC内のIPトラフィックを監視することができるようになりました!

確認

  • 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出力が可能になりました。

CloudWatch LogsのS3エクスポート

CloudwatchLogsに登録されたログデータの集計や検索処理などのためS3へのログ保存が望ましい場合、 今回紹介させて頂いた手順をお試しください。

また、CloudwatchLogsのサブスクリプションフィルタはLambdaと連携する事も可能です。 Firehoseへの投入前処理をLambda関数で実施し、S3 Selectや、Athenaを利用したログ参照については、 次の記事で紹介させて頂きたいと思います。