Redshiftでは、次のコマンドを実行して、テーブルからS3のファイルにデータをアンロードします。
unload('select * from table')
to 's3://bucket/unload/file_'
iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>'
Pythonでも同じことをしたいのですが、これを複製する方法について何か提案はありますか?アクセスキーとシークレットを使用した例を見ましたが、それは私にとってオプションではありません。非公開バケットでロールベースの資格情報を使用する必要があります。
2セットの資格情報が必要になります。S3バケットにアクセスするためのIAMロールを介したIAMクレデンシャルと、SQLコマンドを実行するためのRedshiftODBCクレデンシャル。
SQL Serverなどの他のデータベースと同様の方法で、Redshiftに接続するPythonプログラムを作成し、クエリを実行します。このプログラムには、IAM認証情報(Redshiftユーザー名、パスワード)ではなく、Redshiftログイン認証情報が必要です。
S3のIAM認証情報は、Redshiftが結果をS3に保存できるように、役割としてRedshiftに割り当てられます。これは、iam_role 'arn:aws:iam:<aws-account-id>:role/<role_name>'
質問のRedshiftクエリの一部です。
Redshift API(Redshift内に保存されているデータベースにアクセスしない)と実際にインターフェースする予定がない限り、Redshiftにアクセスするためにboto3(またはboto)は必要ありません。
RedshiftにアクセスするためのPythonプログラムの例を次に示します。このコードへのリンクはここにあります。VarunVermaによるクレジット
あなたが始めるのを助けるためにインターネット上に他の例があります。
############ 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()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加