【问题标题】:What is the AWS CLI equivalent of boto3's Session.get_credentials() function?boto3 的 Session.get_credentials() 函数的 AWS CLI 等效项是什么?
【发布时间】: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


    【解决方案1】:

    试试aws sts get-session-token

    您的输出应如下所示:

    {
        "Credentials": {
            "AccessKeyId": "XXXXXXXXX",
            "SecretAccessKey": "XXXXXXXX",
            "SessionToken": "XXXXXXX",
            "Expiration": "2020-03-18T08:15:08Z"
        }
    }
    

    【讨论】:

    • 谢谢!但是,我相信我需要推断 existing 凭据的值,而我相信 get-session-token 会生成 new 凭据。当我运行 aws sts get-session-token 时,我得到:“调用 GetSessionToken 操作时发生错误(AccessDenied):无法使用会话凭据调用 GetSessionToken”。
    • 这些是基于您的长期凭证的临时凭证。它们只存在到“到期”时。它们不是永久性的,完全适合您的用例。对于该错误,您似乎无权调用“get-session-token”。检查 cli 用户的 IAM 政策。
    • 请查看此评论:stackoverflow.com/questions/35873012/…“[R]oles 无法请求临时凭据。只有实际用户才能这样做。”我显然是作为一个角色登录的(顺便说一下,aws sts get-caller-identity 返回的 arn 暗示了这一点)。因此,我需要一种方法来获取我的角色凭据。使用 aws sts get-session-token 请求新凭据是不可能的,因为我显然是在扮演角色,而不是用户。
    【解决方案2】:

    对于通过 Google 找到此问题的任何人,this page 引导我找到此解决方案:

    role=$(curl http://169.254.169.254/latest/meta-data/iam/security-credentials)
    
    # The below also works to get the role, but it is slower and has more dependencies.
    #role=$(aws sts get-caller-identity | jq -r ".Arn" | sed -r 's@.*assumed-role/(.*)/.*@\1@')
    
    api_token=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
    
    read -r key secret token <<<$(curl -H "X-aws-ecw-metadata-token: $api_token" -v http://169.254.169.254/latest/meta-data/iam/security-credentials/$role | jq -r '.AccessKeyId,.SecretAccessKey,.Token')
    
    creds="aws_access_key_id=$key;aws_secret_access_key=$secret;token=$token"
    

    如果有人知道的话,我仍然很想知道在aws CLI 中是否有一种方法可以将其作为一步过程执行...

    编辑:在下面加入了迈克尔的有用建议。

    编辑:修正了aws_access_key中的错字。

    【讨论】:

    • 不,我不这么认为,但您应该能够通过点击元数据端点http://169.254.169.254/latest/meta-data/iam/info 更快地获取角色名称,并且它会比您调用sts get-caller-identity 快得多.
    • 谢谢!看起来 iam/info 中的角色在我想要的“正常”部分之后有一个角色名称,上面有更多的破折号,但我也可以从 iam/security-credentials 中获取角色,并且只使用你描述的 curl 是干净得多。谢谢你的帮助。我已将该更改纳入答案。
    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2018-09-02
    • 2015-10-04
    • 2012-08-16
    • 2012-08-03
    相关资源
    最近更新 更多