使用IAM角色凭据使用Python卸载到S3

使用IAM角色凭据使用Python卸载到S3,python,amazon-web-services,amazon-s3,amazon-redshift,boto,Python,Amazon Web Services,Amazon S3,Amazon Redshift,Boto,在Redshift中,我运行以下命令将数据从表卸载到S3中的文件中: unload('select * from table') to 's3://bucket/unload/file_' iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>' 我想在Python中也做同样的事情——有没有关于如何复制的建议?我看到了使用access key和secret的示例,但这不是我的选择-需要在非公共存储桶上使用基于角色的

在Redshift中,我运行以下命令将数据从表卸载到S3中的文件中:

unload('select * from table')
to 's3://bucket/unload/file_'
iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>'

我想在Python中也做同样的事情——有没有关于如何复制的建议?我看到了使用access key和secret的示例,但这不是我的选择-需要在非公共存储桶上使用基于角色的凭据

您需要两套凭证。通过IAM角色访问S3存储桶的IAM凭据和执行SQL命令的红移ODBC凭据

以类似于其他数据库(如SQL Server)的方式创建一个连接到Redshift的Python程序,并执行查询。此程序将需要红移登录凭据,而不是IAM凭据红移用户名、密码

S3的IAM凭据作为角色分配给Redshift,以便Redshift可以将结果存储在S3上。这是iam_角色“arn:aws:iam:”。应付账款

互联网上还有其他例子可以帮助你开始学习

############ REQUIREMENTS ####################
# sudo apt-get install python-pip 
# sudo apt-get install libpq-dev
# sudo pip install psycopg2
# sudo pip install sqlalchemy
# sudo pip install sqlalchemy-redshift
##############################################

import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker

#>>>>>>>> MAKE CHANGES HERE <<<<<<<<<<<<< 
DATABASE = "dbname"
USER = "username"
PASSWORD = "password"
HOST = "host"
PORT = ""
SCHEMA = "public"      #default is "public" 

####### connection and session creation ############## 
connection_string = "redshift+psycopg2://%s:%s@%s:%s/%s" % (USER,PASSWORD,HOST,str(PORT),DATABASE)
engine = sa.create_engine(connection_string)
session = sessionmaker()
session.configure(bind=engine)
s = session()
SetPath = "SET search_path TO %s" % SCHEMA
s.execute(SetPath)
###### All Set Session created using provided schema  #######

################ write queries from here ###################### 
query = "unload('select * from table') to 's3://bucket/unload/file_' iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>';"
rr = s.execute(query)
all_results =  rr.fetchall()

def pretty(all_results):
    for row in all_results :
        print "row start >>>>>>>>>>>>>>>>>>>>"
        for r in row :
            print " ----" , r
        print "row end >>>>>>>>>>>>>>>>>>>>>>"


pretty(all_results)


########## close session in the end ###############
s.close()

您将需要两套凭证。通过IAM角色访问S3存储桶的IAM凭据和执行SQL命令的红移ODBC凭据

以类似于其他数据库(如SQL Server)的方式创建一个连接到Redshift的Python程序,并执行查询。此程序将需要红移登录凭据,而不是IAM凭据红移用户名、密码

S3的IAM凭据作为角色分配给Redshift,以便Redshift可以将结果存储在S3上。这是iam_角色“arn:aws:iam:”。应付账款

互联网上还有其他例子可以帮助你开始学习

############ REQUIREMENTS ####################
# sudo apt-get install python-pip 
# sudo apt-get install libpq-dev
# sudo pip install psycopg2
# sudo pip install sqlalchemy
# sudo pip install sqlalchemy-redshift
##############################################

import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker

#>>>>>>>> MAKE CHANGES HERE <<<<<<<<<<<<< 
DATABASE = "dbname"
USER = "username"
PASSWORD = "password"
HOST = "host"
PORT = ""
SCHEMA = "public"      #default is "public" 

####### connection and session creation ############## 
connection_string = "redshift+psycopg2://%s:%s@%s:%s/%s" % (USER,PASSWORD,HOST,str(PORT),DATABASE)
engine = sa.create_engine(connection_string)
session = sessionmaker()
session.configure(bind=engine)
s = session()
SetPath = "SET search_path TO %s" % SCHEMA
s.execute(SetPath)
###### All Set Session created using provided schema  #######

