You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:11:00