如何在 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_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。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?