Загрузить файл в корзину S3 с использованием учетных данных IAM и политики Java AWS SDK - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь загрузить файл в корзину S3. Сначала я создаю клиента AmazonS3 с помощью InstanceProfileCredentialsProvider и получаю учетные данные IAM из метаданных экземпляра:

final AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
    .withCredentials(new InstanceProfileCredentialsProvider(false))
    .withRegion("eu-west-1").build();

Роль, связанная с этим экземпляром, имеет политику доступа и загрузки файлов в корзину:

{  
    "Version":"2012-10-17",
       "Statement":{  
  "Action":[  
     "kms:Decrypt",
     "kms:DescribeKey",
     "kms:Encrypt",
     "kms:GenerateDataKey",
     "kms:ReEncryptFrom",
     "kms:ReEncryptTo",
     "s3:GetObject",
     "s3:ListBucket",
     "s3:PutObject*"
  ],
          "Effect":"Allow",
          "Resource":[  
          "arn:aws:kms:eu-west-1:[account-id]:key/[key-id]",
          "arn:aws:s3:::[bucket-name]",
          "arn:aws:s3:::[bucket-name]/[path-were-to-save-file]/*" 

  ]}}

Я пытаюсь загрузить файл так:

final PutObjectRequest request = new PutObjectRequest("[bucket-name]", file.getName(), file);

s3Client.putObject(request);

но я получаю Отказ в доступе AmazonS3ClientException. Есть идеи, что мне не хватает?

Я также попытался включить ключ kms в запрос:

final PutObjectRequest request = new PutObjectRequest("[bucket-name]", file.getName(), file)
                .withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams("[key-id]"));

но он пытается получить ключ из моей учетной записи:

arn:aws:kms:eu-west-1:[my-account-id]:key/[key-id]

не указанная в полисе учетная запись:

arn:aws:kms:eu-west-1:[account-id]:key/[key-id]

и выдает KMSNotFoundException

1 Ответ

0 голосов
/ 27 мая 2019

Кажется, мне нужно указать полный путь, где я хочу, чтобы файл был сохранен, и я могу сбросить ключ:

final PutObjectRequest request = new PutObjectRequest("[bucket-name]", "[path-were-to-save-file]/" + file.getName(), file);

Если необходимо передать ключ, необходимо указать полный арн, а не только идентификатор ключа:

final PutObjectRequest request = new PutObjectRequest("[bucket-name]", file.getName(), file)
    .withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams("arn:aws:kms:eu-west-1:[account-id]:key/[key-id]"));
...