簡體   English   中英

重命名 CloudFormation 模板中的資源

[英]Renaming Resource in CloudFormation Template

您可以重命名 CloudFormation 模板中的資源嗎?

假設我創建了一個堆棧模板來創建單個 lambda 函數。

GetTheFunnyPhraseText:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: ../Lambda/
    Handler: GetFunnyPhrase.handler
    FunctionName: GetFunnyPhrase
    Role: !GetAtt [ ExecuteFunctionGetFunnyPhrase, Arn ]

無論出於何種原因,我想將資源名稱GetTheFunnyPhraseText更改為GetFunnyPhrase 是否有更改名稱的機制?

我嘗試了幾件事...

  • 更改模板中的資源名稱。 看起來這就像刪除GetTheFunnyPhraseText和創建GetFunnyPhrase 這里的問題是資源創建發生在資源刪除之前,導致操作失敗,因為 Lambda 函數存在。
  • 創建模板的兩個草稿。 Draft-1:更改現有資源的函數名稱。 Draft-2:刪除舊資源(從模板中省略它們的定義)並添加新資源。 按順序執行草稿模板:第一個然后第二個。 這有效。 這太惡心了。

對於那些建議不要命名函數的人,理解; 暫時在該反饋中放置一個引腳。

既然CloudFormation 導入可用,在技術上就可以做到這一點,盡管它很乏味。

這是您需要執行的操作:

  1. 更新GetTheFunnyPhraseText的定義以添加DeletionPolicy: "Retain" ,上傳到 CloudFormation
  2. 從模板中完全刪除GetTheFunnyPhraseText 上傳到 CloudFormation。 由於之前添加的DeletionPolicy這實際上不會刪除底層 Lambda
  3. 將您的模板恢復到第 1 步中的先前狀態(將GetTheFunnyPhraseText添加回來)並將邏輯名稱更改為GetFunnyPhrase
  4. 啟動“堆棧操作”>“將資源導入堆棧”工作流程。
  5. 上傳您恢復的模板(使用更改后的邏輯名稱,仍包括DeletionPolicy
  6. 導入過程會注意到新的GetFunnyPhrase邏輯名稱,並詢問您應該將哪個實際FunctionName映射到該名稱。 提供現有的GetFunnyPhrase Lambda 名稱並完成導入。
  7. 最后,您可以重新上傳模板並刪除DeletionPolicy

肯定是一個乏味的過程,但如果您真的不想刪除現有資源,技術上是可行的。

不! 在 Cloud Formation 中無法重命名資源的邏輯名稱。

正如您所測試的那樣,CloudFormation 將其視為移除舊資源並創建新資源。 之所以如此,是因為創建后,CloudFormation 將邏輯資源 ID 綁定到資源的物理 ID。 但是對於 CloudFormation 模板語言,它在解析模板時僅識別邏輯 ID,因此對其的任何更改都意味着與其關聯的資源將被更改。

在某些資源類型中,雖然您可以通過使用特定於資源的某些名稱屬性自己設置物理 ID,例如資源AWS::RDS::DBInstance可能具有屬性DBInstanceIdentifier ,它將是數據庫實例本身的物理名稱.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM