AWS CDKでbootstrapバケットの名前を指定した場合に気をつけたいポイント

2021.11.01

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

最近AWS CDKを触っているのですが、cdk bootstrap時にバケットの名前を明示的に指定したらcdk deploy時にエラーが出て困っていました。

今回は、私が犯したミスと対応方法についてまとめておきたいと思います。

背景と前提

AWS CDKのCDK Pipelinesを試したいと思い、以下のエントリなどを参考に進めていました。

このため、cdk.jsonには以下のフラグを設定しています。

cdk.json

{
  // ...
  "context": {
    "@aws-cdk/core:newStyleStackSynthesis": true
  }
}

逆に言えば、newStyleStackSynthesisのフラグ設定をしていないケースでは、この事象は発生しませんでした。

失敗したこと

まず、cdk bootstrap時には以下のようにバケットの名前を明示的に指定して作成を行いました。

$ cdk bootstrap --bootstrap-bucket-name foobar-cdk-bucket

この状態でデプロイを行おうとすると、以下のようなエラーが発生しました。

$ cdk deploy
FooBarDeployStack: deploying...
[0%] start: Publishing ee3a44bac4a500ce39e31246e00a9d178f740f16be8eb03d3fbe641e06319b02:current_account-current_region
[100%] fail: No bucket named 'cdk-hnb659fds-assets-123456789012-ap-northeast-1'. Is account 123456789012 bootstrapped?

 ❌  FooBarDeployStack failed: Error: Failed to publish one or more assets. See the error messages above for more information.
    at Object.publishAssets (/home/foobar-dev/.config/yarn/global/node_modules/aws-cdk/lib/util/asset-publishing.ts:25:11)
    at CloudFormationDeployments.publishStackAssets (/home/foobar-dev/.config/yarn/global/node_modules/aws-cdk/lib/api/cloudformation-deployments.ts:297:7)
    at CloudFormationDeployments.deployStack (/home/foobar-dev/.config/yarn/global/node_modules/aws-cdk/lib/api/cloudformation-deployments.ts:195:5)
    at CdkToolkit.deploy (/home/foobar-dev/.config/yarn/global/node_modules/aws-cdk/lib/cdk-toolkit.ts:189:24)
    at initCommandLine (/home/foobar-dev/.config/yarn/global/node_modules/aws-cdk/bin/cdk.ts:225:9)
Failed to publish one or more assets. See the error messages above for more information.

bootstrapバケット名がfoobar-cdk-bucketではなく、cdk-hnb659fds-assets-123456789012-ap-northeast-1であると認識されており、そのようなバケットは無いと言われていますね。

対応方法

上記のエラーのとおり、bootstrap時に指定したバケットがうまく認識されていないように見えます。

この対応として、以下のようにStackの作成時のオプションとしてsynthesizerを指定します。このときにfileAssetsBucketNameを明示的に指定することでエラーが発生しなくなりました。

bin/foo-bar-deploy.ts

#!/usr/bin/env node
import "source-map-support/register";
import * as cdk from "@aws-cdk/core";
import { FooBarDeployStack } from "../lib/foo-bar-deploy-stack";
import { DefaultStackSynthesizer } from "@aws-cdk/core";

const app = new cdk.App();
const fileAssetsBucketName = app.node.tryGetContext("fileAssetsBucketName");
const stack = new FooBarDeployStack(app, "FooBarDeployStack", {
  synthesizer: new DefaultStackSynthesizer({
    fileAssetsBucketName: fileAssetsBucketName,
  }),
});

これは下記のGitHubのIssueの中でも回答されていました。

公式ドキュメント内にも、fileAssetsBucketNameの設定方法について記載されており、この通りに設定すれば問題なさそうです。

まとめ

以上、AWS CDKでbootstrapバケットの名前を指定した場合に気をつけたいポイントでした。

同一アカウト上でいくつかのbootstrap用S3バケットを使い分けたいと思っていたので、今後はこの設定に注意して利用していきたいと思います。

どなたかのお役に立てば幸いです。それでは!