################ write queries from here ###################### 
query = "unload('select * from table') to 's3://bucket/unload/file_' iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>';"
rr = s.execute(query)
all_results =  rr.fetchall()

def pretty(all_results):
    for row in all_results :
        print "row start >>>>>>>>>>>>>>>>>>>>"
        for r in row :
            print " ----" , r
        print "row end >>>>>>>>>>>>>>>>>>>>>>"


pretty(all_results)


########## close session in the end ###############
s.close()


为什么提供凭据不是您的选择?@jarmod DevOps policy由于类似的各种情况,您将需要凭据,除非您计划公开S3存储桶。如何获取凭据以及如何保护凭据是很重要的。最常见的方法是使用最低权限的IAM角色启动EC2实例,然后在该EC2实例上运行应用程序。该应用程序不需要直接访问AWS SDK为您获取的凭据,并且凭据具有时间限制和自动循环。显然,您还必须以通常的方式保护EC2实例免受攻击者的攻击?我猜您的代码片段是通过iam用户下的控制台运行的,该用户使用密码生成与角色使用的相同类型的临时凭据。看看下面的答案,红移控制台可能会自动生成SQL用户和密码,甚至可能是不可见的。但是Python在哪里运行?为什么提供凭据不是您的选择?@jarmod DevOps policy由于类似的各种情况,您需要凭据,除非您计划公开S3存储桶。如何获取凭据以及如何保护凭据是很重要的。最常见的方法是使用最低权限的IAM角色启动EC2实例,然后在该EC2实例上运行应用程序。该应用程序不需要直接访问AWS SDK为您获取的凭据,并且凭据具有时间限制和自动循环。显然,您还必须以通常的方式保护EC2实例免受攻击者的攻击?我猜您的代码片段是通过iam用户下的控制台运行的,该用户使用密码生成与角色使用的相同类型的临时凭据。看看下面的答案,红移控制台可能会自动生成SQL用户和密码,甚至可能是不可见的。但是Python在哪里运行?谢谢,但不幸的是,这是一个通过Python连接到红移的脚本,而不是在Python中从红移卸载到S3,如问题所述,在执行任何类型的SQL语句之前,您需要先连接到Redshift。我已经修改了这个示例,以显示示例中的unload语句。我认为缺少的是生成SQL凭据的红移API调用。您可以使用来自假定角色的凭据来验证该API请求。据我所知,没有SQL凭据,就无法与SQL数据库交互。@DanFarrell。评论不错-从安全角度来看,我喜欢你的建议。调用get_cluster_凭据将需要第三组凭据(IAM访问密钥或IAM角色)来调用红移管理API。这些凭据可能与用于S3的凭据相同,但不推荐使用。然后,此API将返回用于登录到红移集群以执行SQL查询的临时凭据。这些凭据将替换我的示例用户/密码中使用的凭据。@JohnHanley这对卸载有效,但我正在尝试运行create table语句,query runs-但尝试查询时,它表明table不存在。有什么想法吗?谢谢,但不幸的是这是一个连接到Redsh的脚本
通过Python进行ift,而不是像问题所问的那样,在Python中从Redshift卸载到S3。在执行任何类型的SQL语句之前,需要先连接到Redshift。我已经修改了这个示例,以显示示例中的unload语句。我认为缺少的是生成SQL凭据的红移API调用。您可以使用来自假定角色的凭据来验证该API请求。据我所知,没有SQL凭据,就无法与SQL数据库交互。@DanFarrell。评论不错-从安全角度来看,我喜欢你的建议。调用get_cluster_凭据将需要第三组凭据(IAM访问密钥或IAM角色)来调用红移管理API。这些凭据可能与用于S3的凭据相同,但不推荐使用。然后,此API将返回用于登录到红移集群以执行SQL查询的临时凭据。这些凭据将替换我的示例用户/密码中使用的凭据。@JohnHanley这对卸载有效,但我正在尝试运行create table语句,query runs-但尝试查询时,它表明table不存在。有什么想法吗?