デプロイのスタックを削除してから AWS CDK コードを再デプロイすると表示される「Already Exists」(既に存在します) というエラーを解決する方法を教えてください。

所要時間2分
0

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) のバケットリソースのサンプルを使用します。デフォルトでは、リソースの removalPolicyRETAIN に設定されています。関連付けられているスタックを削除しても、リソースはアカウントに保持されます。スタックを更新すると、リソースは削除されます。

次に示すのは、カスタム名が付いたリソースの例です。

const s3Bucket = new s3.Bucket(this, 's3-bucket', {
 bucketName: 'DOC-EXAMPLE-BUCKET1',
 versioned: false,
 encryption: s3.BucketEncryption.S3_MANAGED
 });

保持されているリソースを手動で削除する

次の手順を実行します。

  1. AWS マネジメントコンソールにサインインします。
  2. 保持しないリソースのサービスを選択します。
  3. リソースを手動で削除します。たとえば、s3.bucket リソースを削除するには、Amazon S3 バケットを削除します。
  4. AWS CDK を再デプロイするには、次のコマンドを実行します。
    cdk deploy

保持しているリソースの名前を変更する

次の手順を実行します。

  1. 名前を変更するリソースの AWS CDK コードを開きます。
  2. 次のようにして、リソースの名前を、保持しているリソースの名前と競合しない一意の値に更新します。
    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 で一意の名前を生成できるようにします。

次の手順を実行します。

  1. 次のようにして、リソース名を AWS CDK から削除します。
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    注: 前述のサンプルコードでは、BucketName プロパティを削除して AWS CDK で新しい名前を生成できるようにしています。
  2. AWS CDK を再デプロイするには、次のコマンドを実行します。
    cdk deploy

removalPolicy を DESTROY に設定する

スタックを削除する前に、リソースの removalPolicyDESTROY に設定します。

次の手順を実行します。

  1. 保持しないリソースの AWS CDK コードを開きます。

  2. 次のようにして、removalPolicy プロパティを DESTROY に設定します。

    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'EXAMPLE-S3-BUCKET',
     removalPolicy: RemovalPolicy.DESTROY
     });
  3. AWS CloudFormation テンプレートにアクセスするには、次の cdk synth コマンドを実行します。

    cdk synth

    続いて、DeletionPolicyUpdateReplacePolicyDelete に設定されていることを確認します。

AWS公式
AWS公式更新しました 5ヶ月前
コメントはありません

関連するコンテンツ