首页 > 解决方案 > 如何使用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-3.xamazon-redshift

解决方案


我正在使用一种更好的方式通过 Python 连接到 Redshift。请按照以下步骤 -

  1. 为获取凭证创建 IAM 策略 -文档
  2. 在哪里附加此政策?-

    一个。在 EC2 或任何其他服务上运行 Python 代码 -> 将 IAM 策略附加到角色并将其附加到该特定服务或 IAM 角色。

    湾。本地机器 -> 附加到您在本地系统上配置的 AWS 用户(通过 aws configure CLI 命令并提供 Access Key 和 Secret Access Key )

  3. 让我们使用 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()
  1. 必要时导入并调用函数。

我更喜欢上面的内容,而不是为任何用户硬编码 UserName 和 Password 的值,因为 -

  1. 这根本不是一个好习惯,

  2. 此外,如果您使用公共 Repo (github),那么它会公开用户名和密码,如果有人出于错误原因使用它,这可能是一场噩梦。

  3. 使用 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"
            ]
        }
    ]
}

推荐阅读