python脚本无限期运行时如何刷新boto3 credetials

问题描述

我正在尝试编写一个使用看门狗的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账户[...]的会话密钥。