如何在 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_COPLETE。但是,StackA 和 StackB 中引用的 Activity 资源具有在模板中为 StackA 定义的属性。此操作看起来成功,但资源的属性与 StackA 使用的模板不匹配。删除其中任一堆栈时,Activity 资源也会被删除。其他堆栈中没有任何迹象表明该资源不再存在。
使用 CloudFormation 时,最佳实践是确保共享资源的配置在单个 CloudFormation 堆栈中维护。这样做就为资源的配置提供了单一的事实来源。维护共享资源的 CloudFormation 堆栈可以将资源的 Amazon Resource Name (ARN) 作为堆栈输出提供。然后,依赖于共享资源的任何其他堆栈都可以引用共享资源,例如 Step Functions 活动。有关跨堆栈引用的更多信息,请参阅演练:引用另一个 AWS CloudFormation 堆栈中的资源输出。
解决方法
要解决此问题,请为在多个堆栈中维护的每个 AWS::StepFunctions::Activity 资源完成以下步骤:
1. 对于维护 AWS::StepFunctions::Activity 资源的 CloudFormation 堆栈,确定在其 AWS Personal Health Dashboard 中共享的 ARN。
2. 将其中一个堆栈指定为单个堆栈以保持活动继续进行。
在识别的堆栈中完成以下步骤:
1. 如果您的 CloudFormation 模板中没有输出部分,则在模板中添加“输出”部分。
2. 将新输出添加到输出部分。您的新输出必须包括以下内容:
-
输出的唯一逻辑 ID。例如:MyActivityArn。在模板的输出部分中,您可以使用唯一的逻辑 ID 作为输出的键。
-
堆栈输出中的 Value 属性。Value 属性使用具有活动逻辑 ID 的 Ref 作为其参数来检索活动的 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 控制台中,在堆栈的资源选项卡上确定活动资源的逻辑 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. 在资源部分中删除活动的对应条目。
7. 使用上述更改更新堆栈。
8. 验证引用活动的资源是否仍在使用正确的 ARN。

相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 5 个月前
- AWS 官方已更新 1 年前