如何在CloudFormation栈中将Step Function的ARN传递给其他函数
CloudFormation中Step Function ARN传递与循环依赖问题解决
问题说明
在CloudFormation栈中创建了Step Function,需要让栈内的另一个函数在部署完成后调用它,计划将Step Function的ARN作为环境变量传递给目标函数,但遇到了循环依赖问题,当前代码中全局函数配置里的STEP_FUNCTION错误引用了Research函数的ARN,而非Step Function本身的ARN。
解决方案
- 修正ARN引用目标:将环境变量
STEP_FUNCTION指向Step Function状态机的ARN,而非Research函数的ARN - 明确依赖关系:调整目标函数的
DependsOn属性,确保它在Step Function部署完成后再创建,避免循环依赖 - 修正Step Function定义中的函数ARN引用:原代码中状态机定义里的
${VideoResearch.Arn}应为${Research.Arn}(资源名为Research)
修改后的CloudFormation代码示例
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > reports stack Globals: Function: Timeout: 120 MemorySize: 2048 Runtime: python3.9 Environment: Variables: # 修正为引用Step Function状态机的ARN STEP_FUNCTION: !Ref StepFunctionToHandleVideosResearch Parameters: ProjectName: Description: Name of the Project Type: String Default: Project Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod TracingEnabled: true Cors: AllowMethods: "'DELETE,GET,HEAD,OPTIONS,POST,PUT'" AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'" AllowOrigin: "'*'" List: # 修正依赖为Step Function状态机,确保先创建Step Function再创建该函数 DependsOn: StepFunctionToHandleVideosResearch Type: AWS::Serverless::Function Properties: CodeUri: functions/ Handler: get.get Events: List: Type: Api Properties: RestApiId: !Ref MyApi Path: /reports Method: GET Policies: (...) ################ STEP FUNCTION ################ Research: Type: AWS::Serverless::Function Properties: CodeUri: functions/ Handler: runResearch.research Policies: (...) StepFunctionToHandleResearchRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - !Sub states.${AWS::Region}.amazonaws.com Action: "sts:AssumeRole" Path: "/" Policies: (...) StepFunctionToHandleVideosResearch: Type: "AWS::StepFunctions::StateMachine" Properties: DefinitionString: !Sub | { "StartAt": "Research", "States": { "Research": { "Type": "Task", # 修正为引用Research函数的ARN "Resource": "${Research.Arn}", "End": true } } } RoleArn: !GetAtt [ StepFunctionToHandleResearchRole, Arn ] Outputs: # 可选:输出Step Function的ARN方便后续查看 StepFunctionARN: Value: !Ref StepFunctionToHandleVideosResearch Description: ARN of the Research Step Function
函数代码获取环境变量
在Python函数中,通过以下代码即可正确获取Step Function的ARN:
import os stepFunctionARN = os.environ['STEP_FUNCTION']
关键说明
!Ref StepFunctionToHandleVideosResearch可以直接获取状态机的ARN,和!GetAtt [StepFunctionToHandleVideosResearch, Arn]效果一致- 通过
DependsOn: StepFunctionToHandleVideosResearch确保List函数在Step Function完全创建后再部署,避免因ARN未生成导致的部署错误 - 原代码中的循环依赖大概率是因为错误地让List函数依赖Research函数,同时Step Function也依赖Research函数,而List函数又需要Step Function的ARN,调整依赖关系后即可解决
内容的提问来源于stack exchange,提问作者Tibo
相关产品推荐
相关产品推荐

