Чтение и запись из / в ведро S3 с использованием точек доступа с помощью boto3 - PullRequest
1 голос
/ 29 мая 2020

Мне нужно получить доступ к корзине S3, используя точки доступа с boto3.

Я создал точку доступа с политикой, разрешающей чтение и запись (<access_point_arn> - моя точка доступа ARN):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["s3:GetObject", "s3:PutObject"],
            "Resource": "<access_point_arn>/object/*"
    ]
}

В официальной документации есть упоминание о точках доступа, где точка доступа ARN должна стоять вместо имени корзины (https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html). На официальном сайте документации для разработчиков нет примеров (https://docs.aws.amazon.com/AmazonS3/latest/dev/using-access-points.html).

Итак, основываясь на информации, я предполагаю, что правильный способ его использования:

import boto3
s3 = boto3.resource('s3')
s3.Bucket('<access_point_arn>').download_file('hello.txt', '/tmp/hello.txt')

Когда я выполняю этот код в Lambda с подключенной управляемой политикой AmazonS3FullAccess, я получаю ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden

Точка доступа Lambda и S3 подключены к одному и тому же VP C.

Ответы [ 2 ]

2 голосов
/ 08 июля 2020

Сначала я предполагаю, что вам не хватает разрешений, которые должны быть определены (1) для корзины (политика корзины) и (2) для пользователя или роли IAM, которые вы используете в boto3 SDK.

(1) Из документации я вижу, что

Чтобы приложение или пользователь мог получить доступ к объектам через точку доступа, обе точки доступа и базовая корзина должна разрешать запрос .

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

(2) Как указано в вашем вопросе, вы уже используете политику AmazonS3FullAccess в своей роли LambdaExecutionRole. Мое единственное предположение (то есть то, что случилось со мной) - это, например, KMS-шифрование для объектов в вашей корзине, а у вашей роли отсутствуют разрешения для действий kms. Попробуйте выполнить функцию с прикрепленной политикой администратора и посмотрите, работает ли она. Если да, выясните, какие именно разрешения c отсутствуют.

Некоторые дополнительные примечания: я полагаю, вы

  • не ограничивали доступность точки доступа в пределах указанного c только VP C.
  • блокируют доступ c publi.
0 голосов
/ 29 мая 2020

заменить ...

"Ресурс": "arn: aws: s3: region_name: <12-di git account_id>: bucket_name"
s3.Bucket ('bucket_name' ) .download_file ('hello.txt', '/tmp/hello.txt')

Надеюсь, это поможет ...

...