スキップしてコンテンツを表示

デプロイのスタックを削除した後、AWS CDK コードを再デプロイする際に「Already Exists (既に存在します)」というエラーが発生する場合の解決方法を教えてください。

所要時間2分
0

AWS Cloud Development Kit (AWS CDK) コードを再デプロイする際、「Already Exists」というエラーが発生します。

解決策

AWS CDK Construct ライブラリのほとんどのリソースでは、デフォルトで removalPolicy プロパティは RETAIN 状態に設定されます。リソースで removalPolicy プロパティが RETAIN に設定されていない場合、そのリソースは孤立します。スタックを削除し、DELETE_COMPLETE 状態に移行した後も、孤立リソースは AWS アカウント内に残ります。

スタックを更新すると、AWS CDK はそのリソースを削除します。リソースにカスタム名を指定した場合、同じコードを再デプロイすると「Already Exists」エラーが発生する可能性があります。

注: 次の手順では、AWS CDK で s3.Bucket クラスに関連付けられている Amazon Simple Storage Service (Amazon S3) のバケットリソース例を使用します。

カスタム名付きリソースの例:

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

保持されているリソースを新しいスタックにする

次の手順を実行します。

  1. 使用する環境が AWS CDK コマンドラインインターフェイス (CLI) コマンド cdk import を使用するための要件を満たしていることを確認します。
    注: スタック内の他のリソースを更新または作成する際、そのスタックにリソースをインポートすることはできません。1 回のインポート操作では、単一または複数のリソースをインポートできます。

  2. 保持するリソース以外の全てのリソースをコードから一時的に削除します。インポートするリソースの定義済みプロパティは、デプロイしたリソースのプロパティと一致する必要があります。たとえば、保持されている S3 バケットリソース s3-bucket をインポートします。
    注: リソースをインポートするには、そのリソースに削除ポリシーを設定する必要があります。
    ポリシーの例:

    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     removalPolicy: RemovalPolicy.RETAIN
     });
    
    //const cfnFunction = new lambda.CfnFunction(this, 'MyCfnFunction', {
    //  code: {
    //  ...
    //    s3Bucket: s3Bucket.bucketArn
    //  },
    //  role: 'role',

    注: s3-bucket は、実際の S3 バケット名に置き換えます。

  3. 次の cdk import コマンドを実行すると、リソースのインポートが開始します。

    cdk import
  4. CDK からリソース ID の入力を求められた場合は、入力します。この例では、S3 バケットの名前を入力します。

  5. コードからリソースを再導入し、次の deploy コマンドを実行します。

    cdk deploy

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

次の手順を実行します。

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

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

次の手順を実行します。

  1. リソースの AWS CDK コードを開きます。
  2. リソースの名前を、保持しているリソースの名前と競合しない一意の値に更新します。
    const s3Bucket = new s3.Bucket(this, 's3-bucket', {
     bucketName: 'amzn-s3-demo-bucket',
     versioned: false,
     encryption: s3.BucketEncryption.S3_MANAGED
     });
    注: 上記の例では、bucketName パラメータを使用して S3.bucket リソースの名前を変更しています。amzn-s3-demo-bucket は、実際の S3 バケット名に置き換えます。

リソース名を削除する

リソース名を削除して 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 を再デプロイするには、次の deploy コマンドを実行します。
    cdk deploy

removalPolicy プロパティを DESTROY に設定する

次の手順を実行します。

  1. リソースの AWS CDK コードを開きます。

  2. removalPolicy プロパティを DESTROY に設定します。

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

    cdk synth
  4. DeletionPolicyUpdateReplacePolicyDelete に設定されていることを確認します。

コメントはありません