aws-cloudformation - 从 CFN 模板在本地动态创建 Step Function 状态机

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

目标

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

问题

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

我原来的目标有可能实现吗?如果没有,其他人如何在本地成功测试 SFN?

设置

我正在使用云开发套件 (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'})。

最佳答案

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

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

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

关于aws-cloudformation - 从 CFN 模板在本地动态创建 Step Function 状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73367470/

相关文章:

amazon-web-services - 使用云形成脚本将卷附加到 Windows ec2 实例

amazon-web-services - 获取 Aurora IP 并将其在 UserData 中用于 AWS CloudFormation 中的另一个实例

amazon-web-services - 从控制台或 CLI 恢复 RDS 快照比 cloudformation 快得多吗?

ubuntu - ubuntu 服务器上的 aws cli vs amazon linux

azure - 具有新上下文/请求的持久 Azure 函数扇出

python - 使用 Boto 返回 CloudFormation 模板的输出?

amazon-web-services - 如何通过java sdk执行 "cloudformation package"命令?

amazon-web-services - 复制到大目录时,AWS S3 Sync非常慢

amazon-web-services - 如何自动化我的无服务器 Web 应用程序的端到端测试?

amazon-web-services - 使用 aws 角色执行无服务器部署