如何在AWS Amplify托管的Next.js应用中正确使用AWS SDK?
解决Next.js + AWS SDK v3在Amplify部署后的凭证问题
官方推荐的正确方案:使用Amplify的IAM服务角色
Amplify部署的前端应用会自动关联一个IAM服务角色,AWS SDK v3会自动从运行环境中获取临时凭证,无需手动配置AWS_ACCESS_KEY_ID等变量,同时完全兼容本地的~/.aws/credentials配置,具体步骤如下:
- 登录Amplify控制台,进入你的应用,点击「Settings」→「IAM service role」,复制该角色的ARN。
- 打开IAM控制台,找到这个角色,点击「Permissions」→「Add permissions」→「Create inline policy」。
- 根据业务需求创建权限策略(比如S3上传、SES发邮件的权限),示例S3上传权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::你的存储桶名称/*" } ] } - 保存策略后,Amplify应用的运行环境会自动继承该角色的权限,SDK无需额外配置即可正常工作。
为什么之前的方案存在问题?
- Amplify会过滤所有
AWS_前缀的环境变量,所以你手动设置的AWS_ACCESS_KEY_ID等变量无法被应用读取。 - 手动解析
process.env.secrets并硬编码凭证的做法极度危险:Next.js前端代码会被打包编译,凭证可能暴露在客户端代码中,导致AWS账号泄露。 - 该方案还会破坏本地运行逻辑,因为本地环境不存在
process.env.secrets变量。
兼容本地与部署的代码写法
保持SDK的默认初始化逻辑即可,SDK会自动按优先级加载凭证:
import { S3Client } from "@aws-sdk/client-s3"; import { SESClient } from "@aws-sdk/client-ses"; // 仅指定区域,无需手动传入credentials const s3Client = new S3Client({ region: "你的AWS区域" }); const sesClient = new SESClient({ region: "你的AWS区域" });
- 本地环境:SDK自动读取
~/.aws/credentials中的凭证。 - Amplify部署环境:SDK自动获取IAM服务角色的临时凭证。
关于文档匮乏的说明
Amplify的IAM服务角色属于隐式默认配置,官方文档更侧重Amplify CLI的全栈开发流程,纯前端部署的场景说明较少。不少开发者会忽略这个默认角色,转而尝试手动配置凭证,导致走弯路。
内容的提问来源于stack exchange,提问作者parasomnist
相关产品推荐
相关产品推荐

