【发布时间】:2023-03-14 07:05:01
【问题描述】:
我有 IAM 角色和客户区域。如何在 EC2 实例中不存在的 Spring Boot 应用程序中授予访问 S3 的权限?
@Configuration
public class AWSConfiguration {
String clientRegion = "...";
String roleARN = "...";
@Bean
public AmazonS3 amazonS3Client() {
try {
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider()).withRegion(clientRegion).build();
AssumeRoleRequest roleRequest = new AssumeRoleRequest().withRoleArn(roleARN);
AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest);
Credentials sessionCredentials = roleResponse.getCredentials();
BasicAWSCredentials basicAwsCred = new BasicAWSCredentials(sessionCredentials.getAccessKeyId(), sessionCredentials.getSecretAccessKey());
return AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(basicAwsCred)).withRegion(clientRegion).build();
} catch (AmazonServiceException e) {
e.printStackTrace();
} catch (SdkClientException e) {
e.printStackTrace();
}
return null;
}
}
我收到以下错误
Caused by: java.lang.IllegalArgumentException: profile file cannot be null
at com.amazonaws.util.ValidationUtils.assertNotNull(ValidationUtils.java:37) ~[aws-java-sdk-core-1.11.946.jar:na]
at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:142) ~[aws-java-sdk-core-1.11.946.jar:na]
at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:133) ~[aws-java-sdk-core-1.11.946.jar:na]
at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:100) ~[aws-java-sdk-core-1.11.946.jar:na]
at com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials(ProfileCredentialsProvider.java:135) ~[aws-java-sdk-core-1.11.946.jar:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1257) ~[aws-java-sdk-core-1.11.946.jar:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.runBeforeRequestHandlers(AmazonHttpClient.java:833) ~[aws-java-sdk-core-1.11.946.jar:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:783) ~[aws-java-sdk-core-1.11.946.jar:na]
我尝试将 ProfileCredentialsProvider 更改为 DefaultAWSCredentialsProviderChain.getInstance() 但它仍然给我同样的错误并且还询问我角色会话名称。
【问题讨论】:
-
您的凭据是否配置在某处(环境变量、Java 系统属性等?)
-
没有。我假设基于 roleArn 和 clientRegion,AWS SDK 将获取凭证并将其设置在 java 系统属性中。我将此称为参考docs.aws.amazon.com/AmazonS3/latest/dev/…
-
您仍然需要先进行身份验证才能检索会话凭据
-
我是 AWS 新手。有没有其他方法可以通过只有 roleArn 和 clientRegion 来连接 S3?
-
不,AWS 需要先检查您是否被允许担任该角色。如果您承诺,您需要使用环境或系统属性等...如果您在 EC2 中运行您的应用程序,您可以将角色配置到实例配置文件中,然后调用 S3 将使用实例角色
标签: java spring amazon-web-services spring-boot amazon-s3