使用SAM部署AWS Lambda至Dev阶段:URL显示异常及权限问题
问题分析与解决方案
核心原因
- SAM默认自动创建
Prod阶段,仅修改Outputs的URL路径不会实际生成Dev阶段配置,访问Dev路径时因无对应阶段存在触发403错误 - 重复的Outputs配置会干扰部署逻辑,导致阶段配置混乱
- Lambda函数的调用权限仅关联了默认的
Prod阶段,Dev阶段未获得调用权限
具体修复步骤
1. 在SAM模板中明确创建Dev阶段
SAM不会自动生成非默认阶段,需手动配置:
方式一:全局指定API阶段(推荐)
在模板顶部的Globals区块中统一设置API的默认阶段:
Globals: Api: StageName: Dev
方式二:单独定义ApiGateway Stage资源
如果需要同时保留多阶段,可添加独立的Stage资源:
Resources: DevApiStage: Type: AWS::ApiGateway::Stage Properties: StageName: Dev RestApiId: !Ref ServerlessRestApi DeploymentId: !Ref ServerlessRestApiDeployment # 可按需开启日志等配置 MethodSettings: - ResourcePath: "/*" HttpMethod: "*" LoggingLevel: INFO
2. 配置Dev阶段的Lambda调用权限
默认生成的权限只针对Prod阶段,需新增或修改权限规则:
Resources: TimedTextRecsnFunctionDevPermission: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref TimedTextRecsnFunction Action: lambda:InvokeFunction Principal: apigateway.amazonaws.com SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${ServerlessRestApi}/Dev/*/*"
3. 修正Outputs配置
更新描述与路径,确保和实际阶段一致:
Outputs: TimedTextRecsnApi: Description: "API Gateway endpoint URL for Dev stage for Timed Text Recsn Function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Dev/"
4. 重新部署服务
执行部署命令生效配置:
sam deploy
(首次部署或需修改参数时用sam deploy --guided)
为什么改回Prod就正常?
因为SAM默认会自动创建Prod阶段,同时自动生成该阶段调用Lambda的权限配置,所以访问Prod路径时API Gateway能正确触发Lambda函数;而Dev阶段是你手动指定但未实际创建和配置权限的,自然会出现403禁止访问。
内容的提问来源于stack exchange,提问作者ThisQRequiresASpecialist
相关产品推荐
相关产品推荐

