Как получить доступ к S3 Bucket, защищенному ролью IAM, с помощью Java SDK? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть настройка S3 Bucket в AWS, которая защищена ролью IAM. Я пишу приложение, которое должно получить доступ к этому ведру. Приложение развернуто в кластере EKS и получает роль через настройку учетной записи службы (в соответствии с концепцией IRSA). Пока все работает нормально.

Но для тестирования / разработки я хочу иметь возможность запускать приложение и локально. Итак, как мне назначить роль IAM моему приложению при локальном запуске?

При работе в EKS разрешения обрабатываются кластером, поэтому из кода Java мне просто нужно создать клиент S3 по умолчанию и тогда я могу поместить объекты:

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
s3Client.putObject(bucketName, key, data);

Это, конечно, не будет работать из коробки локально.

У меня есть AWS Профиль, определенный в моем файле конфигурации:

[profile test]
role_arn = arn:aws:iam::...
source_profile = default
region = eu-central-1

### MFA Authenticated
[default]
region = eu-central-1

При входе в систему я могу видеть корзину с моей консоли, используя:

aws s3api list-objects --bucket <bucketname> --profile test

Я подключил свой профиль к приложению, предоставив переменные среды:

AWS_PROFILE=test
AWS_REGION=eu-central-1

Я тоже пытался с AWS_PROFILE="profile test".

При запуске моего кода я получаю

com.amazonaws.services.s3.model.AmazonS3Exception: 
Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.
(Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; 

Я использую Java SDK 1.11.738 и убедился в том, что Maven. xml что sdk-s3, sdk-core и sdk-kms имеют одинаковую версию:

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.738</version>
            <exclusions>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk-kms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>jmespath-java</artifactId>
                </exclusion>
            </exclusions>        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
            <version>1.11.738</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-kms</artifactId>
            <version>1.11.738</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>jmespath-java</artifactId>
            <version>1.11.738</version>
        </dependency>

1 Ответ

0 голосов
/ 11 марта 2020

Мне кажется, что у вас есть отдельные проблемы.

Ошибка, которую вы получаете, связана с тем, что вы не указали версию подписи.

System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");

Дополнительная литература .

Во-вторых, что касается роли, роль нужно будет установить в экземпляре EKS.

...