将 AWS 角色传递给使用默认 boto3 配置的应用程序

Passing AWS role to the application that uses default boto3 configs

我有一个 aws 设置,它要求我承担角色并获得相应的凭据才能写入 s3。例如,要写 aws cli,我需要使用 --profile readwrite 标志。如果我自己用引导编写代码,我会通过 sts 承担角色、获取凭据并创建新会话。

但是,有很多应用程序和包依赖于 boto3 的配置,例如内部代码是这样运行的:

s3 = boto3.resource('s3')
result_s3 = s3.Object(bucket, s3_object_key)
result_s3.put(
                Body=value.encode(content_encoding),
                ContentEncoding=content_encoding,
                ContentType=content_type,
        )

根据文档,可以将 boto3 设置为使用默认配置文件(除其他外)AWS_PROFILE env 变量,并且它显然“有效”,因为 boto3.Session().profile_name 确实匹配变量 - 但是应用程序仍然不会写入 s3。

正确设置它们的 cleanest/correct 方法是什么?我试图从 sts 中提取凭据,并将它们写为 AWS_SECRET_TOKEN 等,但这对我不起作用...

看看这里的答案:

您可以让 boto3 像这样使用其他配置文件:

rw = boto3.session.Session(profile_name='readwrite')
s3 = rw.resource('s3')

我认为我的问题的正确答案是 Nathan Williams 在评论中分享的答案。

在我的具体情况下,考虑到我必须从 python 启动代码,并且有点担心设置可能会溢出到其他操作的 AWS 设置,我使用了 事实上,boto3 有 DEFAULT_SESSION 单例,每次都使用,并且只是用承担适当角色的会话覆盖它:

hook = S3Hook(aws_conn_id=aws_conn_id)  
boto3.DEFAULT_SESSION = hook.get_session()  

(这里,S3Hook是airflow的s3处理对象)。之后(在同一个运行时)一切正常