【问题标题】:Unable to upload file to S3 with Python using IAM role credentials无法使用 IAM 角色凭证通过 Python 将文件上传到 S3
【发布时间】:2018-01-16 16:51:07
【问题描述】:

以下已解决的问题允许我在 Redshift 中卸载、复制、运行查询、创建表等:Redshift create table not working via PythonUnload to S3 with Python using IAM Role credentials。请注意,即使我通过 Redshift 成功地从 S3 写入和复制,也没有对 Boto3 的依赖。

我希望能够在 Python 中(来自 cwd)动态地将文件上传到 S3 - 但是我似乎没有找到有关如何使用 iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name> 而不是访问和根据http://boto3.readthedocs.io/en/latest/guide/quickstart.html 的密钥。

非常感谢任何帮助。这就是我现在所拥有的,它会引发Unable to locate credentials 的错误:

import boto3

#Input parameters for s3 buckets and s3 credentials
bucket_name = ''
bucket_key = ''
filename_for_csv = 'output.csv'    

#Moving file to S3
s3 = boto3.resource('s3')
data = open(filename_for_csv, 'rb')
s3.Bucket(bucket_name).put_object(Key=bucket_key, Body=data, ServerSideEncryption='AES256')

【问题讨论】:

    标签: python amazon-web-services amazon-s3


    【解决方案1】:

    您将需要 AWS IAM 访问密钥。

    您的问题是您需要访问密钥才能调用 STS(安全令牌服务),然后 STS 可以使用您的角色 ARN 处理 AssumeRole(),然后生成新的临时访问密钥。

    但是,如果您有访问密钥,则无需使用 AssumeRole()。

    如果您的机器在 AWS 之外,那么您将需要使用访问密钥或 Cognito 等身份验证/授权服务。

    IAM 角色专为 Redshift、EC2 等有权使用您的角色 ARN 调用 STS 以生成新的临时访问密钥的服务而设计。角色并非设计为在 AWS 之外调用(也有例外,例如 Cognito)。

    [新评论后编辑]

    您有几种解决方案:

    • 签名 URL。将角色分配给 EC2。然后让 EC2 创建签名 URL,您可以在本地使用这些 URL 将文件上传到 S3。这样可以使访问密钥远离您的系统。
    • 使用认知。 Cognito 易于使用,互联网上有很多代码示例。 Cognito 将为您提供身份验证、授权和临时凭证。
    • 将您的角色分配给 EC2,以便 EC2 可以上传到 S3。然后,您会遇到将文件发送到 EC2 并支付额外带宽(EC2 -> S3)的问题。您可以使用 SSH 和 SCP 将文件安全地复制到 EC2,然后启动复制到 S3 的进程。

    【讨论】:

    • 太可惜了.. 连接到 EC2 并从那里使用 IAM 角色将文件上传到 S3 怎么样?我知道这有点倒退,但我们的 Dev Ops 无论如何都不允许我们使用访问密钥..
    • 由于我们使用 Okta,我想我需要通过 AWS CLI 创建临时凭证,然后引用它们以将对象放入 S3
    • 那行得通。他们有一个非常有趣的解决方案。这是我查看的链接:support.okta.com/help/Documentation/Knowledge_Article/…
    【解决方案2】:

    如果您从 EC2 实例运行此脚本,请将 IAM 角色附加到该实例。 IAM 角色应包含以下策略(除了您已有的)。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "statement1",
                "Effect": "Allow",
                "Action":   ["s3:PutObject"],
                "Resource": "arn:aws:s3:::examplebucket/*"
            }
        ]
    }
    

    如果您没有在 EC2 实例中运行此脚本,则需要使用访问密钥和密钥。

    【讨论】:

    • 感谢您的回答。不幸的是,我不是 100% 清楚在这里做什么。我在终端中通过python script.py 运行script.py。你说我应该在哪里添加上述条款?假设我的 AIM 角色是 arn:aws:iam:0000:role/aim_role,存储桶名称是 drops,存储桶密钥是 unload。如果我将此添加到我的脚本中,我仍然会收到“无法找到凭据”错误
    • 脚本在哪里运行 - 在您的桌面或亚马逊 EC2 实例中?
    • 桌面这似乎是根据您的评论的问题。有没有办法让我通过桌面上的 Python 连接到 EC2 以从“AWS 内部”运行脚本?
    • IAM 角色只能附加到 AWS 资源(在本例中为 Amazon EC2 实例)。要在桌面上运行此脚本,您只需使用访问密钥和密钥。
    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多