如何使用python连接到redshift jdbc url?
Posted
技术标签:
【中文标题】如何使用python连接到redshift jdbc url?【英文标题】:How to connect to redshift jdbc url using python? 【发布时间】:2019-09-09 17:02:49 【问题描述】:我有一个如下所示的数据库 URL:
jdbc:redshift://<database_name>.company.com:5439/<database_name>?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
如何使用 python 连接到这个 jdbc url?什么是 jdbc url?我可以使用以下方式连接到此:
import psycopg2
con=psycopg2.connect(
dbname= 'jdbc:redshift://<database_name>.<company>.com:5439/<database_name>?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory',
host='host',
port= '5439',
user= 'user',
password= 'pwd'
)
【问题讨论】:
【参考方案1】:我正在使用一种更好的方式通过 Python 连接到 Redshift。 请按照步骤操作-
-
创建用于获取凭证的 IAM 策略 - DOCUMENTATION
在哪里附加此政策? -
一个。在 EC2 或任何其他服务上运行 Python 代码 -> 将 IAM 策略附加到角色并将其附加到该特定服务或 IAM 角色。
b.本地机器 -> 附加到您在本地系统上配置的 AWS 用户(通过 aws configure CLI 命令并提供访问密钥和秘密访问密钥)
让我们使用 Config.ini(作为存储任何静态值的中心位置)-
我的 Redshift JDBC URL 是这样的 -
jdbc:redshift://dev.<some_value_like_company>.us-west-2.redshift.amazonaws.com:5439/dev_database
我的 Config.ini 文件是这样的 -
[Redshift]
port = 5439
username = dev_user
database_name = dev_database
cluster_id = dev
url = dev.<some_value_like_company>.<region>.redshift.amazonaws.com
region = us-west-2
创建连接 -
#All Imports
import logging
import psycopg2
import boto3
import ConfigParser
def db_connection():
logger = logging.getLogger(__name__)
parser = ConfigParser.ConfigParser()
parser.read('config.ini')
RS_PORT = parser.get('Redshift','port')
RS_USER = parser.get('Redshift','username')
DATABASE = parser.get('Redshift','database_name')
CLUSTER_ID = parser.get('Redshift','cluster_id')
RS_HOST = parser.get('Redshift','url')
REGION_NAME = parser.get('Redshift','region')
client = boto3.client('redshift',region_name=REGION_NAME)
cluster_creds = client.get_cluster_credentials(DbUser=RS_USER,
DbName=DATABASE,
ClusterIdentifier=CLUSTER_ID,
AutoCreate=False)
try:
conn = psycopg2.connect(
host=RS_HOST,
port=RS_PORT,
user=cluster_creds['DbUser'],
password=cluster_creds['DbPassword'],
database=DATABASE
)
print "pass"
print conn
return conn
except psycopg2.Error:
logger.exception('Failed to open database connection.')
print "Failed"
db_connection()
-
在必要时导入和调用函数。
我更喜欢上面的而不是硬编码任何用户的用户名和密码的值,因为 -
这根本不是一个好习惯,
此外,如果您使用公共 Repo (github),那么它会公开用户名和密码,如果有人出于错误原因使用它,这可能是一场噩梦。
使用 IAM 是免费且安全的:p.
如果这有帮助,请告诉我,如果您仍需要以您想要的方式连接到 Redshift,请稍后在我自己尝试后发布答案。
Get_credentials 的示例 IAM 政策 -
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": [
"redshift:GetClusterCredentials",
"redshift:CreateClusterUser",
"redshift:JoinGroup"
],
"Resource": [
"arn:aws:redshift:us-west-2:<account_number>:dbname:dev/dev_database",
"arn:aws:redshift:us-west-2:<account_number>:dbuser:dev/dev",
"arn:aws:redshift:us-west-2:<account_number>:dbuser:dev/dev_read"
]
]
【讨论】:
以上是关于如何使用python连接到redshift jdbc url?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中使用 JDBC 驱动程序和 Boto3 API 连接到现有的 Redshift 数据库
无法从 lambda 中的 python 连接到 aws redshift
当尝试使用 psycopg2 模块通过 python 连接到 redshift 时,会显示以下错误