【发布时间】: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