目标
我的目标是将数据从Postgres RDS实例导出到s3 Bucket。我只是想证明这个概念在我的VPC上有效,所以我使用的是伪数据。
到目前为止我已经尝试了什么
我使用控制台和cli遵循了此处的文档。
-
创建了一个s3 bucket(我选择阻止所有公共访问(
-
创建了具有以下设置的RDS实例:
- 在2个公用子网上创建
- 公共可达性:否
- 出站的安全组规则:CIDR/IP-入站0.0.0.0/0
- 入站的安全组规则:CIDR/IP-入站0.0.0.0/0
-
创建了一个策略,如示例所示:
aws iam create-policy --policy-name rds-s3-export-policy --policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "s3export",
"Action": [
"S3:PutObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::your-s3-bucket/*"
]
}
]
}'
- 创建了IAM角色,如:
aws iam create-role --role-name rds-s3-export-role --assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rds.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'
- 将策略附加到角色,如:
aws iam attach-role-policy --policy-arn your-policy-arn --role-name rds-s3-export-role
- 将IAM角色添加到DB中,如:
aws rds add-role-to-db-instance
--db-instance-identifier my-db-instance
--feature-name s3Export
--role-arn your-role-arn
--region your-region
- 是否完成了PSQL中的所有要求,如:
CREATE EXTENSION IF NOT EXISTS aws_s3 CASCADE;
CREATE TABLE sample_table (bid bigint PRIMARY KEY, name varchar(80));
INSERT INTO sample_table (bid,name) VALUES (1, 'Monday'), (2,'Tuesday'), (3, 'Wednesday');
SELECT aws_commons.create_s3_uri(
'dummy-data-bucket-path',
'',
'us-west-2'
) AS s3_uri_1 gset
什么不起作用
当我试图通过进行实际出口时
SELECT * FROM aws_s3.query_export_to_s3('SELECT * FROM sample_table', :'s3_uri_1');
我得到错误:
ERROR: could not upload to Amazon S3
DETAIL: Amazon S3 client returned 'Unable to connect to endpoint'.
CONTEXT: SQL function "query_export_to_s3" statement 1
我尝试过的其他事情:
我尝试过使用Access analyzer for S3
,但我的bucket似乎没有出现在列表中。我相信,由于水桶本身没有附加政策。
如何调试此问题?我做错了什么?如果需要,我很乐意分享更多细节。
我从您下面的文档中看到的并不是假设您在VPC中运行整个设置。
因此,要从VPC内连接(因为您已经阻止了所有的公共访问(,您需要附加一个AmazonS3的端点策略。
例如,来自文档示例策略:
以下是S3存储桶策略的示例,该策略仅允许从端点vpce-1a2b3c4d访问特定存储桶my_secure_bucket。
{
"Version": "2012-10-17",
"Id": "Policy1415115909152",
"Statement": [
{
"Sid": "Access-to-specific-VPCE-only",
"Principal": "*",
"Action": "s3:*",
"Effect": "Deny",
"Resource": ["arn:aws:s3:::my_secure_bucket",
"arn:aws:s3:::my_secure_bucket/*"],
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-1a2b3c4d"
}
}
}
]
}