Разрешения для файлов Amazon S3, доступ запрещен при копировании с другой учетной записи

У меня есть набор видеофайлов, которые были скопированы из одного ведра AWS из другого аккаунта в мою учетную запись в моем собственном ковше.

Теперь у меня возникает проблема со всеми файлами, в которых я получаю ошибки, связанные с доступом, когда пытаюсь сделать все файлы общедоступными.

В частности, я заходил в свою учетную запись AWS, перешел на S3, развернул структуру папок, чтобы найти один из видеофайлов.

Когда я смотрю на этот конкретный файл, вкладка "Разрешения" в файлах не предоставляет никаких прав, назначенных кому-либо. Пользователям, группам или системным разрешениям не назначено.

В нижней части вкладки "Разрешения" я вижу небольшую рамку с надписью "Ошибка: доступ запрещен". Я ничего не могу изменить о файле. Я не могу добавить метаданные. Я не могу добавить пользователя в файл. Я не могу сделать файл Public.

Есть ли способ получить контроль над этими файлами, чтобы я мог сделать их общедоступными? Есть более 15 000 файлов/около 60 ГБ файлов. Я бы хотел избежать загрузки и повторной загрузки всех файлов.

С некоторой помощью и предложениями от людей здесь я пробовал следующее. Я создал новую папку в своем ковше под названием "media".

Я пробовал эту команду:

aws s3 cp s3://mybucket/2014/09/17/thumb.jpg s3://mybucket/media --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers full=emailaddress=my_aws_account_email_address

Я получаю фатальную ошибку 403 при вызове операции HeadObject: Запрещено.

Ответ 1

Очень интересная головоломка! К счастью, есть решение.

Во-первых, recap:

  • Ведро A на счете A
  • Ведро B в учетной записи B
  • Пользователь в учетной записи A копирует объекты в Bucket B (получив соответствующие разрешения для этого)
  • Объекты в ведро B по-прежнему принадлежат учетной записи A, а недоступны учетной записью B

Мне удалось воспроизвести это и подтвердить, что пользователи в учетной записи B не могут получить доступ к файлу - даже пользователь root в Account B!

К счастью, все может быть исправлено. Команда aws s3 cp в интерфейсе командной строки AWS может обновлять разрешения для файла при копировании с тем же именем. Однако, чтобы вызвать это, вам также нужно обновить что-то еще, иначе вы получите эту ошибку:

Этот запрос на копирование является незаконным, поскольку он пытается скопировать объект сам по себе, не изменяя метаданные объекта, класс хранения, местоположение перенаправления веб-сайта или атрибуты шифрования.

Следовательно, разрешения могут быть обновлены с помощью этой команды:

aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --acl bucket-owner-full-control --metadata "One=Two"
  • Должен выполняться учетной записью Пользователь, имеющий права доступа к объектам (например, пользователь, который первоначально скопировал объекты в Bucket B)
  • Содержимое метаданных не имеет значения, но необходимо принудительно обновить
  • --acl bucket-owner-full-control предоставит разрешение учетной записи B, чтобы вы могли использовать объекты как обычно.

Конечный результат: Ведро, которое вы можете использовать!

Ответ 2

aws s3 cp s3://account1/ s3://accountb/ --recursive --acl bucket-owner-full-control 

Ответ 3

В случае, если кто-то пытается сделать то же самое, но использует задание Hadoop/Spark вместо AWS CLI.

  • Шаг 1. Предоставьте пользователю в учетной записи соответствующие разрешения на копирование объектов в Bucket B. (упомянуто в ответе выше)
  • Шаг 2: Установите параметр конфигурации fs.s3a.acl.default с помощью Hadoop Configuration. Это может быть установлено в файле conf или в программе:

    Conf файл:

    <property> <name>fs.s3a.acl.default</name> <description>Set a canned ACL for newly created and copied objects. Value may be Private, PublicRead, PublicReadWrite, AuthenticatedRead, LogDeliveryWrite, BucketOwnerRead, or BucketOwnerFullControl.</description> <value>$chooseOneFromDescription</value> </property>

    Программный:

    spark.sparkContext.hadoopConfiguration.set("fs.s3a.acl.default", "BucketOwnerFullControl")

Ответ 4

Чтобы правильно установить соответствующие разрешения для вновь добавленных файлов, добавьте эту политику корзины:

[...]
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::123456789012::user/their-user"
    },
    "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
    ],
    "Resource": "arn:aws:s3:::my-bucket/*"
}

И установите ACL для вновь созданных файлов в коде. Пример Python:

import boto3

client = boto3.client('s3')
local_file_path = '/home/me/data.csv'
bucket_name = 'my-bucket'
bucket_file_path = 'exports/data.csv'
client.upload_file(
    local_file_path,
    bucket_name, 
    bucket_file_path, 
    ExtraArgs={'ACL':'bucket-owner-full-control'}
)

источник: https://medium.com/artificial-industry/how-to-download-files-that-others-put-in-your-aws-s3-bucket-2269e20ed041 (выражение об отказе: написано мной)

Ответ 5

Я боюсь, что вы не сможете передать право собственности, как хотите. Вот что вы сделали:

Старый аккаунт копирует объекты в новую учетную запись.

"Правильный" способ сделать это (если вы хотите взять на себя право собственности на новую учетную запись):

Новая учетная запись копирует объекты из старой учетной записи.

Посмотрите небольшое, но важное различие? S3 docs объясните это.

Я думаю, вам может быть без него, без необходимости загружать все это, просто скопировав все файлы в одном ведро, а затем удалив старые файлы. Убедитесь, что вы можете изменить разрешения после выполнения копии. Это также должно сэкономить вам деньги, так как вам не придется платить за передачу данных за все.

Ответ 6

положив

--acl полный контроль владельца ковша заставил его работать.