【初級編】AWS CDKを使用してデプロイする際にハマったポイント

記事タイトルとURLをコピーする

こんにちは、今期から技術4課に配属になりました古川です。 最近はコロナウィルスの影響で、ジムに行くことが出来ず悶々としています。

本記事では、AWS Cloud Development Kit(以下、CDK)を使用してCDKアプリをデプロイする際にハマったポイントを紹介します。

AWS CDKとは、AWS上のインフラ構成をプログラミング⾔語で定義し、CloudFormation を通じてデプロイするためのフレームワークです。

前提

CDKスタックは既に定義済みで、AWS環境にCDKアプリをデプロイする準備ができている状態とします。

デプロイ

「cdk list」コマンドで、「cdkworkshop」が定義されていることを確認できます。

$ cdk list
cdkworkshop

初めてデプロイする際は「cdk bootstrap」コマンドにより、CloudFormationで利⽤するデプロイ⽤のS3 バケットを作成します。※このバケットはリージョン単位で必要になります

$ cdk bootstrap
 ⏳  Bootstrapping environment aws://************/<region>...
CDKToolkit: creating CloudFormation changeset...
 0/2 | 17:02:04 | CREATE_IN_PROGRESS   | AWS::S3::Bucket | StagingBucket
 0/2 | 17:02:06 | CREATE_IN_PROGRESS   | AWS::S3::Bucket | StagingBucket Resource creation Initiated
 1/2 | 17:02:27 | CREATE_COMPLETE      | AWS::S3::Bucket | StagingBucket
 2/2 | 17:02:29 | CREATE_COMPLETE      | AWS::CloudFormation::Stack | CDKToolkit
 ✅  Environment aws://************/<region>... bootstrapped.

マネージドコンソールからS3バケットを確認すると、指定したリージョンに「cdktoolkit-stagingbucket-*********」という名前のバケットが作成されています。

「cdk deploy」コマンドにより、スタックで定義されているCDKアプリをデプロイします。

$ cdk deploy

3. ハマった箇所

構築したCDKアプリを修正するために、デプロイしたCDKアプリを削除する必要がありました。しかし、構築した環境の設定を一部マネージドコンソール上で変更してしまったがため、「cdk destroy」コマンドが使えませんでした。

そこで、「cdk bootstrap」で作成したS3バケットと「cdk deploy」で作成したS3バケットを、マネージドコンソール上で削除し、再度「cdk bootstrap」コマンドによりCloudFormationで利⽤するデプロイ⽤のS3バケットを作成しようと試みました。

$ cdk bootstrap
 ⏳  Bootstrapping environment aws://************/<region>...
CDKToolkit: creating CloudFormation changeset...
 ✅  Environment aws://************/<region>... bootstrapped (no changes).

CLI上では、削除したはずのCloudFormation⽤S3バケットが存在しています。 再度、「cdk deploy」コマンドにより、CDKアプリをデプロイすると以下のようなエラーが表示されました。

cdkworkshop failed: NoSuchBucket: The specified bucket does not exist

エラー文を見ると、やはり物理的にはCloudFormationイ⽤S3バケットは存在していないようです。

解決方法

解決方法は2つ考えられます。

1. cdk.jsonに追記

cdk.jsonに「"toolkitStackName": "任意の名前"」を追記します。

{
  "app": "python3 app.py",
  // 下記一行を追記します。
  "toolkitStackName": "foo"
}

再度、「cdk bootstrap」コマンドを実行すると、新たにCloudFormation⽤S3バケットが作成されました。

Toolkit stack: foo
 ⏳  Bootstrapping environment aws://249796448489/us-west-2...
foo: creating CloudFormation changeset...
 0/2 | 19:08:20 | CREATE_IN_PROGRESS   | AWS::S3::Bucket | StagingBucket
 0/2 | 19:08:21 | CREATE_IN_PROGRESS   | AWS::S3::Bucket | StagingBucket Resource creation Initiated
 1/2 | 19:08:43 | CREATE_COMPLETE      | AWS::S3::Bucket | StagingBucket
 2/2 | 19:08:44 | CREATE_COMPLETE      | AWS::CloudFormation::Stack | foo
 ✅  Environment aws://249796448489/us-west-2 bootstrapped.

2. 別のリージョンにデプロイする。

aws configureにて設定したリージョンとは別のリージョンに、cdkアプリをデプロイします。 「export」コマンドにて、aws configureの環境変数を一時的に変更します。

$ export AWS_DEFAULT_REGION=<region>

この解決方法は、いわば応急処置のようなもので、上記エラーの根本的な解決にはなっていないので推奨はしません。

まとめ

今回のエラーは、CloudFormation⽤S3バケットを削除した場合、同じスタック名のCloudFormation⽤S3バケットは作成できないことが起因していました。

また、cdk.jsonにて「toolkitStackName」を設定していない場合、デフォルトで「CDKToolkit」というスタック名のCloudFormation⽤S3バケットが作成されることも留意しておいた方が良いです。

一度作成したCloudFormation⽤S3バケットは、なるべく削除しないよう心がけましょう