あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

terraformでS3バケットを作成する際AccessDenyになる件

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.エラーが出ないことを確認




感想

失敗できない場面でこんなエラーがでると泣きたくなる、、、