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



目标

我正在尝试从生成的Cloud Formation(CFN(模板中动态地在本地创建状态机。我需要能够做到这一点,而无需部署到AWS帐户或手动创建定义字符串。

问题

如何";构建";将CFN模板转换为可以在本地使用的定义字符串?

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

设置

我正在使用Cloud Development Kit(CDK(编写我的状态机定义,并使用cdk synth生成CFNjson模板。我按照AWS的说明创建了一个本地Docker容器来托管Step Functions(SFN(。我能够使用AWS CLI在本地SFN Docker实例上成功创建、运行等状态机。我还托管了一个DynamoDB Docker实例,并使用sam local start-lambda来托管我的lambdas。这一切都如预期的那样。

为了简化本地测试,我编写了一系列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进行本地测试。

这很难,但我不知道有什么其他方法可以做到,除非你想开始编写解析,将所有JSON内部函数(如Fn:Join(转换为静态字符串。

最新更新