aws s3,spring引导错误“profile file cannot be null”

6gpjuf90  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(577)

我有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(),但它仍然给出相同的错误,并询问我角色会话名称。

neskvpey

neskvpey1#

您需要使用env变量、java系统属性等提供您的凭证。sdk能够承担一个角色。如果您的代码是从正确配置了示例概要文件的ec2示例运行的,则这不是必需的,角色将自动使用。
这是一个两步过程:
您需要向有权承担该角色的用户进行身份验证
然后可以检索角色的会话凭据,并使用它们访问具有角色权限的s3
要在ec2中使用,您可以在这里找到文档。
编辑:
了解使用访问密钥访问aws的最佳实践的好页面:here
对于在示例上运行的应用程序、aws cli和windows powershell命令工具,您不必显式获取临时安全凭据aws SDK、aws cli和windows powershell工具会自动从ec2示例元数据服务获取凭据并使用它们。要使用临时安全凭据在示例外部进行调用(例如,测试iam策略),必须提供访问密钥、密钥和会话令牌。

pdtvr36n

pdtvr36n2#

您使用的是旧的v1javas3api。您应该考虑为amazons3使用javav2api。
你的问题看起来像是你如何树立你的信用。如果您正在开发spring引导应用程序,那么应该使用环境变量设置凭据。例如:

Region region = Region.US_WEST_2;
    S3Client s3 = S3Client.builder()
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .region(region)
            .build();

如果您想将这个web应用程序部署到(例如,aws elastic beanstalk),那么只需设置环境变量和与amazons3交互的spring引导应用程序。
要了解如何从springbootweb应用程序成功调用amazons3,请参阅本aws教程。本教程讨论如何构建一个spring引导应用程序,该应用程序可以从amazons3 bucket(使用s3javav2api)检索图像,并使用amazonrekognition服务对其进行分析。还讨论了如何将web应用部署到elasticbeanstalk。
使用aws sdk for java创建示例aws照片分析器应用程序

相关问题