java - 在 ec2 上使用 java SDK 在 aws 中担任不同的角色,该 SDK 使用分配的 IAM 进行访问
问题描述
我在 EC2 实例上的 docker 容器中运行一个简单的 Java 应用程序。Java 应用程序本身没有硬编码凭证,并且 aws sdk 假定分配给 EC2 实例的凭证。
这工作正常,但我现在需要它在执行中期动态承担不同的角色。我试图让下面的代码帮助做到这一点,但我在倒数第二行遇到了一个异常“AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest);”
public void awsAssumeRole(String region,String roleARN, String roleName) {
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider())
.withRegion(region)
.build();
AssumeRoleRequest roleRequest = new AssumeRoleRequest()
.withRoleArn(roleARN)
.withRoleSessionName(roleName);
AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest);
Credentials sessionCredentials = roleResponse.getCredentials();
}
以下例外:
Exception in thread "main" java.lang.IllegalArgumentException: No AWS profile named 'default'
我通过的变量采用以下格式:
roleARN=arn:aws:iam::account-id
roleName=role/role-name-with-path
我不知道如何指定默认配置文件,因为运行应用程序的 docker 容器上没有凭据,甚至没有 .aws 文件夹来放置配置,而且我不能这样做,因为我们不允许对凭据进行编码。
有没有办法在我的情况下实现角色切换?
我正在运行当前在 intellij 中的应用程序,使用临时生成的凭据作为环境变量传递,以尝试复制应用程序在 docker 容器中运行期间将看到的内容,但我不知道这在复制如何准确应用程序将在 EC2 实例上的 docker 容器中运行。
我对 AWS 角色也很陌生,角色转换请原谅任何滥用的术语。
非常感谢
解决方案
根据评论,有两个问题:
- 的格式不正确
roleARN
。它应该是完整的角色。 - 使用
ProfileCredentialsProvidergets
代替EnvironmentVariableCredentialsProvider
。
推荐阅读
- python - 如何调整/重新训练 NLTK SentimentIntensityAnalyzer
- sql - 如何使用 SQL 根据时间戳序列创建时间序列?
- django - 扩展鹡鸰页面可见性并添加订阅计划
- reactjs - 如何在 react-edittext 中使用 'onSave()' 函数保存多个字段?
- linux - 程序集克隆系统调用线程函数未调用
- linux - .bss 部分中没有任何名称的符号和完成的.7392 符号
- asp.net - 如何使用代码存储在数据库中而不是文件中的 ASP.Net MVC 布局页面?
- javascript - 使用 jQuery 或 js 在导航链接点击时开始和停止背景视频?
- mysql - 在 WHERE 条件中使用 UNION 语句插入选择
- php - 动态更改(或用户更改)Wordpress 中的列数