【CloudFormation】AWSマルチAZ3層アーキテクチャの構築_S3_VPC Flow Logs_ALB access log

皆様、お世話になっております。鈴木と申します。
今回はAWS Cloudformationを使用してS3を作成し、そのS3にALBアクセスログとVPCフローログを収集するようにしていきたいと思います。

1.目次

目次はこちら

2.要件

  • S3バケットを作成してVPCフローログ・ALBアクセスログをそれぞれ別で収集できるようにする。

3.S3について

Amazon S3は、オブジェクトストレージサービスで、スケーラブルで高可用性のストレージを提供します。データを「バケット」に保存し、オブジェクト単位で管理することができます。

特徴 説明
ストレージタイプ オブジェクトストレージ
データ管理 バケット: データを保存するコンテナ
オブジェクト: データ本体とメタデータを含むファイル
スケーラビリティ 無制限のストレージ容量。データの追加や削除に制限なし
データの耐久性 99.999999999%(11 9’s)耐久性。データは複数のアベイラビリティゾーンに自動的に複製されます。
データの可用性 高い可用性を提供。通常99.99%の月間可用性を保証
セキュリティ アクセス制御: IAMポリシー、バケットポリシー、ACLでの細かいアクセス管理
暗号化: データの転送と静止時の暗号化
データ管理機能 バージョニング: オブジェクトの履歴管理
ライフサイクルポリシー: データの自動アーカイブや削除
データの取得 標準: 高速なデータアクセス
低頻度アクセス(IA): コスト削減のためのアクセス頻度が低いデータ向け
アーカイブ(Glacier): 長期保存用

主な用途として下記が挙げられます。

  • バックアップとアーカイブ: データの安全な保管と長期保存。
  • コンテンツ配信: 静的ウェブサイトやメディアファイルのホスティング。
  • データ分析: 大量データの収集と処理。
  • データレイク: 大規模なデータ分析基盤の構築。

Amazon S3は高い耐久性とスケーラビリティを提供し、企業のデータストレージニーズに応える強力なサービスです。用途に応じて、適切なストレージクラスやセキュリティ機能を選択することができます。

4.構成図

ALBのアクセスログとVPCフローログをS3にて収集します。
file

5.S3作成用ソースコード全体および詳細

YAML形式にて記述しております。
まずはS3を作成します。
※ファイルを分ける場合で、VPCフローログを設定する場合は先にS3を作成しておくとスムーズです。

5-1S3バケット作成

使用するオプション 設定値 説明
Type AWS::S3::Bucket デフォルトの定義
BucketName !Ref ALBS3BucketName バケット名を指定
AccessControl Private アクセスコントロールを指定
BlockPublicAcls true パブリックアクセスコントロールリスト(ACL)をブロック
BlockPublicPolicy true バケットポリシーでのパブリックアクセスをブロック
IgnorePublicAcls true すべてのパブリックACLを無視
RestrictPublicBuckets true バケットへのパブリックアクセスを制限
VersioningConfiguration:
Status:
true バージョニングを有効化

5-2.ALBバケットポリシー

使用するオプション 設定値 説明
Type AWS::S3::BucketPolicy バケットポリシーを定義するリソースタイプ
BucketName !Ref ALBAccessLogsBucket バケット名を指定
Statement:
Sid
AllowALBLogsAccessFromSpecificAccount アクセスコントロールの識別子
Effect Allow アクションを許可する
Principal arn:aws:iam::リージョンID:root 特定のリージョンを対象にする
Action s3:PutObject, s3:GetBucketAcl, s3:GetObject, s3:ListBucket アクションの許可リスト
Resource arn:aws:s3:::${ALBS3BucketName}, arn:aws:s3:::${ALBS3BucketName}/${ALBS3LogKeyPrefix}* 対象リソースのARN

5-3.VPCバケットポリシー

