[英]Unable to upload file to S3 with Python using IAM role credentials
以下已解决的问题使我可以在Redshift中卸载,复制,运行查询,创建表等: Redshift创建表无法通过Python工作,并使用IAM角色凭据 通过Python 卸载到S3 。 请注意,即使我通过Redshift成功写入S3并从S3复制,也不依赖Boto3。
我希望能够使用Python(从cwd)动态地将文件上传到S3,但是我似乎找不到文档或如何使用iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>
而不是按照http://boto3.readthedocs.io/zh-CN/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')
如果您是从EC2实例运行此脚本,则将IAM角色附加到该实例。 IAM角色(除了已经拥有的策略之外)还应包含以下策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "statement1",
"Effect": "Allow",
"Action": ["s3:PutObject"],
"Resource": "arn:aws:s3:::examplebucket/*"
}
]
}
如果您不在EC2实例中运行此脚本,则需要使用访问密钥和秘密密钥。
您将需要AWS IAM访问密钥。
您遇到的问题是,您需要访问密钥才能调用STS(安全令牌服务),然后可以使用您的角色ARN处理AssumeRole(),然后生成新的临时访问密钥。
但是,如果您具有访问键,则无需使用AssumeRole()。
如果您的计算机不在AWS之外,那么您将需要使用访问密钥或Cognito之类的身份验证/授权服务。
IAM角色是为服务(例如Redshift,EC2等)设计的,这些服务有权使用您的角色ARN调用STS以生成新的临时访问密钥。 角色并非设计为在AWS外部调用(存在例外,例如Cognito)。
[在新评论后编辑]
您有几种解决方案:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.