【问题标题】:How can I connect to endpoint when attempting to export data from RDS to S3?尝试将数据从 RDS 导出到 S3 时如何连接到端点?
【发布时间】:2024-05-14 21:35:05
【问题描述】:

目标

我的目标是将数据从 Postgres RDS 实例导出到 s3 存储桶。我只是想证明这个概念适用于我的 VPC,所以我使用的是虚拟数据。

到目前为止我所尝试的

我使用控制台和 cli 遵循了文档 here

  1. 创建了一个 s3 存储桶(我选择阻止所有公共访问)

  2. 使用以下设置创建了一个 RDS 实例:

    • 在 2 个公共子网上创建
    • 公共可访问性:否
    • 出站安全组规则:CIDR/IP - 入站 0.0.0.0/0
    • 入站安全组规则:CIDR/IP - 入站 0.0.0.0/0
  3. 如示例所示创建了一个策略:

    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/*"
             ] 
           }
         ] 
       }'
  1. 创建了一个 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"
       }
     ] 
   }'
  1. 将策略附加到以下角色:
aws iam attach-role-policy  --policy-arn your-policy-arn  --role-name rds-s3-export-role  
  1. 向数据库添加了 IAM 角色,例如:
aws rds add-role-to-db-instance \
   --db-instance-identifier my-db-instance \
   --feature-name s3Export \
   --role-arn your-role-arn   \
   --region your-region
  1. 是否满足 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,但我的存储桶似乎没有出现在列表中。我相信存储桶本身没有附加政策。

如何调试此问题?我究竟做错了什么?如果需要,我很乐意分享更多详细信息。

【问题讨论】:

    标签: postgresql amazon-web-services


    【解决方案1】:

    我从您关注的documentation 中看到的内容并不假定您是在 VPC 中运行整个设置。

    因此,要从 VPC 内部进行连接(因为您已阻止所有公共访问),您需要附加一个 endpoint policies for Amazon S3

    例如来自documentation sample policy

    以下是 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"
                }
            }
            }
        ]
        }
    

    【讨论】:

    • 嗨 @samtoddler = ) 我的 VPC 目前没有识别出终端节点。我需要为我的 VPC 定义一个端点吗?或者在桶上创建一个S3 Access Point?还是别的什么?
    • 根据 vpc 内的文档需要它
    最近更新 更多