【发布时间】:2020-03-27 22:49:28
【问题描述】:
我正在使用可以连接到 S3 存储桶和 Redshift 实例的 EC2 实例。在 EC2 实例的命令行中,我可以执行 aws s3 ls s3://my-bucket/my-folder/ 并且它神奇地工作。但是,在 Redshift 中,当我想使用 copy 命令导入数据时,我需要提供凭据。
aws CLI 使用的凭据在我的~/.aws/credentials 文件中不存在。我发现我可以使用 boto3 Python 库来推断我的(显然是临时的)凭据,如下所示:
session = boto3.Session()
creds = session.get_credentials()
creds = creds.get_frozen_credentials()
credentials = {
'aws_access_key_id': creds.access_key,
'aws_secret_access_key': creds.secret_key,
'token': creds.token,
}
credStr = ';'.join(k+'='+v for k,v in sorted(credentials.items()))
这给了我一个如下所示的凭据字符串:
aws_access_key=XXX;aws_secret_access_key=YYY;token=ZZZ
然后我可以使用该凭据字符串在 Redshift 中编写 copy 语句,如下所示:
copy
my_table
from
's3://my-bucket/my.manifest'
credentials 'aws_access_key=XXX;aws_secret_access_key=YYY;token=ZZZ'
manifest
我已经编写了一个帮助脚本,我可以从命令行调用它来吐出我的凭据,但是如果我可以从aws cli 工具中获取上述信息会更简洁,而不必调用国产 Python 脚本。
SO:我如何使用 aws CLI 执行 boto3.Session().get_credentials().get_frozen_credentials() 的等效操作?
提前感谢您的帮助。
编辑: 请注意:运行aws sts get-caller-identity 意味着我是以角色而非用户身份运行的。因此,调用aws sts get-session-token 将不起作用,因为roles cannot request temporary credentials。
【问题讨论】:
标签: amazon-web-services amazon-s3 amazon-redshift boto3 aws-cli