跳至內容

如何解決從部署中刪除堆疊後,重新部署 AWS CDK 程式碼時收到的「Already Exists」(已存在) 錯誤?

2 分的閱讀內容
0

當我重新部署 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
 });

將保留的資源匯入到新的堆疊

請完成下列步驟:

  1. 確認您的環境符合使用 cdk importAWS CDK Command Line Interface (CLI) 命令的要求。
    **注意:**當您在堆疊中更新或建立其他資源時,無法將資源匯入堆疊。一次匯入作業只能匯入一個或多個資源。

  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 時,請輸入該 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. 確認 DeletionPolicyUpdateReplacePolicy 是否設定為 Delete (刪除)。