こんにちは、広野です。
私は Amazon CloudFront のアクセスログを Amazon S3 に保管するように、AWS CloudFormation でこれまで何度もプロビジョニングしてきたのですが、この度、これまで使っていたテンプレートがエラーになってしまう事態がありました。
原因は Amazon S3 の設定にありました。
これまで使っていたテンプレート (抜粋)
- アクセスログ保管用 Amazon S3 バケットのテンプレート抜粋
S3BucketLogs: Type: AWS::S3::Bucket Properties: BucketName: examplebucket-logs PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true
元々、パブリックアクセスブロックの部分だけ厳格に指定して、それ以外はデフォルトでした。※要件によります
これが、以下の AWS の仕様変更 (2023年4月) に引っ掛かってしまったようで。
Amazon S3 のパブリックアクセスブロックについては以前から意識してはいたのですが、ACL は基本使わないのでノーマークでした。私のテンプレートで Amazon S3 バケットをプロビジョニングする際、ACL がデフォルトで有効だったものが仕様変更により無効になってしまいました。
Amazon CloudFront のアクセスログ保管先 S3 バケットは ACL が有効 でないといけないらしいので(全く気にしてませんでした)、私のテンプレートが機能しなくなってしまいました。
修正したテンプレート (抜粋)
ということで、テンプレート内で明示的に ACL を有効にする設定にしました。
S3BucketLogs: Type: AWS::S3::Bucket Properties: BucketName: examplebucket-logs OwnershipControls: Rules: - ObjectOwnership: BucketOwnerPreferred PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true
OwnershipControls: の部分を追加しています。これで ACL が有効になり、テンプレートもパスすることができました。
記述については以下の公式ドキュメントにご丁寧に載っていました。
まとめ
いかがでしたでしょうか?
これまで動いていた AWS CloudFormation テンプレートが突然エラーになってしまうので驚きました。ですが今後も AWS 側の仕様変更は発生しますので、ちゃんと追従していかないとな、と反省した出来事でした。また、デフォルト設定に依存するのも良くないと思いました。
本記事が皆様のお役に立てれば幸いです。