无法使用IAM角色凭据使用Python将文件上载到S3

时间:2018-01-16 16:51:07

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

以下已解决的问题允许我在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>而不是如何使用Unable to locate credentials的文档或示例根据{{​​3}}访问和密钥。

非常感谢任何帮助。这就是我现在所拥有的,它会引发错误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')

new_array = array[:, 0:2, 0:2] 
new_array.shape
(1, 2, 2) 

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您将需要AWS IAM访问密钥。

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

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

如果您的计算机位于AWS之外,则需要使用访问密钥或Cognito等身份验证/授权服务。

IAM角色专为服务而设计,例如Redshift,EC2等,它们有权使用您的角色ARN呼叫STS以生成新的临时访问密钥。角色不是为在AWS之外调用而设计的(有一些例外,例如Cognito)。

[新评论后编辑]

您有几种解决方案:

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