Linux EC2实例中boto3 get_credentials()返回None的问题求助
问题描述
我在Linux EC2实例上尝试手动创建Elasticsearch域的快照并保存至S3存储桶,使用Python客户端代码注册手动快照仓库时,boto3获取凭证返回None。已设置包含access_key、secret_key和region_name的环境变量,但问题仍未解决,代码如下:
import boto3 import requests from requests_aws4auth import AWS4Auth host = 'elastic-domain' region = 'us-east-1' # For example, us-west-1 service = 'es' credentials = boto3.Session(region_name=region).get_credentials() print(credentials) awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Register repository path = '_snapshot/elastic-repo' # the Elasticsearch API endpoint url = host + path payload = { "type": "s3", "settings": { "bucket": "bucket-name", "region": "us-east-1", "role_arn": "arn:aws:iam::account-id:role/specified-role" } } headers = {"Content-Type": "application/json"} r = requests.put(url, auth=awsauth, json=payload, headers=headers) print(r.status_code) print(r.text)
排查方向及解决方法
- 检查环境变量命名:boto3默认读取的环境变量是
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,确认你设置的变量名是否完全匹配,避免拼写错误。可以在终端执行echo $AWS_ACCESS_KEY_ID和echo $AWS_SECRET_ACCESS_KEY验证变量是否正确加载。 - EC2实例IAM角色优先级:如果EC2实例关联了IAM角色,boto3会优先使用实例角色的凭证,而非手动设置的环境变量。若实例角色没有Elasticsearch快照和S3访问权限,就会导致凭证获取异常。可以临时移除实例IAM角色测试,或者为实例角色添加对应权限。
- boto3会话配置:代码中手动指定了
region_name,若环境变量中的AWS_DEFAULT_REGION与代码指定的region不一致,可能影响凭证加载。尝试移除region_name=region参数,让boto3自动从环境变量读取区域配置。 - 进程环境变量刷新:设置环境变量后,需重启运行代码的终端或进程,否则进程无法读取新的环境变量。比如执行
export设置变量后,要重新打开终端再运行代码,或者重启相关服务进程。 - IAM权限与信任关系:确认access_key对应的IAM用户拥有
es:ESHttpPut权限(用于注册快照仓库),同时目标S3桶需配置s3:ListBucket、s3:GetObject、s3:PutObject权限;另外,代码中指定的IAM角色需配置信任关系,允许Elasticsearch服务(es.amazonaws.com)扮演该角色访问S3。
内容的提问来源于stack exchange,提问作者Tapu Das
相关产品推荐
相关产品推荐

