EC2部署NodeJS服务上传图片到AWS S3出现AccessDenied错误求助
- 先确认EC2实例上NodeJS服务加载的环境变量是否正确:在上传代码前添加日志打印
process.env.AWS_ACCESS_KEY_ID、process.env.AWS_SECRET_ACCESS_KEY、process.env.AWS_S3_IMAGES的取值,确认和本地运行时使用的凭证、桶名完全一致。AWS SDK默认会按优先级查找凭证:代码显式传入的凭证 > 环境变量 > 本地凭证文件 > EC2实例关联的IAM角色凭证,如果你的环境变量加载失败,SDK会自动调用实例角色的权限,若实例角色没有S3上传权限就会触发AccessDenied报错。 - 验证S3桶的ACL配置支持公开访问设置:当前S3新桶默认开启「桶所有者强制执行」的对象所有权规则,该规则会完全禁用ACL,此时上传对象时传入
ACL: "public-read"参数会直接返回AccessDenied。你可以登录S3控制台,进入对应桶的「权限」-「对象所有权」页面,确认是否关闭了该规则,或者改为ACL已启用的模式。 - 用AWS CLI在EC2实例上复现操作:在EC2实例上配置和代码相同的AK/SK,执行命令
aws s3 cp 本地测试文件 s3://你的桶名/测试文件名 --acl public-read,如果CLI执行也返回AccessDenied,说明问题出在权限/桶配置层面;如果CLI执行成功,说明问题出在NodeJS服务的环境变量加载、SDK初始化逻辑上。 - 检查VPC S3端点策略限制:如果你的EC2实例部署在私有子网,且配置了S3 VPC端点,需要确认端点的访问策略是否允许该IAM用户上传对象、设置公开ACL,端点策略优先级高于IAM用户权限,即使IAM用户有FullAccess,端点策略限制后也会返回AccessDenied。
- 显式指定S3签名版本:部分AWS新增区域仅支持Signature V4签名,你可以在初始化S3实例时添加签名版本配置,代码如下:
const S3 = new AWS.S3({ signatureVersion: 'v4' });
- 如果你使用的AWS账号归属于AWS Organization,确认组织层面的服务控制策略(SCP)没有禁止S3上传、设置公开ACL的操作。
内容的提问来源于stack exchange,提问作者vardhanv35
相关产品推荐
相关产品推荐

