【问题标题】:Dynamically create Step Function state machines locally from CFN template从 CFN 模板本地动态创建 Step Function 状态机
【发布时间】:2022-08-23 10:43:09
【问题描述】:

目标

我正在尝试从生成的 Cloud Formation (CFN) 模板在本地动态创建状态机。我需要能够在不部署到 AWS 账户或手动创建定义字符串的情况下这样做。

问题

如何将 CFN 模板“构建”为可在本地使用的定义字符串?

是否有可能实现我最初的目标?如果没有,其他人如何在本地成功测试 SFN?

设置

我正在使用 Cloud Development Kit (CDK) 编写状态机定义并使用 cdk synth 生成 CFN json 模板。我已经按照instructions from AWS here 创建了一个本地 Docker 容器来托管 Step Functions (SFN)。我能够使用 AWS CLI 在我的本地 SFN Docker 实例上成功创建、运行等状态机。我还托管了一个 DynamoDB Docker 实例并使用 sam local start-lambda 来托管我的 lambda。这一切都按预期工作。

为了使本地测试更容易,我编写了一系列 bash 脚本来动态解析 CFN 模板并通过调用 AWS CLI 创建json 输入文件。这在编写没有引用的简单状态机(没有 lambda、来自其他堆栈的资源等)时成功地工作。当我想创建和测试更复杂的状态机时,就会出现问题。我生成的 CFN 模板中的状态机 DefinitionString 类似于:

{\'Fn::Join\': [\'\', [\'{
  \"StartAt\": \"Step1\",
  \"States\": {
        {
          \"StartAt\": \"Step1\",
          \"States\": {
            \"Step1\": {
              \"Next\": \"Step2\",
              \"Retry\": [
                {
                  \"ErrorEquals\": [
                    \"Lambda.ServiceException\",
                    \"Lambda.AWSLambdaException\",
                    \"Lambda.SdkClientException\"
                  ],
                  \"IntervalSeconds\": 2,
                  \"MaxAttempts\": 6,
                  \"BackoffRate\": 2
                }
              ],
              \"Type\": \"Task\",
              \"Resource\": \"arn:\', {\'Ref\': \'AWS::Partition\'}, \':states:::lambda:invoke\",
              \"Parameters\": {
                \"FunctionName\": \"\', {\'Fn::ImportValue\': \'OtherStackE9E150CFArn77689D69\'}, \'\",
                \"Payload.$\": \"$\"
              }
            },
            \"Step2\": {
              \"Next\": \"Step3\",
              \"Retry\": [
                {
                  \"ErrorEquals\": [
                    \"Lambda.ServiceException\",
                    \"Lambda.AWSLambdaException\",
                    \"Lambda.SdkClientException\"
                  ],
                  \"IntervalSeconds\": 2,
                  \"MaxAttempts\": 6,
                  \"BackoffRate\": 2
                }
              ],
              \"Type\": \"Task\",
              \"Resource\": \"arn:\', {\'Ref\': \'AWS::Partition\'}, \':states:::lambda:invoke\",
              \"Parameters\": {
                \"FunctionName\": \"\', {\'Fn::ImportValue\': \'OtherStackE9E150CFArn77689D69\'}, \'\",
                \"Payload.$\": \"$\"
              }
            }
          }
        }
      ]
  },
  \"TimeoutSeconds\": 10800
}\']]}

问题

AWS CLI 不支持json 对象,不支持\'Fn::Join\' 等CFN 函数,并且定义字符串中不允许引用({\'Ref\': \'AWS::Partition\'})。

    标签: amazon-cloudformation aws-cli serverless aws-cdk aws-step-functions


    【解决方案1】:

    这里不会有任何魔法来完成这项工作。 CDK 呈现 CloudFormation 并且 CloudFormation 不是真正的 ASL,因为它包含对其他资源的引用,正如您所指出的。

    您可以采取的一个方向是将 SFN 部署到沙箱堆栈,并允许 CFN 取消引用所有值并在服务中生成 SFN ASL,然后重新提取该 ASL 以进行本地测试。

    这很 hacky,但我不知道有任何其他方法可以做到这一点,除非您想开始编写将所有 JSON 内在函数(如 Fn:Join)转换为静态字符串的解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-26
      • 2022-09-23
      • 2021-05-15
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      相关资源
      最近更新 更多