Java AWS S3带弹簧启动错误“;配置文件不能为空";
我有IAM角色和客户区域。如何在我的Spring boot应用程序中授予访问S3的权限(EC2实例中不存在)Java AWS S3带弹簧启动错误“;配置文件不能为空";,java,spring,amazon-web-services,spring-boot,amazon-s3,Java,Spring,Amazon Web Services,Spring Boot,Amazon S3,我有IAM角色和客户区域。如何在我的Spring boot应用程序中授予访问S3的权限(EC2实例中不存在) @Configuration public class AWSConfiguration { String clientRegion = "..."; String roleARN = "..."; @Bean public AmazonS3 amazonS3Client() { try {
@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]
原因:java.lang.IllegalArgumentException:配置文件不能为null
在com.amazonaws.util.ValidationUtils.assertNotNull(ValidationUtils.java:37)~[aws-java-sdk-core-1.11.946.jar:na]
在com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:142)~[aws-java-sdk-core-1.11.946.jar:na]
在com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:133)~[aws-java-sdk-core-1.11.946.jar:na]
在com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:100)~[aws-java-sdk-core-1.11.946.jar:na]
在com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials(ProfileCredentialsProvider.java:135)~[aws-java-sdk-core-1.11.946.jar:na]
在com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1257)~[aws-java-sdk-core-1.11.946.jar:na]
在com.amazonaws.http.AmazonHttpClient$RequestExecutor.runBeforeRequestHandlers(AmazonHttpClient.java:833)~[aws-java-sdk-core-1.11.946.jar:na]
在com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:783)~[aws-java-sdk-core-1.11.946.jar:na]
我试图将ProfileCredentialsProvider更改为DefaultAWSCredentialsProviderChain.getInstance(),但它仍然给了我相同的错误,并询问我角色会话名称。您需要使用环境变量、java系统属性等提供凭据,才能担任角色。如果您的代码是从EC2实例运行的,并且正确配置了实例配置文件,则该角色将自动使用 这是一个分为两步的过程:
- 您需要向有权担任该角色的用户进行身份验证
- 然后,您可以检索角色的会话凭据,并使用它们以角色权限访问S3
您需要使用env变量、java系统属性等提供您的凭证,以便能够承担角色。如果您的代码是从EC2实例运行的,并且正确配置了实例配置文件,则该角色将自动使用 这是一个分为两步的过程:
- 您需要向有权担任该角色的用户进行身份验证
- 然后,您可以检索角色的会话凭据,并使用它们以角色权限访问S3
您正在使用较旧的v1javas3api。您应该考虑移动到Amazon S3的java V2 API。 你的问题看起来像是你如何树立自己的信念。如果您正在开发SpringBoot应用程序,则应使用环境变量设置凭据。例如:
Region region = Region.US_WEST_2;
S3Client s3 = S3Client.builder()
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
.region(region)
.build();
如果要将此web应用程序部署到(例如,AWS Elastic Beanstalk),则只需设置与Amazon S3交互的环境变量和Spring Boot应用程序
要了解如何从SpringBootWeb应用程序成功调用AmazonS3,请参阅本AWS教程。本教程讨论如何构建一个SpringBoot应用程序,该应用程序可以从AmazonS3存储桶(使用S3Javav2API)检索图像,并使用AmazonRekognition服务对其进行分析。还讨论了如何将web应用程序部署到Elastic Beanstalk
您正在使用较旧的V1 Java S3 API。您应该考虑移动到Amazon S3的java V2 API。 你的问题看起来像是你如何树立自己的信念。如果您正在开发SpringBoot应用程序,则应使用环境变量设置凭据。例如:
Region region = Region.US_WEST_2;
S3Client s3 = S3Client.builder()
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
.region(region)
.build();
如果要将此web应用程序部署到(例如,AWS Elastic Beanstalk),则只需设置与Amazon S3交互的环境变量和Spring Boot应用程序
要了解如何从SpringBootWeb应用程序成功调用AmazonS3,请参阅本AWS教程。本教程讨论如何构建一个SpringBoot应用程序,该应用程序可以从AmazonS3存储桶(使用S3Javav2API)检索图像,并使用AmazonRekognition服务对其进行分析。还讨论了如何将web应用程序部署到Elastic Beanstalk
您的凭据是否在某处配置(环境变量、Java系统属性等)?否。我假设基于roleArn和clientRegion,AWS SDK将获取凭据并在Java系统属性中设置凭据。我将此作为参考,您仍然需要首先获得授权才能检索会话证书。我是AWS新手。还有别的吗