新AWS Amplify无服务器应用返回403 Access Denied问题排查
解决AWS Amplify托管域名下的403 Access Denied问题
问题核心
Amplify Hosting默认面向静态网站设计,你的请求被当作静态资源查找,找不到就返回403。Function URL能正常工作说明Lambda函数本身无问题,问题出在Amplify的请求路由配置上。
解决步骤
1. 配置Amplify重写/重定向规则
将目标路径的请求转发到你的API Gateway(即Function URL对应的端点):
- 打开Amplify控制台,进入目标项目
- 导航到App Settings > Rewrites and redirects
- 点击Add rule,添加规则:
- Source address:
</^staging\/.*$/>(匹配staging下所有路径,可根据实际调整) - Target address:
https://<你的API Gateway ID>.execute-api.us-west-2.amazonaws.com/staging/$1($1会自动匹配source中的路径部分) - Type: 200 (Rewrite)
- Source address:
- 保存规则后重新部署项目
也可直接在项目根目录的amplify.yml中添加配置:
version: 1 frontend: phases: build: commands: - echo "No frontend build needed" # 纯后端项目无需构建前端 artifacts: baseDirectory: . # 指定任意存在的目录,避免Amplify因找不到静态文件报错 rewriteRules: - source: /staging/<.*> target: https://<你的API Gateway ID>.execute-api.us-west-2.amazonaws.com/staging/$1 status: 200
2. 确认Lambda函数与Amplify的关联
- 进入Amplify项目的Backend标签页,找到你的Lambda函数
- 检查触发配置,确保已启用Amplify Hosting作为触发源,且路径映射正确(比如
/staging/*对应函数入口)
3. 验证Lambda执行角色权限
- 打开IAM控制台,找到Lambda函数对应的执行角色
- 确保角色拥有
lambda:InvokeFunction权限,且信任策略允许Amplify服务调用该函数:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "amplify.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
4. 确保EJS模板路径正确
Lambda环境的文件路径与本地开发不同,需用绝对路径加载模板:
const path = require('path'); app.set('views', path.join(__dirname, 'views')); // 假设模板放在views目录 app.set('view engine', 'ejs');
验证
重新部署Amplify项目后,访问master.<...>.amplifyapp.com/staging/<...>,即可正常返回EJS渲染的内容。
内容的提问来源于stack exchange,提问作者Harold
相关产品推荐
相关产品推荐

