Как скопировать файлы между корзинами S3 в 2 разных аккаунта с помощью boto3 - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь передать файлы из корзины S3 вендора в мою корзину S3 с помощью boto3. Я использую сервис sts, чтобы взять на себя роль для доступа к ведру поставщика s3. Я могу подключиться к корзине продавца и получить список корзины. Я сталкиваюсь с ошибкой CopyObject operation: Access Denied при копировании в мое ведро. Вот мой сценарий

session = boto3.session.Session(profile_name="s3_transfer")
sts_client = session.client("sts", verify=False)
assumed_role_object = sts_client.assume_role(
    RoleArn="arn:aws:iam::<accountid>:role/assumedrole",
    RoleSessionName="transfer_session",
    ExternalId="<ID>",
    DurationSeconds=18000,
)

creds = assumed_role_object["Credentials"]
src_s3 = boto3.client(
    "s3",
    aws_access_key_id=creds["AccessKeyId"],
    aws_secret_access_key=creds["SecretAccessKey"],
    aws_session_token=creds["SessionToken"],
    verify=False,
)
paginator =src_s3.get_paginator("list_objects_v2")
# testing with just 2 items.
# TODO: Remove MaxItems once script works.
pages = paginator.paginate(
    Bucket="ven_bucket", Prefix="client", PaginationConfig={"MaxItems": 2, "PageSize": 1000}
)
dest_s3 = session.client("s3", verify=False)
for page in pages:
    for obj in page["Contents"]:
        src_key = obj["Key"]
        des_key = dest_prefix + src_key[len(src_prefix) :]
        src = {"Bucket": "ven_bucket", "Key": src_key}
        print(src)
        print(des_key)
        dest_s3.copy(src, "my-bucket", des_key, SourceClient=src_s3)

В строке dest_s3.copy... я получаю сообщение об ошибке. У меня есть следующая политика моего пользователя aws, разрешающая копирование в мое ведро

{
    "Version": "2012-10-17",
   "Statement": [
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket/*",
            "arn:aws:s3:::my-bucket/"
        ]
    }
    ]
}

Я получаю следующую ошибку при запуске вышеуказанного скрипта.

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied

1 Ответ

2 голосов
/ 31 мая 2019

Команда CopyObject() может использоваться для копирования объектов между группами без необходимости загрузки / выгрузки.По сути, два сегмента S3 взаимодействуют друг с другом и передают данные.

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

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

  • GetObject разрешение наразрешение исходного сегмента
  • PutObject для целевого сегмента

Также обратите внимание, что команда CopyObject() отправлена ​​на целевую учетную запись .Целевой контейнер эффективно извлекает объекты из исходного контейнера .

. По вашему описанию, ваш код принимает роль от другой учетной записи , чтобы получить разрешение на чтение дляисходное ведро.К сожалению, этого недостаточно для команды CopyObject(), потому что команда должна быть отправлена ​​в область назначения.(Да, это немного сложно отличить от документации. Именно поэтому исходная корзина имеет конкретное имя, а не целевую.)

Следовательно, в вашей ситуации можно скопироватьобъекты, вам нужно будет использовать набор учетных данных из Account-B (место назначения) , который также имеет разрешение на чтение из Bucket-A (источник).Это потребует от поставщика изменения политики сегментов , связанной с Bucket-A.

Если они не хотят этого делать, то единственным вариантом является загрузка объектов с использованиемпредполагаемая роль , а затем отдельно загружать файлы в свое собственное ведро, используя учетные данные из собственного Account-B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...