如何使用 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'###########' 但无法将其分配给变量。

我尝试在我的连接字符串中设置我的函数调用中的DbUserDbPassword,但出现错误。当我对实际的用户名和密码进行硬编码时,它可以工作,但我需要获取 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='..us-east-1.redshift.amazonaws.com' port='5439' user=cluster_cred ['Dbuser'] 密码=cluster_creds['DbPassword'] dbname='databaseName'") @john 对不起,我不擅长在这里格式化。我知道 get_cluster_credentials() 返回字典。我可以打印它并查看 DbUser 和 DbPassword 键值,但我无法将其设置为变量或直接在我的连接字符串中设置。我希望能够获得临时用户名和密码,这样我就可以创建表,将 csv 文件从 s3 复制到 redshift 表。我发现如果它适用于我的身份验证。以公开形式返回,但不确定这将如何影响表的创建和复制数据。 【参考方案1】:

此行引用字符串中的变量,因此该值没有被替换:

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'")

您需要将您的值替换为&lt;VALUES&gt;

【讨论】:

以上是关于如何使用 Boto3 for Redshift get_cluster_credentials 返回临时密码和用户名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 JDBC 驱动程序和 Boto3 API 连接到现有的 Redshift 数据库

使用 Python 和 Boto3 获取列表集群 Amazon Redshift

我想使用 python boto3 脚本将数据加载到 Amazon Redshift 集群中

您如何使用 boto3(或其他方式)在 emr 上自动化 pyspark 作业?

如何连接到 Redshift 中的私有集群?

如何在 AWS Datapipeline 中的 Python 脚本中提供 Redshift 数据库密码?