當我重新部署 AWS Cloud Development Kit (AWS CDK) 程式碼時,我收到「Already Exists」(已存在) 錯誤。
解決方法
AWS CDK 建構庫中的大多數資源預設將 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
});
將保留的資源匯入到新的堆疊
請完成下列步驟:
-
確認您的環境符合使用 cdk importAWS CDK Command Line Interface (CLI) 命令的要求。
**注意:**當您在堆疊中更新或建立其他資源時,無法將資源匯入堆疊。一次匯入作業只能匯入一個或多個資源。
-
暫時從您的程式碼中移除所有其他資源,只保留您想保留的資源。您匯入資源的定義屬性必須與您部署資源的屬性相符。例如,匯入保留的 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 時,請輸入該 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 (刪除)。