You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 distribution
    • Default 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角色列表截图:
    自动生成的边缘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会覆盖角色的自定义配置,推荐两种官方支持的合规方案:

  1. 通过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控制台重新部署即可生效,后续权限调整只需要修改该文件。

  1. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:54:05