AWS Cloud Development Kit (AWS CDK) コードを再デプロイするときに表示される「Already Exists」(既に存在します) というエラーを解決したいのですが。
簡単な説明
AWS CDK コンストラクトライブラリのほとんどのステートフルリソースは、デフォルトとして RETAIN を指定した removalPolicy プロパティを受け入れます。removalPolicy が設定されていないリソースは孤立リソースとなり、スタックが削除された後もアカウントに残ります。これは、スタックが DELETE\ _COMPLETE 状態に移行したときに発生します。対応するスタックの更新中に、類似リソースのリソース定義がコードから削除されても、動作は同じままです。保持されているリソースにカスタム名が付けられている場合、同じコードを再デプロイすると「Already Exists」(既に存在します) というエラーが表示されます。
このエラーを解決するには、ユースケースに応じて以下のアクションを実行してください。
- 意図せずにリソースを保持してしまった場合は、リソースを手動で削除してください。
- リソースを意図的に保持する場合は、AWS CDK コード内のリソースの名前を一意の値に変更してください。
- リソースを意図的に保持するもう 1 つの方法は、AWS CDK コードからリソース名を削除して AWS CDK に新しい名前を自動生成させることです。
- スタックを削除する前に、removalPolicy がリソースから DESTROY に設定されていることを確認してください。
解決策
**注記:**以下のステップでは、AWS CDK の [S3.bucket] クラスで表される Amazon Simple Storage Service (Amazon S3) バケットリソースの例を使用します。AWS CDK 内のこのソースの removalPolicy は、デフォルトで RETAIN に設定されています。このリソースは、それぞれのスタックが削除されるか、スタックの更新中にリソースが削除されても、アカウントに保持されます。
例:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: ‘DOC-EXAMPLE-BUCKET1’,
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
保持しているリソースを手動で削除する
1. AWS マネジメントコンソールにサインインし、保持したくないリソースの対応するサービスにアクセスします。
2. 保持したくないリソースは手動で削除します。
**注記:**この例では、Amazon S3 バケットを削除して s3.bucket リソースを削除します。
3. AWS CDK コードを再デプロイします。
cdk deploy
保持しているリソースの名前を変更
1. 名前を変更したいリソースの AWS CDK コードにアクセスします。
2. リソースの名前を、保持しているリソースの名前と競合しない一意の値に更新します。
**注記:**この例では、bucketName パラメータを更新して S3.bucket リソースの名前を変更します。
例:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: ‘EXAMPLE-NEW-NAME-S3-BUCKET’,
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
AWS CDK が固有の名前を自動生成できるようにするには、リソース名を削除してください
1. AWS CDK からリソース名を削除します。
**注記:**この例では、bucketName プロパティを削除して AWS CDK が新しい名前を自動生成できるようにしています。
例:
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
2. AWS CDK コードを再デプロイします。
cdk deploy
removalPolicy を DESTROY に設定する
1. 保持したくないリソースの AWS CDK コードにアクセスします。
2. removalPolicy プロパティを DESTROY に設定します。
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: ‘EXAMPLE-S3-BUCKET’,
removalPolicy: RemovalPolicy.DESTROY
});
3. cdk synth を実行して AWS CloudFormation テンプレートにアクセスし、DeletionPolicyと UpdateReplacePolicy が Delete に設定されていることを確認します。
cdk synth