回答

1

AWS IAM用戶與Redshift數據庫用戶不同。雖然Redshift是postgres的(非常遙遠的)親戚,但它並不允許無密碼連接,afaik。

編輯:

我的回答是不再適用,檢查相關的代碼片段答案。

+0

這是不正確的。您可以(截至2018年1月)調用'get_cluster_credentials'來獲取臨時憑證以訪問Redshift集羣。 https://boto3.readthedocs.io/en/latest/reference/services/redshift.html#Redshift.Client.get_cluster_credentials – danielchalef

+0

謝謝,我添加了一個編輯,表明我的答案不再適用。當我回答時,我沒有找到這個功能。要麼我在搜索時遇到不好的情況,要麼在一段時間之後將它添加到boto中。 –

1

AWS提供了一種請求訪問Redshift羣集的臨時證書的方法。 Boto3實現了get_cluster_credentials,允許您執行以下操作。確保您已經按照instructions here設置您的IAM用戶和角色。

def db_connection(): 
    logger = logging.getLogger(__name__) 

    RS_PORT = 5439 
    RS_USER = 'myDbUser' 
    DATABASE = 'myDb' 
    CLUSTER_ID = 'myCluster' 
    RS_HOST = 'myClusterHostName' 

    client = boto3.client('redshift') 

    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 
    ) 
     return conn 
    except psycopg2.Error: 
     logger.exception('Failed to open database connection.') 
1

AWS爲python中的IAM creds提供了像他們的JDBC驅動程序一樣的方便包裝器。您需要手動撥打GetClusterCredentials端點,然後將返回的用戶名和密碼傳遞給create_engine。看起來像這樣:

def get_redshift_credentials(): 
    role_creds = get_role_credentials() 
    client = boto3.client(
     'redshift', 
     region_name=CLUSTER_REGION, 
     aws_access_key_id=role_creds['AccessKeyId'], 
     aws_secret_access_key=role_creds['SecretAccessKey'], 
     aws_session_token=role_creds['SessionToken'], 
    ) 
    response = client.get_cluster_credentials(
     DbUser=PGUSER, 
     ClusterIdentifier=CLUSTER_IDENTIFIER, 
    ) 
    return response 

creds = get_redshift_credentials() 
engine = create_engine('postgresql://{creds.DbUser}:{creds.DbPassword}@hostname:port/database_name'.format(creds))