Amazon VPC フローログ の Apache Parquet 形式を CloudFormation から設定するサンプルテンプレート

2022.03.12

VPC フローログの Apache Parquet 形式の設定を CloudFormation がサポートしていたのでサンプルテンプレートを作成し設定を確認しました。

機能詳細は以下のリンクをご確認ください。

ユーザーガイドを確認

2021年10月のアップデート当時はマネジメントコンソールからの設定はできましたが、CloudFormation からの設定はサポートされていませんでした。久々にユーザーガイドを確認したらサポートされていることに気づきました。

  • デフォルト設定はplain-textなので明示的に指定する必要があります
  • 設定書式はJson形式です

参照元: AWS::EC2::FlowLog - AWS CloudFormation

作ってみた

既存 VPC を選択してApache Parquet 形式を指定した VPC フローログを設定するサンプルテンプレートです。

VPC フローログ保存用の S3 バケットは一定期間経過後にログ(オブジェクト)を完全に削除するライフサイクルルールを設定しています。

  • 90日後に現行オブジェクトを削除
  • 非現行オブジェクトは30日後に完全に削除

ログ保存ポリシーをご確認の上、ライフサイクルルールは適切なものをご検討ください。

vpcflowlogs.yaml

---
AWSTemplateFormatVersion: "2010-09-09"
Description: VPC Flow Logs

Parameters:
  ProjectName:
    Description: Project Name
    Type: String
    Default: unnamed
  Environment:
    Description: Environment
    Type: String
    Default: dev
    AllowedValues:
      - prod
      - dev
      - stg
  VpcId:
    Description: VPC ID
    Type: AWS::EC2::VPC::Id
  Filter:
    Type: String
    Default: ALL
    AllowedValues: [ALL, ACCEPT, REJECT]
  S3BucketName:
    Description: Type the name of S3 Bucket for VPC Flow Logs
    Type: String

Resources:
  # ------------------------------------------------------------#
  # S3 Bucket for VPC Flow Logs
  # ------------------------------------------------------------#
  S3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      BucketName: !Sub ${ProjectName}-${Environment}-${S3BucketName}-${AWS::AccountId}
      OwnershipControls: # ACL無効化設定
        Rules:
          - ObjectOwnership: "BucketOwnerEnforced"
      PublicAccessBlockConfiguration: # パブリックアクセスの設定
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
      VersioningConfiguration: # バージョニング設定
        Status: Enabled
      BucketEncryption: # 暗号化設定
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: "AES256"
            BucketKeyEnabled: false
      LifecycleConfiguration: # ライフサイクルルール設定
        Rules:
          - Id: AbortIncompleteMultipartUpload # 未完了なマルチパートアップロードの削除
            AbortIncompleteMultipartUpload:
              DaysAfterInitiation: 7
            Status: "Enabled"
          - Id: CurrentVersionExpiration # 現行のバージョン削除
            ExpirationInDays: 90
            Status: "Enabled"
          - Id: NoncurrentVersionExpiration # 非現行のバージョン削除
            NoncurrentVersionExpiration:
              # NewerNoncurrentVersions: 1
              NoncurrentDays: 30
            Status: "Enabled"

  # ------------------------------------------------------------#
  # VPC Flow Logs
  # ------------------------------------------------------------#
  VPCFlowLogs:
    Type: "AWS::EC2::FlowLog"
    Properties:
      LogDestinationType: s3
      LogDestination: !GetAtt S3Bucket.Arn
      ResourceType: "VPC"
      ResourceId: !Ref VpcId
      TrafficType: !Ref Filter
      DestinationOptions:
        {
          "FileFormat": "parquet",
          "HiveCompatiblePartitions": true,
          "PerHourPartition": true,
        }

VPC フローログ確認

parquet形式の設定が入っています。

S3 バケット確認

parquet形式で保存されていました。

おわりに

Terraform は早々にparquetをサポートしていました。と、リリース当時に同僚から教えてもらい、CloudFormation はいつ対応するのかと待っていました。調べる用があったついでに確認したらサポートされていたので動作確認しました。VPC フローログを CloudFormation から設定する機会があればご参考にしていただければ幸いです。

aws_flow_log | Resources | hashicorp/aws | Terraform Registry

最後に一点注意して頂きたいのは今回設定したDestinationOptionsの項目についてユーザーガイドにはYAMLで指定するサンプルが掲載されておりますが、現時点ではJson形式の指定のみのサポートのため、サンプルをコピペするとエラーになります。

参考