Импортируйте данные Postgres в RDS, используя S3 и aws_s3 - PullRequest
0 голосов
/ 30 октября 2019

Мне трудно импортировать данные из S3 в экземпляр RDS postgres. Согласно документам , вы можете использовать этот синтаксис:

aws_s3.table_import_from_s3 (
   table_name text, 
   column_list text, 
   options text, 
   bucket text, 
   file_path text, 
   region text, 
   access_key text, 
   secret_key text, 
   session_token text 
) 

Итак, в pgAdmin я сделал это:

SELECT aws_s3.table_import_from_s3(
  'contacts_1', 
  'firstname,lastname,imported', 
  '(format csv)',
  'com.foo.mybucket', 
  'mydir/subdir/myfile.csv', 
  'us-east-2',
  'AKIAYYXUMxxxxxxxxxxx',
  '3zB4S5jb1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
);

Я также попробовал его сЯвное значение NULL для последнего параметра.

Я получаю сообщение об ошибке:

NOTICE:  CURL error code: 51 when attempting to validate pre-signed URL, 1 attempt(s) remaining
NOTICE:  CURL error code: 51 when attempting to validate pre-signed URL, 0 attempt(s) remaining

ERROR:  Unable to generate pre-signed url, look at engine log for details.
SQL state: XX000

Я проверил журналы сервера, и никакой дополнительной информации не было.

У меня тройной- проверил правильность всех параметров. Как мне сделать эту работу?

ОБНОВЛЕНИЕ:

Я могу подтвердить, что я могу сделать s3.getObject () в Java AWS SDK, используя эти же учетные данные.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Чтобы воспроизвести вашу ситуацию, я сделал следующее:

  • Запустил экземпляр Amazon RDS PostgreSQL в публичной подсети
  • Под Управление IAMРоли , я назначил AmazonRDSServiceRolePolicy для s3import
  • Создал таблицу
  • Поместил файл CSV в S3
  • Использовал команду SELECT aws_s3.table_import_from_s3() (как указано выше)) для загрузки данных

У меня все работало нормально.

Учитывая, что ваше сообщение об ошибке относится к предварительно подписанному URL-адресу, оно предполагает, что предоставленные вами учетные данные не имели разрешениячтобы получить доступ к файлу CSV в S3. Однако затем вы говорите, что успешно использовали эти учетные данные для извлечения объекта. Таким образом, это вряд ли является причиной.

На основе Reddit: проблема с импортом AWS RDS Postgres 11+ из S3 с использованием функции RDS s3Import: aws , проблема может быть связана стот факт, что экземпляр Amazon RDS не может получить доступ к Amazon S3 . Это может быть связано с тем, что он находится в частной подсети без шлюза NAT в VPC. Если это так, то вы можете либо добавить NAT-шлюз для подключения к Интернету, либо, как указано в ссылке, добавить VPC Endpoint для S3 .

Еще один комментарий в этом постесообщил о той же проблеме с отсутствующим правилом Outbound в группе безопасности , которое не позволило экземпляру RDS получить доступ к Amazon S3.

0 голосов
/ 31 октября 2019

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

Пожалуйста, проверьте исходящий кластер Исходящая группа безопасности (мой случай)

А также добавьте rds-import-роль «Управление ролями IAM» с функцией выбора - s3import

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

...