TerraformでCloudFrontのログ用のS3バケット指定時に The parameter Logging Bucket does not refer to a valid S3 bucket. のエラーに遭遇したのでメモっておきます。
事象
Terraformのソースコードで以下のようにバケット名を指定して実行したところ当該エラーになりました。
$ cat main.tf
...
resource "aws_cloudfront_distribution" "main" {
...
logging_config {
bucket = "demo-logs"
...
}
...
$
$ terraform apply
...
aws_cloudfront_distribution.main: Modifying... [id=E28CBxxxxx]
╷
│ Error: error updating CloudFront Distribution (E28CBxxxxx): InvalidArgument: The parameter Logging Bucket does not refer to a valid S3 bucket.
│ status code: 400, request id: 9496a475-xxxxx
│
│ with aws_cloudfront_distribution.main,
│ on main.tf line 4, in resource "aws_cloudfront_distribution" "main":
│ 4: resource "aws_cloudfront_distribution" "main" {
│
╵
ERRO[0030] 1 error occurred:
* exit status 1
$
原因と対応
bucketにはバケット名ではなく、バケット名.s3.ap-northeast-1.amazonaws.comの仮想ホスティング形式かバケット名.s3.amazonaws.comのレガシーグローバルエンドポイント形式を指定します。
AWSマネジメントコンソールからS3を選択すると、デフォルトでは後者のレガシーグローバルエンドポイント形式が指定されます。
Terraformのaws_s3_bucketの属性を利用するときはbucket_regional_domain_nameかbucket_domain_nameを指定します。
# これはOK
output "global-endpoint-style" {
value = aws_s3_bucket.logs.bucket_regional_domain_name
# demo-logs.s3.ap-northeast-1.amazonaws.com
}
# これもOK
output "virtual-hosted-style" {
value = aws_s3_bucket.logs.bucket_domain_name
# demo-logs.s3.amazonaws.com
}
# これはNG
output "bucket-name" {
value = aws_s3_bucket.logs.id
# demo-logs
}
今回は以上です〜ノシ
参考
(`・ω・´)ノ アリガトウゴザイマス!!
CloudFormation creation of CloudFront distribution with logging bucket
リンク
リンク