AWS Cloud Development Kit (AWS CDK) コードを再デプロイするときに表示される「Already Exists」(既に存在します) というエラーを解決しようと思います。
解決策
AWS CDK Construct Library にあるステートフルリソースのほとんどでは、デフォルトの RETAIN に設定されている removalPolicy プロパティを受け付けます。詳細については、AWS CDK ウェブサイトの「enum RemovalPolicy」を参照してください。
removalPolicy プロパティをリソースに設定しないと、そのリソースは孤立します。スタックを削除し、DELETE_COMPLETE 状態に移行してからも、AWS アカウントには保持されます。カスタム名をリソースに指定している場合でも、同じコードを再デプロイすると、「Already Exists」(既に存在します)というエラーが表示されます。
注: 後述の手順では、AWS CDK で s3.Bucket クラスに関連付けられている Amazon Simple Storage Service (Amazon S3) のバケットリソースのサンプルを使用します。デフォルトでは、リソースの removalPolicy は RETAIN に設定されています。関連付けられているスタックを削除しても、リソースはアカウントに保持されます。スタックを更新すると、リソースは削除されます。
次に示すのは、カスタム名が付いたリソースの例です。
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'DOC-EXAMPLE-BUCKET1',
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
保持されているリソースを手動で削除する
次の手順を実行します。
- AWS マネジメントコンソールにサインインします。
- 保持しないリソースのサービスを選択します。
- リソースを手動で削除します。たとえば、s3.bucket リソースを削除するには、Amazon S3 バケットを削除します。
- AWS CDK を再デプロイするには、次のコマンドを実行します。
cdk deploy
保持しているリソースの名前を変更する
次の手順を実行します。
- 名前を変更するリソースの AWS CDK コードを開きます。
- 次のようにして、リソースの名前を、保持しているリソースの名前と競合しない一意の値に更新します。
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'EXAMPLE-NEW-NAME-S3-BUCKET',
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
注: 前述の例では、bucketName パラメーターを使用して S3.bucket リソースの名前を変更しています。
リソース名を削除する
リソース名を削除して、AWS CDK で一意の名前を生成できるようにします。
次の手順を実行します。
- 次のようにして、リソース名を AWS CDK から削除します。
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
注: 前述のサンプルコードでは、BucketName プロパティを削除して AWS CDK で新しい名前を生成できるようにしています。
- AWS CDK を再デプロイするには、次のコマンドを実行します。
cdk deploy
removalPolicy を DESTROY に設定する
スタックを削除する前に、リソースの removalPolicy を DESTROY に設定します。
次の手順を実行します。
-
保持しないリソースの AWS CDK コードを開きます。
-
次のようにして、removalPolicy プロパティを DESTROY に設定します。
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'EXAMPLE-S3-BUCKET',
removalPolicy: RemovalPolicy.DESTROY
});
-
AWS CloudFormation テンプレートにアクセスするには、次の cdk synth コマンドを実行します。
cdk synth
続いて、DeletionPolicy と UpdateReplacePolicy が Delete に設定されていることを確認します。