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
});
保持されているリソースを新しいスタックにする
次の手順を実行します。
-
使用する環境が AWS CDK コマンドラインインターフェイス (CLI) コマンド cdk import を使用するための要件を満たしていることを確認します。
注: スタック内の他のリソースを更新または作成する際、そのスタックにリソースをインポートすることはできません。1 回のインポート操作では、単一または複数のリソースをインポートできます。
-
保持するリソース以外の全てのリソースをコードから一時的に削除します。インポートするリソースの定義済みプロパティは、デプロイしたリソースのプロパティと一致する必要があります。たとえば、保持されている 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 バケット名に置き換えます。
-
次の cdk import コマンドを実行すると、リソースのインポートが開始します。
cdk import
-
CDK からリソース ID の入力を求められた場合は、入力します。この例では、S3 バケットの名前を入力します。
-
コードからリソースを再導入し、次の deploy コマンドを実行します。
cdk deploy
保持されているリソースを手動で削除する
次の手順を実行します。
- AWS マネジメントコンソールにサインインします。
- 保持しないリソースのサービスを選択します。
- リソースを手動で削除します。たとえば、s3.bucket リソースを削除するには、Amazon S3 バケットを削除します。
- AWS CDK を再デプロイするには、次の deploy コマンドを実行します。
cdk deploy
保持しているリソースの名前を変更する
次の手順を実行します。
- リソースの AWS CDK コードを開きます。
- リソースの名前を、保持しているリソースの名前と競合しない一意の値に更新します。
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 が一意の名前を生成できるようにするには、次の手順を実行します。
- AWS CDK からリソース名を削除するには、次のコードを実行します。
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
versioned: false,
encryption: s3.BucketEncryption.S3_MANAGED
});
注: 上記のサンプルコードでは、bucketName プロパティを削除することで、AWS CDK で新しい名前を生成できるようにしています。
- AWS CDK を再デプロイするには、次の deploy コマンドを実行します。
cdk deploy
removalPolicy プロパティを DESTROY に設定する
次の手順を実行します。
-
リソースの AWS CDK コードを開きます。
-
removalPolicy プロパティを DESTROY に設定します。
const s3Bucket = new s3.Bucket(this, 's3-bucket', {
bucketName: 'amzn-s3-demo-bucket',
removalPolicy: RemovalPolicy.DESTROY
});
-
AWS CloudFormation テンプレートにアクセスするには、次の cdk synth コマンドを実行します。
cdk synth
-
DeletionPolicy と UpdateReplacePolicy が Delete に設定されていることを確認します。