我想更新 AWS CloudFormation 中的 Amazon Elastic Block Store (Amazon EBS) 磁碟區。但是,我不想取代我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。
解決方法
為防止執行個體替換,最佳做法是在 CloudFormation 中更新 EBS 磁碟區時使用 AWS::EC2::Volume 資源類型。
當您在 AWS::EC2::Instance 和 AWS::EC2::Template 資源類型的 BlockDeviceMappings 屬性中指定磁碟區時,就會發生執行個體取代。在這種情況下,您必須新增保留 DeletionPolicy 屬性。
重要:如果您手動修改磁碟區,例如從 gp2 到 gp3,那麼您也必須修改附加到執行個體的磁碟區。確認執行個體是否未處於最佳化或修改狀態。在將磁碟區修改為 gp3 之前,請務必遵守磁碟區修改要求。
為了避免在修改使用 BlockDeviceMappings 屬性指定的磁碟區時取代執行個體,請完成下列步驟。
在目標 AWS::EC2::Instance 範本資源中新增保留 DeletionPolicy 屬性
請完成下列步驟:
-
擷取磁碟區的快照,以建立關鍵工作負載的備份。
-
在具有要更新磁碟區之執行個體的 CloudFormation 堆疊中,將 DeletionPolicy 設為 Retain (保留)。範例:
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Myinstance:
Type: AWS::EC2::Instance
DeletionPolicy: Retain
Properties:
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: gp2
VolumeSize: 10
DeleteOnTermination: true
EbsOptimized: false
ImageId: ami-064ff912f78e3e561
InstanceInitiatedShutdownBehavior: stop
InstanceType: t2.micro
Monitoring: false
-
更新堆疊。
從 CloudFormation 堆疊中移除資源並實施變更
請完成下列步驟:
- 從範本中移除執行個體,以從 CloudFormation 堆疊中移除執行個體,但不刪除底層資源。然後,手動修改 EC2 執行個體。
**注意:**如果您的範本中只有一個資源,那麼您必須建立一個替代資源,例如另一個執行個體。將 EC2 執行個體重新匯入到範本後,您可以從範本中刪除該資源。
- 修改 EBS 磁碟區屬性。
將資源重新匯入到您的 CloudFormation 堆疊中
請完成下列步驟:
-
開啟 CloudFormation console (CloudFormation 主控台)。
-
在導覽窗格中,選擇 Stack (堆疊)。
-
選擇 Stack actions (堆疊動作),然後選擇 Import resources into stack (將資源匯入堆疊)。
-
輸入更新的 CloudFormation 範本。範例:
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Myinstance:
Type: AWS::EC2::Instance
DeletionPolicy: Retain
Properties:
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: gp3
VolumeSize: 100
DeleteOnTermination: true
EbsOptimized: false
ImageId: ami-064ff912f78e3e561
InstanceInitiatedShutdownBehavior: stop
InstanceType: t2.micro
Monitoring: false
**注意:**若要匯入資源,CloudFormation 範本必須使用其現有組態來描述該資源。
-
對於 Identifier (識別碼),請輸入執行個體 ID。
-
選擇 Import resource (匯入資源)。
在 CloudFormation 將狀態更新為 IMPORT_COMPLETE 後,此執行個體即成為堆疊的一部份。
您可能會收到「建立此變更集時發生錯誤。作為匯入作業的一部分,您無法修改或新增 [Outputs]」錯誤訊息。若要解決此問題,請確認最新 CloudFormation 範本的 Outputs (輸出) 區段是否與您的堆疊使用的範本相符。如果不相同,請更新最新的 CloudFormation 範本,以符合堆疊使用範本 Outputs (輸出) 區段中的值。然後,再次更新堆疊。