我有iam角色和客户区域。如何在我的spring boot应用程序中授予访问s3的权限,而这在ec2示例中是不存在的?
@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(),但它仍然给出相同的错误,并询问我角色会话名称。
2条答案
按热度按时间neskvpey1#
您需要使用env变量、java系统属性等提供您的凭证。sdk能够承担一个角色。如果您的代码是从正确配置了示例概要文件的ec2示例运行的,则这不是必需的,角色将自动使用。
这是一个两步过程:
您需要向有权承担该角色的用户进行身份验证
然后可以检索角色的会话凭据,并使用它们访问具有角色权限的s3
要在ec2中使用,您可以在这里找到文档。
编辑:
了解使用访问密钥访问aws的最佳实践的好页面:here
对于在示例上运行的应用程序、aws cli和windows powershell命令工具,您不必显式获取临时安全凭据aws SDK、aws cli和windows powershell工具会自动从ec2示例元数据服务获取凭据并使用它们。要使用临时安全凭据在示例外部进行调用(例如,测试iam策略),必须提供访问密钥、密钥和会话令牌。
pdtvr36n2#
您使用的是旧的v1javas3api。您应该考虑为amazons3使用javav2api。
你的问题看起来像是你如何树立你的信用。如果您正在开发spring引导应用程序,那么应该使用环境变量设置凭据。例如:
如果您想将这个web应用程序部署到(例如,aws elastic beanstalk),那么只需设置环境变量和与amazons3交互的spring引导应用程序。
要了解如何从springbootweb应用程序成功调用amazons3,请参阅本aws教程。本教程讨论如何构建一个spring引导应用程序,该应用程序可以从amazons3 bucket(使用s3javav2api)检索图像,并使用amazonrekognition服务对其进行分析。还讨论了如何将web应用部署到elasticbeanstalk。
使用aws sdk for java创建示例aws照片分析器应用程序