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

EC2通过IAM角色上传文件至S3报InvalidToken错误

问题原因

该错误是AWS分区隔离+客户端配置错误共同导致的,核心问题点:

  • 桶名配置不一致:代码里硬编码的桶名为us-east-1-usge1prod-dr-automation,但运行日志显示实际访问的桶是us-gov-east-1-usge1prod-dr-automation,后者属于AWS GovCloud(美国政府云)独立分区,和标准商业AWS分区的STS临时凭证完全不互通。
  • S3客户端未指定正确区域:初始化boto3 S3资源时没有显式传区域参数,boto3默认使用商业AWS的全局S3端点,EC2实例角色获取的临时凭证是和实例所在分区绑定的,发到不匹配的分区端点时就会抛出InvalidToken错误,提示token无效。
  • 补充排查点:如果上述两个问题修正后仍有报错,需要检查IAM角色权限的ARN配置,GovCloud分区的S3 ARN前缀为arn:aws-us-gov:s3:::,如果权限策略里误用了标准分区的arn:aws:s3:::前缀,也会导致权限异常。
修复步骤
  1. 修正代码中的桶名,将硬编码的错误桶名替换为实际的GovCloud桶名us-gov-east-1-usge1prod-dr-automation。
  2. 初始化S3资源时显式指定GovCloud对应的区域,强制客户端走对应分区的端点,修改对应代码段为:
s3 = boto3.resource('s3', region_name='us-gov-east-1')
myBucket = s3.Bucket('us-gov-east-1-usge1prod-dr-automation')
with open('./config/stop_config.yaml', 'rb') as data:
    myBucket.upload_fileobj(data, 'config/stop_config.yaml')
  1. 上线前可先在EC2实例内执行CLI命令做预校验:
aws s3 ls s3://us-gov-east-1-usge1prod-dr-automation --region us-gov-east-1

命令能正常返回桶内文件列表的话,说明实例角色凭证、网络连通性、基础权限均正常,代码修改后即可正常上传。
4. 若预校验提示权限不足,调整CloudFormation里的IAM权限策略,将s3:PutObject对应的资源范围明确覆盖目标上传路径,示例权限片段:

Action:
  - s3:Get*
  - s3:List*
  - s3:PutObject
Resource:
  - arn:aws-us-gov:s3:::us-gov-east-1-usge1prod-dr-automation
  - arn:aws-us-gov:s3:::us-gov-east-1-usge1prod-dr-automation/*

内容的提问来源于stack exchange,提问作者ajhowey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:48:19