python-3.x - 如何使用python连接到redshift jdbc url?
问题描述
我有一个如下所示的数据库 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'
)
解决方案
我正在使用一种更好的方式通过 Python 连接到 Redshift。请按照以下步骤 -
- 为获取凭证创建 IAM 策略 -文档
在哪里附加此政策?-
一个。在 EC2 或任何其他服务上运行 Python 代码 -> 将 IAM 策略附加到角色并将其附加到该特定服务或 IAM 角色。
湾。本地机器 -> 附加到您在本地系统上配置的 AWS 用户(通过 aws configure CLI 命令并提供 Access Key 和 Secret Access Key )
让我们使用 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()
- 必要时导入并调用函数。
我更喜欢上面的内容,而不是为任何用户硬编码 UserName 和 Password 的值,因为 -
这根本不是一个好习惯,
此外,如果您使用公共 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"
]
}
]
}