Amplify部署Next.js时Lambda@Edge缺失DynamoDB权限问题
Amplify部署Next.js应用时Lambda@Edge未继承服务角色DynamoDB权限问题
问题背景
- 使用
amplify-cli将Next.js应用部署至AWS Amplify,应用已关联多个通过Terraform创建的现有DynamoDB表 - 已为Amplify应用绑定的服务角色添加
AmazonDynamoDBFullAccess权限策略(后续计划收紧权限范围),原本预期配置可正常生效,但权限并未向下传递至部署过程中自动创建的两个边缘Lambda资源:API Lambda@Edge for Next CloudFront distributionDefault Lambda@Edge for Next CloudFront distribution
- Lambda日志中可查看到明确的权限报错信息:
arn:aws:sts::999999999:assumed-role/rgsuvm9-psuzoeg/us-east-1.ggvvff-abc123 is not authorized to perform: dynamodb:Scan on resource: arn:aws:dynamodb:eu-west-2:6666666666:table/MyTable
- 经排查,部署过程中自动生成了名称为随机字符串、信任实体为
AWS Service: lambda的执行角色,这些角色绑定的默认权限策略仅开放日志写入与S3访问权限。 - 自动生成的边缘Lambda角色列表截图:

- 以下为其中一个自动生成角色绑定的默认权限策略示例(手动添加DynamoDB访问权限前的版本):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": "*", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ] }, { "Effect": "Allow", "Resource": "arn:aws:s3:::z0kq2lk-i0l0usx/*", "Action": [ "s3:GetObject", "s3:PutObject" ] } ] }
- 经测试,手动为上述自动生成的角色添加DynamoDB读写权限后,SSR边缘Lambda即可正常获取DynamoDB访问权限,问题可临时解决,但手动修改系统自动生成角色的方案不具备可维护性,不符合合规要求。
- 当前使用的Amplify服务角色已绑定
AdministratorAccess-Amplify与AmazonDynamoDBFullAccess策略。
待咨询问题
- 如何通过合规可维护的配置方式修改SSR Lambda的权限?
- 为何Lambda@Edge未使用Amplify应用常规设置中分配的服务角色?
- 该问题是Amplify服务本身的机制缺陷,还是服务角色配置存在错误?
回答
原因说明
这不是配置错误,是Amplify托管Next.js SSR场景的默认机制设计:
- Amplify应用绑定的服务角色,仅用于Amplify服务自身执行部署操作、访问部署流程需要关联的资源,不会直接绑定到运行时计算资源(包括Lambda@Edge、SSR运行Lambda)。
- Next.js SSR部署时自动生成的Lambda@Edge角色,是Amplify在部署阶段临时创建的独立执行角色,默认仅附带运行SSR必需的最小权限:CloudWatch Logs写入、关联部署S3存储桶的读写,不会自动继承Amplify服务角色的任何权限。
- Lambda@Edge本身有特殊限制:执行角色必须创建在us-east-1区域,信任策略需要同时允许
lambda.amazonaws.com和edgelambda.amazonaws.com服务代入,Amplify不会将用户配置的跨区域服务角色直接复用为Lambda@Edge执行角色。
可维护的权限配置方案
禁止手动修改自动生成的角色,每次重新部署Amplify会覆盖角色的自定义配置,推荐两种官方支持的合规方案:
- 通过Amplify自定义策略配置注入权限(优先推荐)
在Next.js项目根目录创建amplify/custom/policies.json文件,定义需要附加给SSR Lambda角色的权限策略,Amplify部署时会自动将策略附加到生成的Lambda@Edge执行角色上,配置不会被后续部署覆盖,可纳入版本管理。示例配置:
[ { "Effect": "Allow", "Action": [ "dynamodb:Scan", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Query" ], "Resource": [ "arn:aws:dynamodb:eu-west-2:6666666666:table/MyTable", "arn:aws:dynamodb:eu-west-2:6666666666:table/MyTable/index/*" ] } ]
配置完成后重新执行amplify push或触发Amplify控制台重新部署即可生效,后续权限调整只需要修改该文件。
- 通过Terraform附加权限(适配现有Terraform管理流程)
如果所有AWS资源统一通过Terraform管理,可以通过Terraform数据源匹配Amplify生成的SSR Lambda角色,再通过aws_iam_role_policy_attachment资源附加预定义的DynamoDB访问策略。角色匹配规则:Amplify生成的Lambda@Edge角色统一路径为/service-role/,角色名前缀与Amplify应用ID一致。
注意:该方案需要在Amplify应用部署完成后再执行
terraform apply,避免角色未生成导致执行报错,可将Amplify部署步骤纳入Terraform依赖流程。
额外注意事项
- 不要给Lambda@Edge附加全量DynamoDB权限,遵循最小权限原则,仅开放业务需要的表和操作权限即可。
- Lambda@Edge访问跨区域资源(如本次场景中DynamoDB部署在eu-west-2,Lambda@Edge执行角色在us-east-1)不需要额外配置VPC或端点,IAM权限本身支持跨区域授权,只要策略中资源ARN填写正确即可。
- 不要尝试修改Amplify默认生成角色的信任策略,部署流程会自动覆盖自定义的信任关系配置。
内容的提问来源于stack exchange,提问作者Colin Riddell
相关产品推荐
相关产品推荐

