如何通过CloudFormation为API Gateway配置触发Lambda的权限
配置CloudFormation实现API网关代理到Lambda
我看你正在用CloudFormation搭建代理到Lambda的API网关,目前的代码里Lambda权限的SourceArn还没配置完整,我帮你补全整个必要的配置,并解释关键细节:
完整的CloudFormation YAML配置
RestApiHamed: Type: 'AWS::ApiGateway::RestApi' Properties: Name: hamed-proxy-test # Lambda权限:允许API网关调用Lambda函数 APIGatewayToLambdaPermission: Type: AWS::Lambda::Permission DependsOn: RestApiHamed Properties: Action: lambda:invokeFunction FunctionName: test-stg1-lambda-product-get Principal: apigateway.amazonaws.com # 正确拼接SourceArn:包含API网关ID、通配符匹配所有阶段和路径 SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${RestApiHamed}/*/*/*" # 创建代理资源 {proxy+},用于匹配所有路径 ProxyResource: Type: AWS::ApiGateway::Resource DependsOn: RestApiHamed Properties: ParentId: !GetAtt RestApiHamed.RootResourceId PathPart: "{proxy+}" RestApiId: !Ref RestApiHamed # 配置ANY方法,接受所有HTTP请求方法 ProxyMethod: Type: AWS::ApiGateway::Method DependsOn: ProxyResource Properties: AuthorizationType: NONE HttpMethod: ANY ResourceId: !Ref ProxyResource RestApiId: !Ref RestApiHamed Integration: Type: AWS_PROXY IntegrationHttpMethod: POST Uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${test-stg1-lambda-product-get.Arn}/invocations" PassthroughBehavior: WHEN_NO_MATCH # 部署API网关到一个阶段(比如prod) ApiDeployment: Type: AWS::ApiGateway::Deployment DependsOn: ProxyMethod Properties: RestApiId: !Ref RestApiHamed StageName: prod
关键要点解释
- Lambda权限的SourceArn:必须精确匹配API网关的执行ARN,这里用
!Sub结合!Ref RestApiHamed获取API网关ID,/*/*/*通配符表示允许所有阶段、所有HTTP方法、所有路径的请求调用Lambda,完全适配代理场景的需求。 - 代理资源{proxy+}:这个路径部分会匹配所有层级的子路径,是API网关实现全路径代理Lambda的核心配置,确保任何路径的请求都能转发到Lambda处理。
- ANY方法 + AWS_PROXY集成:ANY方法支持GET/POST/PUT等所有HTTP请求方法,
AWS_PROXY集成类型会自动把请求上下文、参数、请求体等完整转发给Lambda,同时自动处理Lambda的响应并返回给客户端,无需额外映射配置。 - API部署:必须创建Deployment资源才能让配置的API网关生效,指定阶段名(比如prod)来发布你的API服务。
内容的提问来源于stack exchange,提问作者Hamed Minaee
相关产品推荐
相关产品推荐

