Amazon SDK - 临时凭证和 AssumeRoleRequest

Posted

技术标签:

【中文标题】Amazon SDK - 临时凭证和 AssumeRoleRequest【英文标题】:Amazon SDK - Temporary Credentials and AssumeRoleRequest 【发布时间】:2017-06-16 01:49:07 【问题描述】:

我正在使用 1.11.79 版的 Amazon Java SDK 我有一份创建所有服务器卷快照的工作。 使用 sleep 等(以满足 Amazon SDK 指南)- 这已经开始需要一个多小时

我使用以下代码使用临时凭证构建我的 AmazonEC2Client

        AssumeRoleRequest assumeRequest = new AssumeRoleRequest().withRoleArn(roleARN).withExternalId(externalId).withDurationSeconds(3600)
            .withRoleSessionName(roleSessionName);

    AssumeRoleResult assumeResult = amazonSecurityTokenServiceClient.assumeRole(assumeRequest);
    Credentials credentials = assumeResult.getCredentials();

    temporaryCredentials = new BasicSessionCredentials(credentials.getAccessKeyId(), credentials.getSecretAccessKey(), credentials.getSessionToken());

    CustomAmazonCredentialsProviderVO customAmazonCredentialsProviderVO = new CustomAmazonCredentialsProviderVO();
    customAmazonCredentialsProviderVO.setCredentials(temporaryCredentials);
    LOG.debug("customAmazonCredentialsProviderVO:", customAmazonCredentialsProviderVO);

    amazonEC2Client = new AmazonEC2Client(customAmazonCredentialsProviderVO, amazonClientConfiguration);

问题在于 AssumeRoleRequest 和 withDurationSeconds 方法 - 您可以将其设置的最大值为 3600 秒(1 小时)

我需要能够将其设置为 2 或 3 小时

有谁知道是否有另一种方法可以创建持续时间超过 1 小时的临时凭证?

谢谢 达米安

【问题讨论】:

【参考方案1】:

您可以使用GetSessionToken,如果您是 IAM 用户,它接受高达 129600 的 DurationSeconds 值。

来自文档:

IAM 用户创建的凭证在您指定的持续时间内有效,从 900 秒(15 分钟)到最长 129600 秒(36 小时),默认为 43200 秒(12 小时)

【讨论】:

这很有用,但不幸的是我们没有使用 IAM,因为我们管理的一些服务器位于许多不同的亚马逊账户中 在这种情况下,我认为没有任何选项可用于请求凭据超过一个小时。您可以尝试在到期时用新生成的令牌替换令牌并继续快照。 你有没有使用过这个类 - 只是想知道是否以及何时会调用刷新方法 - docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/… 不,我没有使用它,但从我读到的刷新是由凭据提供程序在到期时自动调用的,或者您也可以手动调用它 是的,我现在尝试在那里实现该类以强制刷新凭据,但到目前为止还没有任何乐趣【参考方案2】:

假设您可以控制工作所承担的角色,您可以简单地设置MaxSessionDuration 属性。来自docs(强调我的):

指定角色的最大会话持续时间(以秒为单位)。 使用 AWS CLI 或 API 代入角色的任何人都可以使用可选的 DurationSeconds API 参数或 duration-seconds CLI 参数指定持续时间。最小值为 3600。最大值为 43200。

增加此限制应该允许您在 AssumeRoleRequest 中使用 > 3600 的值。

我刚刚使用适用于 .NET 的 AWS 开发工具包进行了尝试,它似乎工作正常。

【讨论】:

【参考方案3】:

对于那些进入此线程并希望确保会话始终存在的解决方案的人。您可以使用 AWS SDK 提供的 STSAssumeRoleSessionCredentialsProvider ,但请注意它会创建额外的线程以确保会话处于活动状态。您还可以使用不创建额外线程的自定义实现,如下面的 netflix 实现:

https://www.javatips.net/api/SimianArmy-master/src/main/java/com/netflix/simianarmy/aws/STSAssumeRoleSessionCredentialsProvider.java

【讨论】:

以上是关于Amazon SDK - 临时凭证和 AssumeRoleRequest的主要内容,如果未能解决你的问题,请参考以下文章

Spark 和 Amazon S3 未在执行程序中设置凭证

为啥我们必须在 OAuth 中“更改令牌凭证的临时凭证”?

凭证文件未在 Amazon Linux 上读取 Rails 6.1

Django-Haystack 使用带有 IAM 凭证的 Amazon Elasticsearch 托管

Amazon SES 从实例配置文件元数据服务器检索凭证时出错。 (客户端错误:404)

如何使用带有 IAM 凭证的 psql 客户端访问 Amazon AWS Redshift