问题描述
我正在尝试编写一个使用看门狗的python脚本来查找文件创建并将其使用boto3上载到s3。但是,我的boto3凭据每隔12小时就会过期,因此我需要更新它们。我将boto3凭据存储在~/.aws/credentials
中。因此,现在我正在尝试捕获S3UploadFailedError
,更新凭据,并将其写入~/.aws/credentials
。但是,尽管凭据正在更新,并且我再次调用boto3.client('s3')
引发异常。
我在做什么错?或者我该如何解决?
下面是代码段
try:
s3 = boto3.client('s3')
s3.upload_file(event.src_path,'bucket-name',event.src_path)
except boto3.exceptions.S3UploadFailedError as e:
print(e)
get_aws_credentials()
s3 = boto3.client('s3')
解决方法
根据to the documentation,客户端会在多个位置查找凭据,还有其他一些可能更适合编程的选项,而不是.aws/credentials
文件。
引用文档:
Boto3搜索凭据的顺序为:
- 在boto.client()方法中将凭据作为参数传递
- 在创建会话对象时将凭据作为参数传递
- 环境变量
- 共享凭据文件(〜/ .aws / credentials)
- AWS配置文件(〜/ .aws / config)
- 承担角色提供者
在您的情况下,由于您已经在捕获异常并更新了凭据,所以我将像这样将新的凭据传递给客户端的新实例:
client = boto3.client(
's3',aws_access_key_id=NEW_ACCESS_KEY,aws_secret_access_key=NEW_SECRET_KEY,aws_session_token=NEW_SESSION_TOKEN
)
相反,如果您在代码中的其他位置使用这些相同的凭据来创建其他客户端,则可以考虑将它们设置为环境变量:
import os
os.environ['AWS_ACCESS_KEY_ID'] = NEW_ACCESS_KEY
os.environ['AWS_SECRET_ACCESS_KEY'] = NEW_SECRET_KEY
os.environ['AWS_SESSION_TOKEN'] = NEW_SESSION_TOKEN
再次引用文档:
仅当您使用临时凭证时,才需要您的AWS账户[...]的会话密钥。