尝试使用包含等号的路径从 S3 加载到 Postgres RDS 时权限被拒绝

dva*_*rub 5 postgresql amazon-s3 amazon-rds

我正在尝试使用如下所述的方法将数据从 S3 加载到 Postgres RDS aws_s3.table_import_from_s3:将数据导入 Amazon RDS 上的 PostgreSQL

S3 中的文件路径包含等号“=”,因此我收到以下错误:

ERROR:  HTTP 403. Permission denied. Check bucket or provided credentials as they may no longer be valid.
Run Code Online (Sandbox Code Playgroud)

将等号替换为下划线“_”等其他字符时,导入成功。

例子:

ERROR:  HTTP 403. Permission denied. Check bucket or provided credentials as they may no longer be valid.
Run Code Online (Sandbox Code Playgroud)

抛出上面提到的错误。(HTTP 403...)

尽管:

SELECT aws_s3.table_import_from_s3(
     'my_table',
     'col1,col2',
     '(format csv)',
     'my_bucket',
     'date=20191031/my_data.csv',
     'eu-west-2'
);
Run Code Online (Sandbox Code Playgroud)

成功没有任何问题

我应该在等号上添加任何转义字符吗?还有其他解决办法吗?

Red*_*Boy 5

我没有测试它,但应该工作。只需=使用%3D.

SELECT aws_s3.table_import_from_s3(
 'my_table',
 'col1,col2',
 '(format csv)',
 'my_bucket',
 'date%3D20191031/my_data.csv',
 'eu-west-2');
Run Code Online (Sandbox Code Playgroud)


Mic*_*aes 5

我Permission denied. Check bucket or provided credentials as they may no longer be valid在使用函数时也遇到了这个问题aws_s3.table_import_from_s3。

首先尝试对整个路径进行 URL 编码,但也会对/干扰 S3 对象路径分隔符的斜杠进行编码。特此仅对除斜杠以外的所有内容进行 URL 编码。

用于 URL 编码的 PHP 示例

$path = implode('/', array_map('urlencode', explode('/', $path)));
Run Code Online (Sandbox Code Playgroud)

之前 - 不工作

SELECT aws_s3.table_import_from_s3(
   'TABLE_NAME',
   '',
   '(FORMAT csv, HEADER true)',
   aws_commons.create_s3_uri('BUCKET', 'subdirectory/2020-09-10T09:48:40.831Z-6402c3e6-86e6-4a15-8bc3-51d9eb9f08a3.csv', 'aws-region'),
   aws_commons.create_aws_credentials('***', '***', '')
)
Run Code Online (Sandbox Code Playgroud)

下班后

SELECT aws_s3.table_import_from_s3(
   'TABLE_NAME',
   '',
   '(FORMAT csv, HEADER true)',
   aws_commons.create_s3_uri('BUCKET', 'subdirectory/2020-09-10T09%3A48%3A40.831Z-6402c3e6-86e6-4a15-8bc3-51d9eb9f08a3.csv', 'aws-region'),
   aws_commons.create_aws_credentials('***', '***', '')
)
Run Code Online (Sandbox Code Playgroud)

理想情况下,这将由扩展aws_commons.create_s3_uri提供的功能处理aws_s3。

  • AWS RDS Postgres 12.x 和 12.4-R1 之间的导入扩展功能确实发生了变化:在 12.4-R1 版本中,您不再需要对其进行编码;从子目录导入似乎失败,因此您需要切换到存储桶的根目录(在我的例子中,我切换到一个新存储桶)。更多信息在这里:/sf/answers/4507129511/ (3认同)