如何在 CloudFormation 中設定 AWS::StepFunctions::Activity 資源的單一堆疊擁有權?

上次更新日期:2021 年 9 月 15 日

我想讓 AWS::StepFunctions::Activity 資源僅受 AWS CloudFormation 中的單一堆疊所維護。

簡短描述

您可以維護來自多個堆疊的 AWS::StepFunctions::Activity 資源擁有權。例如,可以使用第一個 CloudFormation 範本建立 StackA,並用第二個範本建立 StackB。

StackA 的範本:

AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackA
Resources:
  MyActivity:
    Type: AWS::StepFunctions::Activity
    Properties:
      Name: myActivity

StackB 的範本:

AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
 MyActivityDuplicate:
 Type: AWS::StepFunctions::Activity
 Properties:
 Name: myActivity
 Tags:
 - Key: Key1
   Value: Val1
....

StackA 與 StackB 兩者都會將資源顯示為 CREATE_COMPLETE。然而,StackA 與 StackB 中參考的 Activity (活動) 資源的屬性為 StackA 的範本中所定義。該操作看似成功,但資源的屬性與 StackA 使用的範本不相符。刪除其中一個堆疊時,活動也會被刪除。在其他堆疊中並未指出資源已不存在。

最佳實務是在使用 CloudFormation 時,確定共享資源的組態是以單一 CloudFormation 堆疊所維護。這樣做可為資源的組態提供單一真實來源。維護共享資源的 CloudFormation 堆疊可提供資源的 Amazon 資源名稱 (ARN) 作為堆疊輸出。如此一來,依存於共享資源的任何其他堆疊都可以參考共享資源,例如 Step Functions 活動。如需有關跨堆疊參考的詳細資訊,請參閱逐步解說:參照另一個 AWS CloudFormation 堆疊中的資源輸出

解決方案

若要解決此問題,請為多重堆疊中所維護的各項 AWS::StepFunctions::Activity 資源完成以下步驟:

1.    在維護 AWS::StepFunctions::Activity 資源的 CloudFormation 堆疊的 AWS Personal Health Dashboard 中識別共享的 ARN。

2.    指定其中一個堆疊作為此後維護活動的單一堆疊。

在所識別的堆疊中完成以下步驟:

1.    如果 CloudFormation 範本中沒有 Outputs (輸出) 區段,則請在範本中新增 Outputs (輸出) 區段

2.    新增輸出至 Outputs (輸出) 區段。您的新輸出必須包含以下內容:

  • 輸出的唯一邏輯 ID。例如:MyActivityArn。可以使用您的唯一邏輯 ID 作為範本中 Outputs (輸出) 區段內輸出的金鑰。
  • 堆疊輸出內的 Value 屬性。Value 屬性使用 Ref 與活動的邏輯 ID 作為其擷取活動 ARN 的引數。
  • 堆疊輸出的 Export 屬性,其值作為具有單一 Name 屬性的物件。Name 屬性的值是一個字串,用於從其他 CloudFormation 堆疊參考此活動的 ARN。例如:
AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackA
Resources:
  MyActivity:
    Type: AWS::StepFunctions::Activity
    Properties:
      Name: myActivity
Outputs:
  MyActivityArn:
    Value: 
      Ref: MyActivity
    Export:
      Name: MyActivityArn

3.    利用前述的變更更新堆疊

4.    驗證參考活動的資源仍在使用正確的 ARN。

針對參考活動資源的每個堆疊,完成下列步驟:

1.    在 CloudFormation 主控台中,從堆疊的 Resources (資源) 標籤識別活動資源的邏輯 ID

2.    在活動的資源宣告中,若 DeletionPolicy 屬性已不存在,請新增該屬性。將值設為 Retain。例如:

AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
  MyActivityDuplicate:
    Type: AWS::StepFunctions::Activity
    DeletionPolicy: Retain
    Properties:
      Name: myActivity
      Tags:
        - Key: Key1
          Value: Val1
...

3.    利用前述的變更更新堆疊

4.    判定在範本中有哪些其他資源參考此活動的 ARN。

5.    針對您在步驟 4 中識別的每項資源,將活動 ARN 的參考取代為 Fn::ImportValue 內部函數。傳遞您先前建立新輸出作為內部函數的引數時所指定的匯出名稱。例如:

AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
  # MyActivityDuplicate:
  #   DeletionPolicy: Retain
  #   Type: AWS::StepFunctions::Activity
  #   Properties:
  #     Name: myActivity
  #     Tags:
  #       - Key: Key1
  #         Value: Val1
  MyStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      StateMachineName: MyStateMachine
      RoleArn: arn:aws:iam::111122223333:role/service-role/StatesExecutionRole-us-east-1
      DefinitionString: 
        Fn::Sub:
          - |
              {
                "Comment": "An example using a Task state.",
                "StartAt": "getGreeting",
                "Version": "1.0",
                "TimeoutSeconds": 300,
                "States":
                {
                  "getGreeting": {
                    "Type": "Task",
                    "Resource": "${ActivityArn}",
                    "End": true
                  }
                }
              }
          - ActivityArn:
              Fn::ImportValue: MyActivityArn

6.    在 Resources (資源) 區段中,將活動的輸入項移除。

7.    利用前述的變更更新堆疊

8.    驗證參考活動的資源仍在使用正確的 ARN。


此文章是否有幫助?


您是否需要帳單或技術支援?