使用するオプション 設定値 説明
Type AWS::S3::BucketPolicy バケットポリシーを定義するリソースタイプ
BucketName !Ref VPCFlowLogsBucket バケット名を指定
Statement:
Sid
AllowVPCFlowLogsAccess VPCフローログのアクセスを許可するルールの識別子
Effect Allow アクションを許可する
Principal arn:aws:iam::アカウントID:root VPCフローログを生成するアカウントID
Action s3:PutObject, s3:GetBucketAcl, s3:GetObject, s3:ListBucket アクションの許可リスト
Resource arn:aws:s3:::${VPCS3BucketName}, arn:aws:s3:::${VPCS3BucketName}/${VPCS3LogKeyPrefix}* 対象リソースのARN
Statement:
Sid
AWSLogDeliveryWrite AWSログ配信サービスのログ書き込みを許可するルールの識別子
Principal delivery.logs.amazonaws.com AWSログ配信サービス
Action s3:PutObject ログの書き込みを許可
Resource arn:aws:s3:::${VPCS3BucketName}/${VPCS3LogKeyPrefix}AWSLogs/アカウントID/* 特定のプレフィックス(AWSLogs)に対するアクセス
Condition:
StringEquals
aws:SourceAccount: アカウントID, s3:x-amz-acl: bucket-owner-full-control 指定アカウントとフルコントロール権限の条件
Condition:
ArnLike
aws:SourceArn: arn:aws:logs:リージョン:アカウントID:* 指定リージョンとアカウントIDのログサービスからのアクセス
Statement:
Sid
AWSLogDeliveryAclCheck バケットのACL確認を許可するルールの識別子
Principal delivery.logs.amazonaws.com AWSログ配信サービス
Action s3:GetBucketAcl バケットのACL取得を許可
Resource arn:aws:s3:::${VPCS3BucketName} バケット全体に対するアクセス
Condition:
StringEquals
aws:SourceAccount: アカウントID 指定アカウントからのアクセスのみ許可
Condition:
ArnLike
aws:SourceArn: arn:aws:logs:リージョン:アカウントID:* 指定リージョンとアカウントIDのログサービスからのアクセス

5-4.ソースコード

AWSTemplateFormatVersion: '2010-09-09'
Description: 

Resources:
  # ALB用 S3 バケット作成
  ALBAccessLogsBucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref ALBS3BucketName
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      VersioningConfiguration:
        Status: Enabled

  # ALB用 バケットポリシー
  ALBAccessLogsBucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref ALBAccessLogsBucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Sid: "AllowALBLogsAccessFromSpecificAccount"
            Effect: Allow
            Principal:
              AWS: "arn:aws:iam::リージョンID:root"
            Action:
              - "s3:PutObject"
              - "s3:GetBucketAcl"
              - "s3:GetObject"
              - "s3:ListBucket"
            Resource:
              - !Sub "arn:aws:s3:::${ALBS3BucketName}"
              - !Sub "arn:aws:s3:::${ALBS3BucketName}/${ALBS3LogKeyPrefix}*"

  # VPC用 S3 バケット作成
  VPCFlowLogsBucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref VPCS3BucketName
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      VersioningConfiguration:
        Status: Enabled

  # VPC用 バケットポリシー
  VPCFlowLogsBucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref VPCFlowLogsBucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Sid: "AllowVPCFlowLogsAccess"
            Effect: Allow
            Principal:
              AWS: "arn:aws:iam::アカウントID:root"
            Action:
              - "s3:PutObject"
              - "s3:GetBucketAcl"
              - "s3:GetObject"
              - "s3:ListBucket"
            Resource:
              - !Sub "arn:aws:s3:::${VPCS3BucketName}"
              - !Sub "arn:aws:s3:::${VPCS3BucketName}/${VPCS3LogKeyPrefix}*"
          - Sid: "AWSLogDeliveryWrite"
            Effect: Allow
            Principal:
              Service: "delivery.logs.amazonaws.com"
            Action: "s3:PutObject"
            Resource: !Sub "arn:aws:s3:::${VPCS3BucketName}/${VPCS3LogKeyPrefix}AWSLogs/アカウントID/*"
            Condition:
              StringEquals:
                aws:SourceAccount: "アカウントID"
                s3:x-amz-acl: "bucket-owner-full-control"
              ArnLike:
                aws:SourceArn: "arn:aws:logs:リージョン:アカウントID:*"
          - Sid: "AWSLogDeliveryAclCheck"
            Effect: Allow
            Principal:
              Service: "delivery.logs.amazonaws.com"
            Action: "s3:GetBucketAcl"
            Resource: !Sub "arn:aws:s3:::${VPCS3BucketName}"
            Condition:
              StringEquals:
                aws:SourceAccount: "アカウントID"
              ArnLike:
                aws:SourceArn: "arn:aws:logs:リージョン:アカウントID:*"

Outputs:
  ALBS3BucketName:
    Description: "The name of the S3 bucket for ALB access logs"
    Value: !Ref ALBAccessLogsBucket

  VPCS3BucketName:
    Description: "The name of the S3 bucket for VPC flow logs"
    Value: !Ref VPCFlowLogsBucket

6.ALBアクセスログ用ソースコード全体および詳細

こちらはALB作成時に設定しておく必要があります。
設定する際はS3と併せて、または先にS3を作成しておきましょう。
また前回の【CloudFormation】AWSマルチAZ3層アーキテクチャの構築_ALBにて作成しておりますのでソースコードは同じ内容になります。

使用するオプション 設定値 説明
Type AWS::CertificateManager::Certificate デフォルトの定義
DomainName !Sub "${SubdomainName}" サブドメインを指定
ValidationMethod DNS 検証方法をDNSで指定
DomainValidationOptions
DomainName
!Sub "${SubdomainName}" 検証サブドメインを指定
DomainValidationOptions
ValidationDomain
!Sub "ホストドメイン名" サブドメインのホストゾーンであるドメインを指定
Tags Key: ‘Name’
Value: ‘naoki-acm’
タグのキーと値を設定
LoadBalancerAttributes Key: "access_logs.s3.enabled
"Value: "true"
アクセスログを有効化
LoadBalancerAttributes Key: "access_logs.s3.bucket"
Value: !Ref S3BucketName
保管先S3を指定
LoadBalancerAttributes Key: "access_logs.s3.prefix"
Value: "alb-logs"
S3のプレフィックスを指定
  # ALB 作成
  LoadBalancerResource:
    Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
    Properties:
      Name: "naoki-alb"
      Scheme: "internet-facing"
      Type: "application"
      Subnets:
        - !Ref Subnet1Id
        - !Ref Subnet2Id
      SecurityGroups:
        - !Ref SecurityGroupId
      IpAddressType: "ipv4"
      Tags:
        - Key: "Name"
          Value: "naoki-alb"
      LoadBalancerAttributes:
        - Key: "access_logs.s3.enabled"
          Value: "true"
        - Key: "access_logs.s3.bucket"
          Value: !Ref S3BucketName
        - Key: "access_logs.s3.prefix"
          Value: "alb-logs"

7.VPCフローログ作成

VPCフローログの場合は別ファイルでも作成可能です。

使用するオプション 設定値 説明
Type AWS::EC2::FlowLog フローログ設定を定義するリソースタイプ
LogDestination !Sub "arn:aws:s3:::${S3BucketName}" フローログを送信するS3バケットのARN
LogDestinationType s3 ログの送信先タイプ(この場合はS3バケット)
ResourceId !Ref VPCId フローログを収集するVPCのID
ResourceType VPC フローログを収集するリソースタイプ(この場合はVPC)
TrafficType ALL 収集するトラフィックのタイプ(すべてのトラフィック)
MaxAggregationInterval 600 ログの集計間隔(秒単位、ここでは10分)
Tags Key: "Name", Value: "naoki-vpc-flowlog" リソースに関連付けられるタグ
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC Flow Log to existing S3 bucket

Resources:
  # VPC フローログ
  VPCFlowLog:
    Type: "AWS::EC2::FlowLog"
    Properties:
      LogDestination: !Sub "arn:aws:s3:::${S3BucketName}"
      LogDestinationType: "s3"
      ResourceId: !Ref VPCId
      ResourceType: "VPC"
      TrafficType: "ALL"
      MaxAggregationInterval: 600
      Tags:
        - Key: "Name"
          Value: "naoki-vpc-flowlog"

Outputs:
  FlowLogId:
    Description: "The ID of the VPC Flow Log"
    Value: !Ref VPCFlowLog

8.確認

実際にログが保存されているか確認します。

まずはS3が作成されていることを確認します。
file

ALBのほうを確認するとログが取得できていることを確認できました。
file

VPCのほうもログが取得できていることを確認できました。
file

9.感想

ファイルを分けて作成する場合は先にS3を作成するということに注意して実践して見てください。
次回はEC2のバックアップ設定を実施していきたいと思います。

Last modified: 2024-07-31

Author