Перемещайте файлы из одного ведра s3 в другое в AWS, используя AWS лямбда - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь переместить файлы старше часа из одного ведра s3 в другое ведро s3, используя python boto3 AWS лямбда-функцию в следующих случаях:

  1. Оба сегмента могут быть в одном аккаунт и другой регион.
  2. Оба сегмента могут быть в разных аккаунтах и ​​в разных регионах.
  3. Оба сегмента могут быть в разных аккаунтах и ​​в одном регионе.

Я получил некоторая помощь в перемещении файлов с использованием кода python, упомянутого @John Rotenstein

import boto3
from datetime import datetime, timedelta

SOURCE_BUCKET = 'bucket-a'
DESTINATION_BUCKET = 'bucket-b'

s3_client = boto3.client('s3')

# Create a reusable Paginator
paginator = s3_client.get_paginator('list_objects_v2')

# Create a PageIterator from the Paginator
page_iterator = paginator.paginate(Bucket=SOURCE_BUCKET)

# Loop through each object, looking for ones older than a given time period
for page in page_iterator:
    for object in page['Contents']:
        if object['LastModified'] < datetime.now().astimezone() - timedelta(hours=1):   # <-- Change time period here
            print(f"Moving {object['Key']}")

            # Copy object
            s3_client.copy_object(
                Bucket=DESTINATION_BUCKET,
                Key=object['Key'],
                CopySource={'Bucket':SOURCE_BUCKET, 'Key':object['Key']}
            )

            # Delete original object
            s3_client.delete_object(Bucket=SOURCE_BUCKET, Key=object['Key'])

Как это можно изменить в соответствии с требованиями

Ответы [ 2 ]

3 голосов
/ 28 мая 2020

Перемещение между регионами

Это не проблема. Вы можете просто скопировать объект между корзинами, и Amazon S3 разберется с этим.

Перемещение между учетными записями

Это немного сложнее, потому что код будет использовать один набор учетных данных, который должен иметь ListBucket и GetObject доступ к исходному сегменту плюс права PutObject на целевой сегмент.

Кроме того, если учетные данные используются из исходной учетной записи, то копирование должно выполняться с ACL='bucket-owner-full-control' в противном случае Целевая учетная запись не будет иметь прав доступа к объекту. Это не требуется, когда копирование выполняется с учетными данными из целевой учетной записи.

Допустим, лямбда-код выполняется в Account-A и копирует объект в Account-B. Роль IAM (Role-A) назначается лямбда-функции. Довольно просто предоставить Role-A доступ к корзинам в Account-A. Однако лямбда-функции потребуются разрешения на PutObject в сегменте (Bucket-B) в Account-B. Следовательно, вам нужно добавить политику корзины к Bucket-B, которая позволяет использовать от Role-A до PutObject в корзине. Таким образом, Role-A имеет разрешение на чтение из Bucket-A и запись в Bucket-B.

Итак, сложив все вместе:

  • Создайте роль IAM (Role-A) для функции Lambda
  • Предоставьте роли доступ для чтения / записи по мере необходимости для сегментов в той же учетной записи
  • Для сегментов в других учетных записях добавьте политику сегмента, которая предоставляет необходимые разрешения на доступ к роли IAM (Role-A)
  • В команду copy_object() включите ACL='bucket-owner-full-control' (это единственное необходимое изменение кодировки)
  • Не беспокойтесь о том, чтобы делать что-либо для разных регионов, это должно работать автоматически
1 голос
/ 03 июня 2020

Альтернативный подход - использовать Amazon S3 Replication , который может реплицировать содержимое корзины:

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

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

Репликация требует, чтобы управление версиями было активировано как в исходном, так и в целевом сегментах. Если вам требуется шифрование, используйте стандартные параметры шифрования Amazon S3 . Данные также будут зашифрованы во время передачи.

Вы настраиваете сегмент источника и сегмент назначения, а затем указываете, какие объекты реплицировать, указав префикс или тег. Объекты будут реплицированы только после активации репликации. Существующие объекты не копируются. Удаление не намеренно реплицируется во избежание злонамеренных действий. См .: Что реплицирует Amazon S3?

Репликация S3 не требует дополнительных затрат, но вы все равно будете платить за передачу данных при перемещении объектов между регионами, а также за Запросы API (это крошечные расходы), плюс, конечно же, хранилище.

...