问题描述:
众所周知,AWS中国区和AWS Global是两个系统,很多服务的跨区域功能是无法打通的。那么如果我有一个中国区的Redshift集群,想要去访问Global的RDS,我能做到吗?
解决方案:
Redshift 通过 external schema的方式去访问别的数据库,根据如下文档,必须是将数据库密钥存储在secret manager中,然后调用secret manager去访问。
不能直接在创建external schema时候加入hostname, username, password 类信息:
https://docs.amazonaws.cn/redshift/latest/dg/getting-started-federated.html
https://docs.amazonaws.cn/redshift/latest/dg/federated_query_example.html
整个Redshift 访问PostgreSQL,只要能成功访问secret manager,那么后续都是网络问题。仅有访问secret manager这一步需要IAM认证.
测试步骤:
1. 通过Direct Connect,速成dx专线打通Redshift Serverless所在网络和Global RDS PostgreSQL网咯。
2. 为保证Redshift出口IP在VPC内,建议在Redshift Serverlss中使用Enhanced VPC Routing.
如果不开启Enhanced VPC Routing, 那么Redshift访问RDS的出口IP,不会在Redshift VPC内。也不是不可以,但是RDS的安全组那边设置会有一定波折(比如需要把安全组入站规则设置为0000)。
3. secret manager中可以存储RDS的hostname,username, password,无论hostname是中国区rds, global rds,甚至自建数据库,只要网络打通就是没问题的。
Redshift访问secret manager是通过443端口,如果redshift 安全组outbound rule有限制,那么需要打开443.
网络和Redshift账号下IAM权限配置好以后,正常创建external schema就可以:
CREATE EXTERNAL SCHEMA testing
FROM POSTGRES
DATABASE 'testing1' SCHEMA 'testing2'
URI 'test3.cluster-c8fap0yf8e1s.ap-southeast-1.rds.amazonaws.com'
IAM_ROLE 'arn:aws-cn:iam::1234567890:role/redshift_serverless_role'
SECRET_ARN 'arn:aws-cn:secretsmanager:cn-north-1:1234567890:secret:<testing secret>'
;
select * from testing1.testing2 limit 1;
参考文档:
[1] 增强型 VPC 路由 https://repost.aws/zh-Hans/knowledge-center/redshift-enhanced-vpc-routing
可能出现的报错和排查:
1.
ERROR: timeout expired [ErrorId: 1-6629b321-63adbea65c7f6d013dbd06cb]
这种现象符合Enhanced VPC Routing关闭以后Redshift通过服务内部的eni并通过公网方式访问PostgreSQL的产品设置。是网络问题。
2.
ERROR: Failed to incorporate external table "testing1"."testing2" into local catalog. Error=: curlCode: 28, Timeout was reached [ErrorId: 1-6629bd5a-4df483f1651485b803b8863a]
可以通过Redshift Serverless eni flow log中的记录进行排查,比如此eni访问Amazon Web Service服务网段被443端口拒掉,由于443端口是去访问secretmanager的端口,因此从Redshift Serverless服务的安全组中,将outbound rule增加了443端口的开放。这样,Redshift服务流量可以通过443端口出去并访问Secret Manager服务。