【问题标题】:Unload to S3 with Python using IAM Role credentials使用 IAM 角色凭证通过 Python 卸载到 S3
【发布时间】:2018-06-19 00:32:32
【问题描述】:

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

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

我想在 Python 中做同样的事情——有什么建议可以复制吗?我看到了使用访问密钥和秘密的示例,但这不是我的选择——需要在非公共存储桶上使用基于角色的凭据。

【问题讨论】:

  • 为什么不能提供凭据?
  • @jarmod DevOps 政策由于各种情况,如itnews.com.au/news/…
  • 好吧,除非您打算公开 S3 存储桶,否则您将需要凭据。如何获得凭据以及如何保护它们是重要的。最常见的方法是启动具有最低权限 IAM 角色的 EC2 实例,然后在该 EC2 实例上运行您的应用程序。该应用程序不需要直接访问凭证(AWS 开发工具包为您获取它们),并且凭证是有时间限制的并且会自动轮换。显然,您还必须以通常的方式保护 EC2 实例免受攻击者的侵害。
  • 也许更有用的问题是,Python 在哪里运行?我猜你的 sn-p 是通过你的 iam 用户下的控制台运行的,它使用密码来生成角色使用的相同类型的临时凭据。查看下面的答案,redshift 控制台似乎很可能正在自动生成 SQL 用户和密码,甚至可能是不可见的。
  • 但是 Python 在哪里运行?

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


【解决方案1】:

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

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

S3 的 IAM 凭证作为角色分配给 Redshift,以便 Redshift 可以将结果存储在 S3 上。这是您问题中 Redshift 查询的 iam_role 'arn:aws:iam:&lt;aws-account-id&gt;:role/&lt;role_name&gt;' 部分。

您不需要 boto3(或 boto)来访问 Redshift,除非您计划实际与 Redshift API 交互(它不会访问存储在 Redshift 中的数据库)。

这是一个访问 Redshift 的示例 Python 程序。此代码的链接是here。归功于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()

【讨论】:

  • 谢谢,但不幸的是,这是一个通过 Python 连接到 Redshift 的脚本,而不是按照问题要求从 Redshift 卸载到 Python 中的 S3。
  • 您需要先连接到 Redshift,然后才能执行任何类型的 SQL 语句。我已经修改了示例以在示例中显示您的卸载语句。
  • 我认为这里缺少的是对 docs.aws.amazon.com/redshift/latest/APIReference/… 的红移 API 调用以生成 SQL 凭据。您可以使用代入角色的凭据来验证该 API 请求。据我所知,没有 SQL 凭据就无法与 SQL 数据库进行交互。
  • @DanFarrell。很好的评论 - 我喜欢你从安全角度提出的建议。调用 get_cluster_credentials 将需要第三组凭证 - IAM 访问密钥或 IAM 角色 - 来调用 Redshift 管理 API(这些可能与用于 S3 的那些相同,但不推荐使用)。然后,此 API 将返回用于登录 Redshift 集群以执行 SQL 查询的临时凭据。这些凭据将替换我的示例中使用的凭据(用户/密码)。
  • @JohnHanley 这适用于卸载,但我正在尝试运行创建表语句,查询运行 - 但尝试查询它说表不存在。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2021-05-02
  • 2020-02-01
相关资源
最近更新 更多