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:::前缀,也会导致权限异常。
修复步骤
- 修正代码中的桶名,将硬编码的错误桶名替换为实际的GovCloud桶名
us-gov-east-1-usge1prod-dr-automation。 - 初始化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')
- 上线前可先在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
相关产品推荐
相关产品推荐

