ACL無効化を解除したS3バケットをCloudFormationで作成してみた (CloudFrontアクセスログ出力用)

CloudFrontの標準アクセスログ保存用として利用する S3バケット、デフォルトのACL無効化を解除して CloudFormation で設定してみました。
2023.06.26

CloudFrontの標準アクセスログ保存先としてS3を利用する場合、2023年6月現在 S3バケットのACL設定が必要です。

2023年4月のS3の仕様変更により、新規作成したS3バケットは デフォルトで ACLの無効化設定が反映されるようになった事で、 CloudFormationを利用した S3バケットのACL「LogDeliveryWrite」の反映時、エラーが発生するようになりました。

  • Bucket cannot have ACLs set with ObjectOwnerships BucketOwnerEnforced setting

今回、CloudFormation を利用して、 S3バケット のデフォルトACL無効化を解除し、 CloudFrontの標準アクセスログ保存に必要なACL設定を行う機会がありましたので、紹介させて頂きます。

S3バケット設定

「OwnershipControls」以下のルール「ObjectOwnership: BucketOwnerPreferred」を追加。 2023年3月以前のデフォルト、ACL無効化をキャンセルする指定をしました。

Resources:
  AccesslogBucket:
    Type: AWS::S3::Bucket
    Properties:
      OwnershipControls:
        Rules:
        - ObjectOwnership: BucketOwnerPreferred
      AccessControl: LogDeliveryWrite

設定例

CloudFrontのS3へのログ出力指定、CloudFormationで実施するサンプルです。

AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFront and S3 (access logs for CloudFront)
Resources:
  S3BucketAccesslogs:
    Type: AWS::S3::Bucket
    Properties:
      OwnershipControls:
        Rules:
        - ObjectOwnership: BucketOwnerPreferred
      AccessControl: LogDeliveryWrite
      BucketName: !Sub '${AWS::StackName}-accesslogs-${AWS::Region}-${AWS::AccountId}'
      LifecycleConfiguration:
        Rules:
          - Id: AutoDelete
            Status: Enabled
            ExpirationInDays: 15

  CloudFrontDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
          - Id: CustomOrigin
            DomainName: 'www.example.com'
            CustomOriginConfig:
              HTTPPort: 80
              OriginProtocolPolicy: http-only
        Enabled: true
        Logging:
          IncludeCookies: 'false'
          Bucket: !Sub '${S3BucketAccesslogs}.s3-${AWS::Region}.amazonaws.com'
          Prefix: !Sub '${AWS::StackName}/cloudfront/'
        Comment: !Sub '${AWS::StackName}'
        DefaultCacheBehavior:
          TargetOriginId: CustomOrigin
          ForwardedValues:
            QueryString: false
          DefaultTTL: 300
          MaxTTL: 300
          MinTTL: 300
          ViewerProtocolPolicy: redirect-to-https

まとめ

2023年3月以前に作成された CloudFormation テンプレート を再利用して、CloudFrontアクセスログ用のS3バケットを設置する場合、 今回紹介した設定追加をお試しください。

なお、ACLの設定ミスなどによるリスク軽減のため、CloudFrontのアクセスログ用として ACLを有効化した S3バケットは CloudFrontのログ保存専用として利用する事をおすすめします。

また、CloudFrontのアクセスログファイルに対する、不適切なACL反映を避ける必要がある場合、 下記AWSブログで紹介されている Lambda などを利用して、別のS3バケットにログファイルを移動させる事もご検討ください。

Amazon CloudFront のアクセスログを大規模に分析する