我使用sqlalchemy和psycopg2將python連接到redshift。使用IAM角色使用Python連接到Redshift
engine = create_engine('postgresql://user:[email protected]:port/database_name')
我想避免使用我的密碼連接到紅移和使用IAM角色。
我使用sqlalchemy和psycopg2將python連接到redshift。使用IAM角色使用Python連接到Redshift
engine = create_engine('postgresql://user:[email protected]:port/database_name')
我想避免使用我的密碼連接到紅移和使用IAM角色。
AWS IAM用戶與Redshift數據庫用戶不同。雖然Redshift是postgres的(非常遙遠的)親戚,但它並不允許無密碼連接,afaik。
編輯:
我的回答是不再適用,檢查相關的代碼片段答案。
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.')
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))
這是不正確的。您可以(截至2018年1月)調用'get_cluster_credentials'來獲取臨時憑證以訪問Redshift集羣。 https://boto3.readthedocs.io/en/latest/reference/services/redshift.html#Redshift.Client.get_cluster_credentials – danielchalef
謝謝,我添加了一個編輯,表明我的答案不再適用。當我回答時,我沒有找到這個功能。要麼我在搜索時遇到不好的情況,要麼在一段時間之後將它添加到boto中。 –