"凭证无效"从Python访问Redshift时出错

时间:2017-10-07 02:20:03

标签: python amazon-web-services amazon-s3 amazon-redshift

我正在尝试编写一个Python脚本来访问Amazon Redshift以在Redshift中创建表并将数据从S3复制到Redshift表。

我的代码是:

char

当我运行此命令时,我在cur.execute(copy_statement)

时收到错误
import psycopg2
import os
#import pandas as pd
import requests
requests.packages.urllib3.disable_warnings()

redshift_endpoint = os.getenv("END-point")
redshift_user = os.getenv("user")
redshift_pass = os.getenv("PASSWORD")
port = 5439
dbname = 'DBNAME'
conn = psycopg2.connect(
    host="", 
    user='', 
    port=5439, 
    password='', 
    dbname='')
cur = conn.cursor()
aws_key = os.getenv("access_key") # needed to access S3 Sample Data
aws_secret = os.getenv("secret_key")
#aws_iam_role= os.getenv('iam_role') #tried using this too

base_copy_string= """copy %s from 's3://mypath/%s'.csv 
credentials 'aws_access_key_id= %s aws_access_secrect_key= %s'
delimiter '%s';""" # the base COPY string that we'll be using

#easily generate each table that we'll need to COPY data from
tables = ["employee"]
data_files = ["test"]
delimiters = [","]
#the generated COPY statements we'll be using to load data;
copy_statements = []
for tab, f, delim in zip(tables, data_files, delimiters):
    copy_statements.append(base_copy_string % (tab, f, aws_key, aws_secret, delim)%)
#create Table
cur.execute(""" create table employee(empname varchar(30),empno integer,phoneno integer,email varchar(30))""")
for copy_statement in copy_statements: # execute each COPY statement
    cur.execute(copy_statement)
conn.commit()
for table in tables + ["employee"]:
    cur.execute("select count(*) from %s;" % (table,))    
    print(cur.fetchone())
conn.commit() # make sure data went through and commit our statements permanently.

我的代码有问题吗?或者它是AWS access_key问题吗?

我甚至尝试使用 iam_role ,但收到错误:

  

即使在Redshift中,IAM角色也不能承担角色

我通过附加 S3FullAccess 政策获得了托管IAM角色权限。

3 个答案:

答案 0 :(得分:1)

首先,永远,永远不要在代码中硬编码访问密钥和密钥。这样就排除了你的第一个查询。现在正在以正确的方式实施事物。你是对的,IAM角色是正确的做法。不幸的是,我无法从您的描述中获得确切的错误和用例。据我所知,您正试图从您的计算机(本地计算机)运行此python文件。因此,您需要与IAM用户附加权限才能访问RedShift(以及您的代码所触及的所有其他服务)。如果我的假设是错误的,请纠正我。

答案 1 :(得分:0)

您的脚本中存在一些错误。

1)更改 base_copy_string ,如下所示:

  

base_copy_string =“”“从's3://mypath/%s.csv'凭据复制%s   'aws_access_key_id =%s; aws_secret_access_key =%s'分隔符'%s';“”“#   我们将使用的基本COPY字符串

凭据中必须添加;,单引号也必须包含其他格式问题。它是aws_secret_access_key而不是aws_access_secrect_key

点击此链接了解详细信息:http://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-access-permissions.html#copy-usage_notes-iam-permissions

我建议您使用iam-roles而不是凭据。 http://docs.aws.amazon.com/redshift/latest/dg/loading-data-access-permissions.html

2)更改 copy_statements.append ,如下所示(最后删除额外的%):

  

copy_statements.append(base_copy_string%(tab,f,aws_key,   aws_secret,delim))

纠正这些并再试一次。

答案 2 :(得分:-1)

万一你错过了 安装AWS CLI 跑 aws configure 放置您的凭据和区域 希望这会有所帮助。