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

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

Bucket 1:
 - file1.gz
 - file2.gz
 - ...

Bucket 2:
 - manifest

Вот команда, которую я пытался скопировать данные из корзины 1, используя манифест в корзине 2:

-- Load data from s3
copy data_feed_eval from 's3://bucket-2/data_files._manifest'
CREDENTIALS 'aws_access_key_id=bucket_1_key;aws_secret_access_key=bucket_1_secret'
manifest
csv gzip delimiter ',' dateformat 'YYYY-MM-DD' timeformat 'YYYY-MM-DD HH:MI:SS'
maxerror 1000 TRUNCATECOLUMNS;

Однако при выполнении этой команды я получаю следующую ошибку:

09:45:32  [COPY - 0 rows, 7.576 secs]  [Code: 500310, SQL State: XX000]  [Amazon](500310) Invalid operation: Problem reading manifest file - S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid 901E02533CC5010D,ExtRid tEvf/TVfZzPfSNAFa8iTYjTBjvaHnMMPmuwss58SwopY/sZSkhUBe3yMGHTDyA0yDhDCD7ybX9gl45pV/eQ=,CanRetry 1
Details: 
 -----------------------------------------------
  error:  Problem reading manifest file - S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid 901E02533CC5010D,ExtRid tEvf/TVfZzPfSNAFa8iTYjTBjvaHnMMPmuwss58SwopY/sZSkhUBe3yMGHTDyA0yDhDCD7ybX9gl45pV/eQ=,CanRetry 1
  code:      8001
  context:   s3://bucket-2/data_files._manifest
  query:     2611231
  location:  s3_utility.cpp:284
  process:   padbmaster [pid=10330]
  -----------------------------------------------;

Я считаю, что проблема заключается в том, что я передаю учетные данные bucket_1 в своей команде COPY. Можно ли передать учетные данные для нескольких сегментов (bucket_1 с фактическими файлами и bucket_2 с манифестом) в команду COPY? Как мне подойти к этому, если у меня нет прав на запись в bucket_1?

1 ответ

Вы указали, что ключ bucket_1_key (который является пользователем IAM) имеет права, ограниченные только для чтения из bucket_1. Если это так, то возникает ошибка, потому что у этого ключа нет разрешения на чтение из bucket_2. Вы уже упомянули это возможную причину, и это именно так.

Нет возможности предоставить два набора ключей для команды COPY. Но вы должны рассмотреть следующие варианты:

Опция 1

В соответствии с этим "Вы можете указать файлы для загрузки, используя префикс объекта Amazon S3 или файл манифеста". Если есть общий префикс для набора файлов, который вы хотите загрузить, вы можете использовать этот префикс в bucket_1 в команде COPY. См. http://docs.aws.amazon.com/redshift/latest/dg/t_loading-tables-from-s3.html

Вы упомянули, что у вас есть доступ только для чтения к корзине 1. Убедитесь, что это достаточный доступ, как определено в http://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-access-permissions.html

Все остальные параметры требуют изменения ваших пользовательских /IAM-разрешений или самого Redshift.

Вариант 2

Расширьте права доступа к ключу bucket_1_key для возможности чтения из bucket_2. Вам нужно убедиться, что ваш ключ bucket_1_key имеет доступ LIST к bucket_2 и доступ GET для объектов bucket_2 ( как описано здесь). Таким образом, вы можете продолжить использовать ключ bucket_1_key в команде COPY. Этот метод называется управлением доступом на основе ключей и использует идентификатор открытого текста и секретный ключ доступа. AWS рекомендует вместо этого использовать контроль доступа на основе ролей (вариант 3).

Вариант 3

Используйте роль IAM в команде COPY вместо ключа (вариант 2). Это называется управлением доступом на основе ролей. Также настоятельно рекомендуется использовать опцию аутентификации в команде COPY. Эта роль IAM должна иметь привилегии для доступа к LIST в сегментах 1 и 2 и доступа GET для объектов в этих сегментах.

Более подробная информация о контроле доступа на основе ключей и ролей находится здесь.

Другие вопросы по тегам