如何在SAM模板中消除API Gateway与Lambda的循环依赖
解决API Gateway与Lambda授权器的循环依赖问题
问题场景
我在SAM模板中配置了API Gateway(TempApi)和两个Lambda函数(TempAuthorizerFunction、LastFunction),模板及授权器代码如下:
原SAM模板
Resources: TempApi: Type: AWS::Serverless::Api Properties: Auth: DefaultAuthorizer: TempAuthorizer Authorizer: TempAuthorizer: FunctionPayloadType: REQUEST FunctionArn: !GetAtt TempAuthorizerFunction.Arn # 引用授权器Lambda的ARN AuthorizerPayloadFormatVersion: "2.0" Identity: Headers: - Authorization TempAuthorizerFunction: Type: AWS::Serverless::Function Properties: FunctionName: "TempAuth" Environment: Variables: API_RESOURCE_ARN: !Sub "arn::aws:execute-api:${AWS::Region}:${AWS::AccountId}:${TempApi}/*/POST/workwork/{eventName}" # 引用API Gateway的资源ARN LastFunction: Type: AWS::Serverless::Function Properties: FunctionName: "LastFunction"
原授权器代码(authorizer/app.py)
def temp_authorizer(event, context, logger, session): response = { "policyDocument": { "Version": "2012-10-17", "Statement": [{ "Action": "execute-api:Invoke", "Resource": ... # 原本计划通过环境变量API_RESOURCE_ARN传入 "Effect": "Deny" }] }, "context": {} }
当前存在循环依赖:TempApi的默认授权器需要引用TempAuthorizerFunction的ARN,而TempAuthorizerFunction的环境变量又需要引用TempApi的资源ARN,导致部署失败。
解决方法
方法一:从授权器事件中直接提取资源ARN(推荐)
对于REQUEST类型的Lambda授权器,API Gateway会将当前请求的完整资源ARN自动传入授权器的event参数中,具体路径为event['requestContext']['resourceArn']。无需通过环境变量提前配置,直接在代码中读取即可消除循环依赖。
修改后的授权器代码:
def temp_authorizer(event, context, logger, session): # 从事件中直接获取当前请求的资源ARN resource_arn = event['requestContext']['resourceArn'] response = { "policyDocument": { "Version": "2012-10-17", "Statement": [{ "Action": "execute-api:Invoke", "Resource": resource_arn, "Effect": "Deny" }] }, "context": {} } return response
同时修改SAM模板,删除TempAuthorizerFunction中引用TempApi的环境变量:
TempAuthorizerFunction: Type: AWS::Serverless::Function Properties: FunctionName: "TempAuth" # 移除API_RESOURCE_ARN环境变量配置
方法二:拆分部署流程(备选)
如果必须通过环境变量传递资源ARN,可以分两步部署:
- 先部署不包含授权器配置的API Gateway和两个Lambda函数(此时TempApi不配置DefaultAuthorizer)。
- 部署完成后,手动在API Gateway控制台配置授权器,引用TempAuthorizerFunction的ARN;同时更新TempAuthorizerFunction的环境变量,填入已生成的TempApi资源ARN。
这种方法需要手动操作,适合特殊场景,但不如方法一高效。
内容的提问来源于stack exchange,提问作者jayko03
相关产品推荐
相关产品推荐

