CloudFormation问题:创建Step Functions时无法导入跨栈导出的LambdaA
解决CloudFormation中Step Functions引用跨栈Lambda的问题
我来帮你梳理下怎么搞定这个跨栈引用Lambda的问题。首先,咱们得确保两个环节都配置对:另一个栈的Lambda导出,以及当前Step Functions栈的导入和使用。
第一步:确认Lambda所在栈的导出配置
首先得保证你那个已经创建好的Lambda栈,确实导出了Lambda的ARN(而不是函数名,这样后续用起来更省心)。导出的配置大概是这样的:
Outputs: LambdaAArnOutput: Value: !GetAtt LambdaA.Arn Export: Name: LambdaA # 这就是你说的导出名称,要和后续导入的名字完全一致
第二步:在Step Functions栈里正确导入并引用
接下来在你的Step Functions CloudFormation代码里,要通过!ImportValue拿到这个导出的ARN,然后用Fn::Sub把它注入到状态机的定义字符串里。这里要注意不能直接在Sub的字符串里写!ImportValue,得用Sub的Variables参数来传递导入的值,示例代码如下:
ABCStateMachine: Type: 'AWS::StepFunctions::StateMachine' Properties: StateMachineName: 'AbcStateMachine_1.0' RoleArn: !GetAtt AbcStateMachineRole.Arn DefinitionString: Fn::Sub: | { "Comment": "调用跨栈Lambda的状态机", "StartAt": "CallLambdaA", "States": { "CallLambdaA": { "Type": "Task", "Resource": "${LambdaAArn}", # 这里用变量占位符 "End": true } } } Variables: LambdaAArn: !ImportValue LambdaA # 把导入的ARN赋值给变量
第三步:给Step Functions角色加上Lambda调用权限
别忘了给你的AbcStateMachineRole添加调用这个Lambda的权限,不然状态机会因为权限不足报错。配置大概是这样:
AbcStateMachineRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: states.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: InvokeCrossStackLambda PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: lambda:InvokeFunction Resource: !ImportValue LambdaA # 直接引用导入的Lambda ARN
常见问题排查
- 跨栈导入导出只能在同一个AWS区域进行,别搞跨区域了哦。
- 导出和导入的名称是大小写敏感的,要完全匹配,比如别把
LambdaA写成lambdaa。 - 如果之前导出的是Lambda的函数名而不是ARN,那你需要在当前栈里拼接ARN,比如
arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${LambdaAName},但还是建议直接导出ARN更稳妥。
内容的提问来源于stack exchange,提问作者AgentX
相关产品推荐
相关产品推荐

