如何使用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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用堡垒主机通过 SSH 连接到 Redshift

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

无法从 lambda 中的 python 连接到 aws redshift

当尝试使用 psycopg2 模块通过 python 连接到 redshift 时,会显示以下错误

使用 Python 连接到 Redshift 数据 - 错误:当前事务被中止,命令被忽略,直到事务块结束

需要 SSL 时将 Python/pandas 连接到 Redshift