【问题标题】:How to connect to redshift jdbc url using python?如何使用python连接到redshift jdbc url?
【发布时间】: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'
)

【问题讨论】:

    标签: python-3.x amazon-redshift


    【解决方案1】:

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

    1. 创建用于获取凭证的 IAM 策略 - DOCUMENTATION
    2. 在哪里附加此政策? -

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

      b.本地机器 -> 附加到您在本地系统上配置的 AWS 用户(通过 aws configure CLI 命令并提供访问密钥和秘密访问密钥)

    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. 在必要时导入和调用函数。

    我更喜欢上面的而不是硬编码任何用户的用户名和密码的值,因为 -

    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"
                ]
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 2015-10-21
      • 1970-01-01
      • 2015-03-16
      • 2017-10-29
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多