&引用;无效凭证“;从Python访问红移时出错

&引用;无效凭证“;从Python访问红移时出错,python,amazon-web-services,amazon-s3,amazon-redshift,Python,Amazon Web Services,Amazon S3,Amazon Redshift,我正在尝试编写一个Python脚本来访问AmazonRedshift,以在Redshift中创建一个表,并将数据从S3复制到Redshift表 我的代码是: import psycopg2 import os #import pandas as pd import requests requests.packages.urllib3.disable_warnings() redshift_endpoint = os.getenv("END-point") redshift_user = os.

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

我的代码是:

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.
当我运行这个命令时,我在cur.execute(copy_语句)处得到一个错误

我的代码有问题吗?或者这是AWS访问密钥问题

我甚至尝试过使用iam_角色,但出现了一个错误:

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


通过附加S3FullAccess策略,我拥有受管IAM角色权限。

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

以防万一你错过了 安装AWS CLI 跑 aws配置 将您的凭据和区域
希望这有帮助。

您的脚本中有一些错误

1) 更改基本\u复制\u字符串如下:

base_copy_string=“”从's3://mypath/%s.csv'凭据复制%s “aws\u访问权\u密钥\u id=%s;aws\u机密\u访问权\u密钥=%s”分隔符“%s”;“””# 我们将使用的基本副本字符串

必须有一个
添加到凭据中,以及使用单引号的其他格式问题。它是
aws\u secret\u access\u key
而不是
aws\u access\u secrect\u key

有关详细信息,请查看此链接:

我建议您使用iam角色而不是凭据。

2) 更改复制\u语句。追加如下内容(最后删除额外的
%
):

复制语句。追加(基本复制字符串%(制表符,f,aws键, (秘密,德利姆)


纠正这些错误,然后再试一次。

从你写的内容中很难判断该做什么。请考虑编辑。这是无关的,因为他不使用AWS CLI或库,如博托或BOTO3。他正在将他的凭证传递到复制语句本身。您的基本复制字符串中有一个输入错误:
aws\u access\u secrect\u key
是的,这就是我要做的。我试图将数据从S3发送到Redshift,正确的说法是从S3中提取数据。因此,您需要授予红移资源访问S3的权限(您正在这样做)。如果您可以在IAM角色的情况下附加错误的屏幕截图,这将非常有用。-------------------------------------错误:用户arn:aws:redshift:us-east-1:028810420564:dbuser:my cluster/venkat无权担任IAM角色arn:aws:IAM::028810420 564:Role/redshift-s3代码:8001上下文:IAM角色=arn:aws:iam::028810420564:role/redshift-s3查询:3209位置:xen_aws_credentials_mgr.cpp:229进程:padbmaster[pid=19102]--------------------------------------------------------------好的,我发现您的iam arn中有一个空格字符。arn:aws:iam::028810420 564:role/redshift-s3。这是无效的格式,可能在复制IAM的ARN时出错。除此之外,您还需要注意每次都指定整个ARN。谢谢,现在我得到了这个错误copy_语句。append(base_copy_string%(tab,f,aws_key,aws_secret,delim))TypeError:不是所有在字符串格式期间转换的参数使用
str(variable_name)
将变量类型化为字符串。可能是aws_密钥和aws_密钥导致了错误<代码>复制语句。追加(基本复制字符串%(制表符,f,str(aws\U键),str(aws\U密码),delim))
**Error:**   error:  Invalid credentials. Must be of the format: credentials 'aws_iam_role=...' or 'aws_access_key_id=...;aws_secre
t_access_key=...[;token=...]'
  code:      8001
  context:
  query:     582
  location:  aws_credentials_parser.cpp:114
  process:   padbmaster [pid=18692]