目标
我正在尝试从生成的云形成(CFN)模板本地动态地创建状态机。我需要能够这样做,而无需部署到AWS帐户或手动创建定义字符串。
问题
如何将CFN模板“构建”到可以在本地使用的定义字符串?
是否有可能达到我最初的目标?如果没有,其他人如何在本地成功测试SFN?
设置
我正在使用Cloud (CDK)编写状态机定义,并使用cdk synth生成CFN json模板。我遵循来自AWS的指示创建了一个本地Docker容器来承载Step函数(SFN)。我能够使用AWS在本地SFN实例上成功地创建、运行等状态机。我还托管了一个DynamoDB Docker实例,并使用sam local start-lambda托管我的lambdas。这一切都如预期的那样起作用。
为了简化本地测试,我编写了一系列bash脚本,通过调用AWS动态解析CFN模板并创建json输入文件。在编写没有引用的简单状态机(没有lambdas、来自其他堆栈的资源等)时,这是非常成功的。当我想要创建和测试一个更复杂的状态机时,问题就出现了。生成的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不支持json对象,不支持CFN函数(如'Fn::Join' ),定义字符串中不允许引用({'Ref': 'AWS::Partition'})。
发布于 2022-08-23 02:43:09
这里不可能有任何魔法来完成这件事。CDK呈现CloudFormation,而CloudFormation并不是真正的ASL,因为它包含对其他资源的引用,正如您所指出的。
您可以选择的一个方向是将SFN部署到沙箱堆栈,并允许CFN取消引用所有值并在服务中生成SFN,然后重新提取该ASL以进行本地测试。
这很麻烦,但我不知道其他方法,除非您想要开始编写将所有JSON本质(如Fn:Join)转换为静态字符串的解析。
https://stackoverflow.com/questions/73367470
复制相似问题