💨

AWS CDKでdeployするときにエラー対処(メモ)

2024/07/18に公開

同じように悩んでいる人はいるかも知れないので、メモ書き程度に書いておきます。
CDK自体は、誰かが導入。半年前ぐらいまでは順調に稼働していたらしいが、突然動かなくなる・・・汗
(前職は、PdMだったこともあり、IaCはインフラチームに任せていたので、あまり経験がない・・・)

何をした?

$ cdk synth
$ cdk diff
$ cdk deploy --profile hoge

cdkを調整して、diff まで確認して、deployしようとしたら、エラーが発生・・・えっ。

何がおきた?

[stack]:  fail: Bucket named 'hogefoobar' exists, but not in account 
[account_id]. Wrong account?

色々と調べてみました。

S3バケットへの権限周りの話っぽい。
深堀りするために、--verbose オプションで確認。

$ cdk deploy --profile hoge --verbose
...

[13:17:50] Checking for previously published assets
[13:17:50] Retrieved account ID xxxx from disk cache
[13:17:50] Assuming role 'arn:aws:iam::xxxx:role/cdk-hnb659fds-deploy-role-xxxx-ap-northeast-1'.
[13:17:50] Retrieved account ID xxxx from disk cache
[13:17:50] Assuming role 'arn:aws:iam::xxxx:role/cdk-hnb659fds-deploy-role-xxxx-ap-northeast-1'.
[13:17:50] Retrieved account ID xxxx from disk cache
[13:17:50] Assuming role 'arn:aws:iam::xxxx:role/cdk-hnb659fds-file-publishing-role-xxxx-ap-northeast-1'.
[13:17:50] Retrieved account ID xxxx from disk cache
[13:17:50] Assuming role 'arn:aws:iam::xxxx:role/cdk-hnb659fds-file-publishing-role-xxxx-ap-northeast-1'.
[13:17:51] stack:  check: Check s3://hogefoobar/yyyy.zip
[13:17:51] stack:  check: Check s3://hogefoobar/yyyyy.json
[13:17:51] Call failed: listObjectsV2({"Bucket":"hogefoobar","Prefix":"yyyyy.json","MaxKeys":1}) => Access Denied (code=AccessDenied)
[13:17:51] stack:  debug: Access Denied
[13:17:51] Call failed: listObjectsV2({"Bucket":"hogefoobar","Prefix":"yyyy.zip","MaxKeys":1}) => Access Denied (code=AccessDenied)
[13:17:51] stack:  debug: Access Denied
[13:17:51] 2 total assets, 2 still need to be published
[13:17:51] Retrieved account ID xxxx from disk cache

...

やはり、AccessDenied。どうやら、IAMのcdkロールがバケットにアクセス出来ない模様。
IAMのロールで、cdkを検索すれば、何件が表示される中で、deploy や file-publishing のロールをチェック。

deployのIAMロールを確認。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject*",
                "s3:GetBucket*",
                "s3:GetEncryptionConfiguration",
                "s3:List*",
                "s3:DeleteObject*",
                "s3:PutObject*",
                "s3:Abort*"
            ],
            "Resource": [
                "arn:aws:s3:::abcdefg",
                "arn:aws:s3:::abcdefg/*",
            ],
            "Effect": "Allow"
        },

hogefoobarのバケットに許可が入っているはずが、abcdefg バケットになっている。。。汗
そりゃー、バケットにアクセスできない。。。file-publishing も同様になっていた。

どのように対処した?

なぜ、こうなったのかは謎・・・。
とりあえず、IAMのcdkロールで、deploy や file-publishingを下記のように調整。

    "Resource": [
        "arn:aws:s3:::abcdefg",
        "arn:aws:s3:::abcdefg/*",
        "arn:aws:s3:::hogefoobar",
        "arn:aws:s3:::hogefoobar/*"
    ],

deploy できるようになった・・・ほっ。

まとめ

  • 困ったら、verboseオプション。意外と原因調査しやすくなる
  • cdk bootstrap 時に、バケット名を指定していて、何かの拍子でデフォルトになった?
    • 今となっては謎なので、整えていこう

Discussion