如何使用 Boto3 for Redshift get_cluster_credentials 返回临时密码和用户名
Posted
技术标签:
【中文标题】如何使用 Boto3 for Redshift get_cluster_credentials 返回临时密码和用户名【英文标题】:How to return temporary password and username using Boto3 for Redshift get_cluster_credentials 【发布时间】:2019-09-09 19:33:12 【问题描述】:我可以打印 boto3.client.get_cluster_credentials
并查看 'DbUser: 'IAM:#####" and 'DbPassword'###########'
但无法将其分配给变量。
我尝试在我的连接字符串中设置我的函数调用中的DbUser
和DbPassword
,但出现错误。当我对实际的用户名和密码进行硬编码时,它可以工作,但我需要获取 AWS 作为临时凭证返回给我的内容:
client = boto3.client('redshift', region_name='us-east-1')
cluster_creds = client.get_cluster_credentials( DbUser=',dbuser', DbName='dbName', ClusterIdentifier='ClusterName', AutoCreate=False)
conn = psycopg2.connect("host='<clusername>.<randomKey>.us-east-1.redshift.amazonaws.com' port='5439' user=cluster_cred['Dbuser'] password=cluster_creds['DbPassword'] dbname='databaseName'")
我将代码更改为user=cluster_creds.DbUser
,它通过了,但是当我更改password=cluster_creds.DbPassword
时,它未能通过身份验证。
【问题讨论】:
您从哪里获得的凭据?你在说Using IAM Authentication to Generate Database User Credentials - Amazon Redshift吗?我找不到名为get_user_credentials()
的 boto3 命令——你能提供文档的链接吗?
boto3.amazonaws.com/v1/documentation/api/latest/reference/…
你指的是get_cluster_credentials()
吗?您能否向我们展示更多您的代码,或描述您正在尝试做什么?例如,“使用get_cluster_credentials()
获取一组凭据,然后使用这些凭据通过 psycopg2 登录 Redshift”?
完全正确 @John client = boto3.client('redshift', region_name='us-east-1') cluster_creds = client.get_cluster_credentials( DbUser=',dbuser', DbName='dbName ', ClusterIdentifier='ClusterName', AutoCreate=False) conn = psycopg2.connect("host='此行引用字符串中的变量,因此该值没有被替换:
conn = psycopg2.connect("host='<clusername>.<randomKey>.us-east-1.redshift.amazonaws.com' port='5439' user=cluster_cred['Dbuser'] password=cluster_creds['DbPassword'] dbname='databaseName'")
另外,它应该是cluster_creds
(不是cluster_cred
)和DbUser
(不是Dbuser
)。
这是对我有用的代码:
import boto3
import psycopg2
DB_NAME = '<DB-NAME>'
CLUSTER_IDENTIFIER = '<CLUSTER-IDENTIFIER>'
DB_USER = '<DB-USER>'
ENDPOINT = '<DB-NAME>.<RANDOM-KEY>.us-east-1.redshift.amazonaws.com'
client = boto3.client('redshift', region_name='us-east-1')
cluster_creds = client.get_cluster_credentials(DbUser=DB_USER, DbName=DB_NAME, ClusterIdentifier=CLUSTER_IDENTIFIER, AutoCreate=False)
temp_user=cluster_creds['DbUser']
temp_password=cluster_creds['DbPassword']
conn = psycopg2.connect("host='" + ENDPOINT + "' port='5439' user=" + temp_user + " password=" + temp_password + " dbname='" + DB_NAME + "'")
如果你使用的是 Python 3.6+,那么最后一行可以使用更漂亮的 f-strings:
conn = psycopg2.connect(f"host='ENDPOINT' port='5439' user=temp_user password=temp_password dbname='DB_NAME'")
您需要将您的值替换为<VALUES>
。
【讨论】:
以上是关于如何使用 Boto3 for Redshift get_cluster_credentials 返回临时密码和用户名的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中使用 JDBC 驱动程序和 Boto3 API 连接到现有的 Redshift 数据库
使用 Python 和 Boto3 获取列表集群 Amazon Redshift
我想使用 python boto3 脚本将数据加载到 Amazon Redshift 集群中