如何在 CloudFormation 中設定 AWS::StepFunctions::Activity 資源的單一堆疊擁有權?
我想讓 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。
相關內容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前