经过研究文档以及和aws沟通,咱们可以使用以下方案去实现我们的场景。
1, 我们需要一个IAM 用户,此用户可以有redshift:GetClusterCredentials和redshift:CreateClusterUser策略。也就是可以执行获取用户临时凭证的权限。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"redshift:GetClusterCredentials",
"redshift:CreateClusterUser"
],
"Resource": "*"
}
}
2,拿到上一部用户的id 和secret,配置到服务器上。
3,用户在portal登陆后,我们可以拿到用户的itcode,
使用第一步获得的用户的身份去执行获取 当前用户的临时登录凭证。
{'DbUser': 'IAMA:wangfang12', 'DbPassword': 'AaLWa9+T2IXgxh5T09G1nNNrfg2jzjeBCfuNeeJewUoIKZWVhmslVS/n+RKidt61TjAcuFQ==', 'Expiration': datetime.datetime(2021, 10, 12, 10, 35, 54, 613000, tzinfo=tzutc()), 'ResponseMetadata': {'RequestId': '9ac9554b-f9fe-44a8-9db7-ad538c072e15', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '9ac9554b-f9fe-44a8-9db7-ad538c072e15', 'content-type': 'text/xml', 'content-length': '485', 'date': 'Tue, 12 Oct 2021 09:35:54 GMT'}, 'RetryAttempts': 0}}
4,使用第三步获取的临时凭证,即可通过jdbc ,python 等去连接 query数据。
我在本地已经跑通了上述流程。
query 一个有权限的表:
([3],)
query没权限的表:
.ProgrammingError: {'S': 'ERROR', 'C': '42501', 'M': 'permission denied for relation mayb11_read', 'F': '/home/ec2-user/padb/src/pg/src/backend/catalog/aclchk.c', 'L': '2700', 'R': 'aclcheck_error'}
大家看这种方案可行不?
import redshift_connector
import boto3
# Connects to Redshift cluster using AWS credentials
conn = redshift_connector.connect(
host='lenovo-test.cjtp8lvs5yxn.us-east-2.redshift.amazonaws.com',
database='dev',
user='IAMA:wangfang12',
password='A6X44Il1axleXiD19ZK8YfaPUQqmdc+VKagamdP5gOwVNPGVhM+bn4RQ8RWGxCkqryQwhGA=='
)
print(conn)
try:
client = boto3.client('redshift',region_name='us-east-2')
creds = client.get_cluster_credentials(
DbUser="wangfang12",
DbName="dev",
ClusterIdentifier="lenovo-test",
DurationSeconds=3600,AutoCreate=True)
print("cred....",creds)
except Exception as ERROR:
print("Credentials Issue: " + ERROR)
sys.exit(1)