AWS

Terraformデプロイ時のAWSアカウントID先頭ゼロ消失問題と対処法

はじめに

こんにちは、ディーネットの牛山です。

今回は、Terraformトラブルシューティングについて記載します。

概要

TerraformでAssume Roleした際、CloudTrailキーポリシーに無効なプリンシパルを含むエラーによりデプロイ失敗となってしまいました。

次の記事で紹介している形でAssume Roleしていますが、Assume RoleせずAWS環境へデプロイする形ですと、正常にできる状態でした。

TerraformでAssume Role先のAWSアカウントへデプロイしてみた

Assume Roleしないデプロイは次のような形を指します。

terraformを利用した単一EC2インスタンス上でのWordPressの構築

事象確認バージョン

事象を確認しているバージョンは次の通りです。

  • Terraformバージョン
    • 1.9.4
  • Terraformプロバイダーバージョン
    • hashicorp/aws 5.62.0

実際のエラー内容

# terraform apply

?
│ Error: creating CloudTrail Trail (cloudtrail): operation error CloudTrail: CreateTrail, https response error StatusCode: 400, RequestID: ba4d7656-0083-41c5-a29e-4cc607a61500, InsufficientS3BucketPolicyException: Incorrect S3 bucket policy is detected for bucket: cloudtrail-log
│
│   with aws_cloudtrail.aws_cloudtrail_common-cloudtrail,
│   on cloudtrail.tf line 8, in resource "aws_cloudtrail" "aws_cloudtrail_common-cloudtrail":
│    8: resource "aws_cloudtrail" "aws_cloudtrail_common-cloudtrail" {
│
?
?
│ Error: updating KMS Key Policy (3a208023-7716-4821-b540-24ab29cb4781) policy: operation error KMS: PutKeyPolicy, https response error StatusCode: 400, RequestID: d1e7155f-41b9-4d53-9d8a-ca5078a6fa89, MalformedPolicyDocumentException: Policy contains a statement with one or more invalid principals.
│
│   with aws_kms_key_policy.aws_kms_key_policy_common-cloudtrail-kms,
│   on kms.tf line 27, in resource "aws_kms_key_policy" "aws_kms_key_policy_common-cloudtrail-kms":
│   27: resource "aws_kms_key_policy" "aws_kms_key_policy_common-cloudtrail-kms" {
---------------------------------------------------------------------------------------------

発生原因

変数 ${var.aws_account_id} の中身が、012345678912 -> 12345678912となり先頭 0 が消失したことによるものです。

対処

変数 ${var.aws_account_id} の先頭 0 が消えることによるデプロイ失敗なので変数を使用している箇所全部の先頭に 0 を付与し対処します。

イメージとして、「0${var.aws_account_id}」のような不格好な形になってしまいますが応急的な対応とします。

変更後、applyで適用すると、AWSアカウントID箇所の変更差分に着目すると、正しい結果になっていますね。

# terraform apply

  # aws_s3_bucket_policy.aws_s3_bucket_policy_aws_s3_bucket_common-cloudtrail-log will be updated in-place
  ~ resource "aws_s3_bucket_policy" "aws_s3_bucket_policy_aws_s3_bucket_common-cloudtrail-log" {
        id     = "cloudtrail-log"
      ~ policy = jsonencode(
          ~ {
              ~ Statement = [
                  ~ {
                      ~ Condition = {
                          ~ StringEquals = {
                              ~ "AWS:SourceArn" = "arn:aws:cloudtrail:ap-northeast-1:12345678912:trail/cloudtrail" -> "arn:aws:cloudtrail:ap-northeast-1:012345678912:trail/cloudtrail"
                            }
                        }
                        # (5 unchanged attributes hidden)
                    },
                  ~ {
                      ~ Condition = {
                          ~ StringEquals = {
                              ~ "AWS:SourceArn" = "arn:aws:cloudtrail:ap-northeast-1:12345678912:trail/cloudtrail" -> "arn:aws:cloudtrail:ap-northeast-1:012345678912:trail/cloudtrail"
                                # (1 unchanged attribute hidden)
                            }
                        }
                      ~ Resource  = "arn:aws:s3:::cloudtrail-log/AWSLogs/12345678912/*" -> "arn:aws:s3:::cloudtrail-log/AWSLogs/012345678912/*"
                        # (4 unchanged attributes hidden)
                    },
                ]
                # (1 unchanged attribute hidden)
            }
        )
        # (1 unchanged attribute hidden)
    }

まとめ

ベストプラクティスな対処方法が見つからなかった為、応急的にしていますが、同じ様な事象に陥った方の参考になれば幸いです。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA