terraformでS3バケットを作成する際、AccessDeniedになることが何度が発生したので原因調査と対策をしてみた。
現象
terraform planでは問題は発生せず、applyを実行するとS3 policyでAccessDeniedとなる。
再度terraform applyを実行すると問題なく完了する。
原因
S3バケットにSSE-KMSを作成して設定する場合、KMS暗号化設定の完了を待たずS3バケットポリシー設定が行われ、暗号化が完了するまえにS3バケットポリシーが適用されるとS3バケットへのアクセスが拒否される可能性がある。
対策
KMS暗号化設定を待ってS3バケットポリシーの設定を行う
実践!
1.事象再現
1-1.terraformコード作成
# vi main.tf
provider "aws" { region = "ap-northeast-1" profile = "testvault" } resource "aws_kms_key" "kms_key" { description = "KMS key" deletion_window_in_days = 10 } resource "aws_s3_bucket" "kms_sample" { bucket = "kms-sample123456891111111" force_destroy = true } resource "aws_s3_bucket_public_access_block" "public_access_block" { bucket = aws_s3_bucket.kms_sample.id block_public_acls = false ignore_public_acls = false block_public_policy = false restrict_public_buckets = false } resource "aws_s3_bucket_server_side_encryption_configuration" "kms_sample_encryption" { bucket = aws_s3_bucket.kms_sample.id rule { apply_server_side_encryption_by_default { sse_algorithm = "aws:kms" kms_master_key_id = aws_kms_key.kms_key.arn } } } resource "aws_s3_bucket_policy" "bucket_policy" { # depends_on = [aws_s3_bucket_server_side_encryption_configuration.kms_sample_encryption] bucket = aws_s3_bucket.kms_sample.bucket policy = jsonencode({ Version = "2012-10-17", Statement = [ { Effect = "Allow", Principal = "*", Action = ["s3:GetObject"], Resource = [ "${aws_s3_bucket.kms_sample.arn}/*" ] }, ] }) }
1-2.コード実行
# terraform apply
1-3.AccessDeniedエラーが表示されることを確認
1-4.いったん削除
# terraform destroy
2.対策実行
2-1.aws_s3_bucket_policyのdepens_onのコメントアウトを解除
resource "aws_s3_bucket_policy" "bucket_policy" { # depends_on = [aws_s3_bucket_server_side_encryption_configuration.kms_sample_encryption] depends_on = [aws_s3_bucket_server_side_encryption_configuration.kms_sample_encryption] ### ここのコメントアウトを解除 bucket = aws_s3_bucket.kms_sample.bucket
2-2.terraform実行
# terraform apply
2-3.エラーが出ないことを確認
感想
失敗できない場面でこんなエラーがでると泣きたくなる、、、