✍️

Redshift Data APIを使う上での注意点まとめ

2022/02/01に公開

はじめに

Redshiftを使用するにあたって、Redshiftの周辺には様々なツールが整備されている
Redshiftのストレージを意識しなくても済むような Redshift Spectrum や最近出た(プレビューだが) Redshift Serverless がある
今回はその中でもRedshift Data APIについて検討する機会があったのでそれについてまとめる

Redshift Data APIとは

Amazon Redshift Data API の使用

(引用) 組み込みの Amazon Redshift データ API を使用して、Amazon Redshift データベースにアクセスできます。この API を使用すると、AWS Lambda、Amazon SageMaker ノートブック、AWS Cloud9 などのウェブサービスベースのアプリケーションで Amazon Redshift データにアクセスできます。

準備

Amazon Redshift データ API を呼び出すときの認証情報の選択

Redshiftへの認証とData APIの認証を行うことでRedshift Data APIを利用することができる
Redshiftの認証だけでは足りない ということに注意してほしい
認証方法には2種類があり、どちらかを用いてData APIを認証し利用する

  • AWS Secrets Manager
  • 一時認証

メリット

接続の管理が不要

Amazon Redshift Data API の使用 にも記載されているが

(引用) 接続を管理せずに SQL ステートメントを実行することができます

接続を管理しなくても済むことがメリットになる

複数クエリも大丈夫

Amazon Redshift Data API で、マルチステートメントクエリの実行とパラメータのサポートを開始にあるように同一トランザクション内でクエリを実行できるようになった

注意点

結論から言うと、1つの処理で複数クエリ扱いたい場合のクエリ管理に工夫が必要
boto3を用いてRedshift Data APIに複数クエリを投げる場合はbatch_execute_statementを用いる

# ドキュメントと同じもの
response = client.batch_execute_statement(
    ClusterIdentifier='string',
    Database='string',
    DbUser='string',
    SecretArn='string',
    Sqls=[
        'string',
    ],
    StatementName='string',
    WithEvent=True|False
)

Sqls がlistになっており、ここに必要な複数クエリを記述する
実際にはここにクエリをベタ書きすることは無いはずで、用意されたSQLファイルを読み込み Sqls に展開したいはず
そうなると Sqls の引数ごとにSQLファイルを用意するかパーサーを使ってSQLステートメントをバラす必要がある
参考: sqlparse

具体的には Sqls に対して以下のようにしてあげると、複数クエリを扱えるようにできる

# 複数クエリが書いてあるhoge.sqlを読み込む
with open("hoge.sql", 'r') as f:
    sql = f.read()

# ステートメントごとにパースするライブラリを読み込む
import sqlparse
statements = sqlparse.split(sql)

# batch_execute_statementのSqlsに渡す値を作成
sqls = list()
for s in statements:
    sqls.append(s)

最後に

Redshift Data APIのメリットは 接続の管理をしなくても済む である
Redshift Data APIではトランザクション管理を利用者側で制御できないので、 Rollbackをしたい という際は利用することは難しい
またpsycopg2では単一のSQLステートメントしか実行できないので、複数のSQLステートメントを実行する際はパース処理を入れるなど工夫が必要

参考資料

Discussion