无法使用 IAM 角色凭证通过 Python 将文件上传到 S3

use*_*780 4 python amazon-s3 amazon-web-services

以下已解决的问题允许我在 Redshift 中卸载、复制、运行查询、创建表等:Redshift create table not work via PythonUnload to S3 with Python using IAM Rolecredential。请注意,即使我通过 Redshift 成功写入 S3 并从 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')
Run Code Online (Sandbox Code Playgroud)

Joh*_*ley 6

您将需要 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 的进程。