使用 IAM 角色凭证以 Python 卸载到 S3
Unload to S3 with Python using IAM Role credentials
在 Redshift 中,我 运行 将数据从 table 卸载到 S3 中的文件中:
unload('select * from table')
to 's3://bucket/unload/file_'
iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>'
我想在 Python 中做同样的事情- 有什么关于如何复制它的建议吗?我看到了使用访问密钥和秘密的示例,但这对我来说不是一个选项 - 需要在非 public 存储桶上使用基于角色的凭据。
您将需要两套凭据。通过 IAM 角色访问 S3 存储桶的 IAM 凭据和用于执行 SQL 命令的 Redshift ODBC 凭据。
创建一个连接到 Redshift 的 Python 程序,其方式类似于 SQL 服务器等其他数据库,然后执行您的查询。此程序将需要 Redshift 登录凭据而不是 IAM 凭据(Redshift 用户名、密码)。
S3 的 IAM 凭据作为角色分配给 Redshift,以便 Redshift 可以将结果存储在 S3 上。这是您问题中 Redshift 查询的 iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>'
部分。
您不需要 boto3(或 boto)来访问 Redshift,除非您打算实际与 Redshift 交互 API(它不访问存储在 Redshift 中的数据库)。
这里是一个示例 Python 访问 Redshift 的程序。此代码的 link 是 here. Credit due to Varun Verma
Internet 上还有其他示例可以帮助您入门。
############ 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()
在 Redshift 中,我 运行 将数据从 table 卸载到 S3 中的文件中:
unload('select * from table')
to 's3://bucket/unload/file_'
iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>'
我想在 Python 中做同样的事情- 有什么关于如何复制它的建议吗?我看到了使用访问密钥和秘密的示例,但这对我来说不是一个选项 - 需要在非 public 存储桶上使用基于角色的凭据。
您将需要两套凭据。通过 IAM 角色访问 S3 存储桶的 IAM 凭据和用于执行 SQL 命令的 Redshift ODBC 凭据。
创建一个连接到 Redshift 的 Python 程序,其方式类似于 SQL 服务器等其他数据库,然后执行您的查询。此程序将需要 Redshift 登录凭据而不是 IAM 凭据(Redshift 用户名、密码)。
S3 的 IAM 凭据作为角色分配给 Redshift,以便 Redshift 可以将结果存储在 S3 上。这是您问题中 Redshift 查询的 iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>'
部分。
您不需要 boto3(或 boto)来访问 Redshift,除非您打算实际与 Redshift 交互 API(它不访问存储在 Redshift 中的数据库)。
这里是一个示例 Python 访问 Redshift 的程序。此代码的 link 是 here. Credit due to Varun Verma
Internet 上还有其他示例可以帮助您入门。
############ 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()