【问题标题】:Passing AWS role to the application that uses default boto3 configs将 AWS 角色传递给使用默认 boto3 配置的应用程序
【发布时间】:2021-03-06 18:40:48
【问题描述】:

我有一个 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。

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

【问题讨论】:

    标签: amazon-s3 boto3 great-expectations


    【解决方案1】:

    看看这里的答案: How to choose an AWS profile when using boto3 to connect to CloudFront

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

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

    【讨论】:

    • 谢谢内森。恐怕我不能这样做,因为我在通过终端运行的应用程序中使用了 boto3(非常期望),我希望我不需要维护自定义副本
    • 也许这样的事情会有所帮助:ripon-banik.medium.com/aws-assume-role-script-4e7d3b548f20 查看示例 1,将其放入 bash 脚本并在调用应用程序之前对其进行源代码(您需要安装 JQ,您可以忽略最后一个3 行脚本,如果您只需要这个用例)
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多