使用角色通过Python脚本访问S3是否需AWS访问密钥与密码?
解决boto3找不到凭证访问S3的问题
首先,不需要强制在~/.aws/credentials文件中存储长期访问密钥与密码——既然你已经拥有AWS角色,应该利用角色的临时凭证机制来获取访问权限,这比长期密钥更安全。
以下是针对角色场景的几种可行方案:
在AWS托管服务上运行脚本:如果你的脚本在EC2实例、EKS Pod、ECS任务等AWS内部服务上运行,只要给这些资源关联了你的AWS角色,boto3会自动从实例元数据服务(IMDS)获取临时凭证,无需手动配置任何凭证文件。
本地测试用角色切换配置:在本地开发环境运行脚本时,可通过~/.aws/config文件配置角色切换,而非credentials文件。示例配置如下:
[profile my-role-profile] role_arn = arn:aws:iam::123456789012:role/YourRoleName source_profile = default其中
source_profile是本地已有的基础凭证(需具备STS AssumeRole权限),运行脚本时指定该profile即可:import boto3 session = boto3.Session(profile_name='my-role-profile') s3 = session.client('s3')手动调用STS获取临时凭证:若上述方式不适用,可在脚本中直接调用STS服务获取角色临时凭证,再传入boto3:
import boto3 sts_client = boto3.client('sts') response = sts_client.assume_role( RoleArn='arn:aws:iam::123456789012:role/YourRoleName', RoleSessionName='MySessionName' ) credentials = response['Credentials'] s3 = boto3.client( 's3', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'] )排查常见问题:若仍报凭证找不到,检查以下几点:
- 确认AWS角色已正确关联到运行脚本的资源(或本地profile配置的角色ARN无误)
- 角色权限策略是否包含S3访问权限(如
s3:ListBucket、s3:GetObject等) - 本地环境是否存在冲突的AWS环境变量(如
AWS_ACCESS_KEY_ID),这类变量会优先于配置文件生效
内容的提问来源于stack exchange,提问作者Xi12
相关产品推荐
相关产品推荐

