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バケットにログファイルを移動させる事もご検討ください。