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的主要内容,如果未能解决你的问题,请参考以下文章
凭证文件未在 Amazon Linux 上读取 Rails 6.1
Django-Haystack 使用带有 IAM 凭证的 Amazon Elasticsearch 托管