使用AWS SAM部署自定义API Gateway时报错:REST API无方法
这个问题我之前帮不少开发者排查过,核心是自定义AWS::Serverless::Api资源和Lambda函数的API事件没有正确关联,SAM的隐式部署逻辑在这里有个很容易踩的坑,下面分几个方向逐一排查:
第一步:强制Lambda事件关联到你的自定义API
默认情况下,如果Lambda的API事件没指定RestApiId,SAM会自动创建一个全新的默认API Gateway,而你手动定义的那个AWS::Serverless::Api资源就会变成一个空的API(没有任何方法挂载),这就触发了API Gateway的校验错误。
你需要在Lambda的Events配置里显式关联自定义API的逻辑ID,比如:ThumbnailFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src/ Handler: app.lambda_handler Runtime: python3.9 Events: ThumbnailGet: Type: Api Properties: Path: /thumbnail Method: GET RestApiId: !Ref PrivateThumbnailApi # 这里必须指定你的自定义API ID第二步:确保自定义API包含Stage配置
SAM的隐式部署通常会自动生成Stage,但自定义API资源有时需要显式声明StageName,让SAM明确知道要把方法部署到哪个Stage下。比如:PrivateThumbnailApi: Type: AWS::Serverless::Api Properties: StageName: prod # 显式指定Stage EndpointConfiguration: PRIVATE Policy: !Sub | # 你的API网关策略内容第三步:排查API网关策略的语法问题
虽然报错提示是没有方法,但策略的语法错误可能导致SAM在部署时无法正确完成方法关联。可以先临时注释掉Policy配置,重新部署试试:如果部署成功,说明问题出在策略里,再逐行检查策略的JSON/YAML语法、资源ARN是否正确。第四步:用SAM CLI工具排查细节
- 先运行
sam validate检查模板语法,很多隐性的语法错误会导致部署逻辑异常; - 再用
sam deploy --debug执行部署,查看详细日志,你能清楚看到SAM是如何处理你的API资源和Lambda关联的,有没有把GET /thumbnail方法正确添加到自定义API中。
- 先运行
第五步:升级SAM CLI到最新版本
旧版本的SAM CLI在处理自定义API与Lambda事件关联的逻辑上可能存在bug,执行pip install --upgrade aws-sam-cli升级到最新版,再尝试部署,说不定能解决兼容性问题。
内容的提问来源于stack exchange,提问作者Pierre

