Antwort

1

AWS IAM-Benutzer unterscheiden sich von Redshift-Datenbankbenutzern. Obwohl Redshift ein (sehr entfernter) Verwandter von Postgres ist, erlaubt es noch keine passwortlosen Verbindungen, afaik.

EDIT:

Meine Antwort ist nicht mehr anwendbar, überprüfen Sie andere Antworten für einen entsprechenden Code-Schnipsel.

+0

Dies ist falsch. Sie können (ab Januar 2018) 'get_cluster_credentials' aufrufen, um temporäre Anmeldeinformationen für den Zugriff auf einen Redshift-Cluster zu erhalten. https://boto3.readthedocs.io/en/latest/reference/services/redshift.html#Redshift.Client.get_cluster_credentials – danielchalef

+0

Vielen Dank, ich habe eine Bearbeitung hinzugefügt, um anzuzeigen, dass meine Antwort nicht mehr zutrifft. Als ich damals antwortete, habe ich diese Funktion nicht gefunden. Entweder bin ich schlecht in der Suche oder es wurde später zu Boto hinzugefügt. –

1

AWS bietet eine Möglichkeit, temporäre Anmeldeinformationen für den Zugriff auf Redshift-Cluster anzufordern. Boto3 implementiert get_cluster_credentials, so dass Sie etwas wie folgt tun können. Stellen Sie sicher, dass Sie beim Einrichten Ihrer IAM-Benutzer und -Rollen die instructions here befolgt haben.

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 bietet keinen praktischen Wrapper für IAM-Kreditoren in Python wie für ihren JDBC-Treiber. Sie müssen den Endpunkt GetClusterCredentials manuell aufrufen und den zurückgegebenen Benutzernamen und das Kennwort an create_engine übergeben. Sieht ungefähr so ​​aus:

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))