ablog

不器用で落着きのない技術者のメモ

AWS Lambda で Amazon Redshift から S3 に UNLOAD する

AWS Lambda で Amazon Redshift から S3 に UNLOAD してみたメモ。

セットアップ手順

  • Redshift クラスターを作成する。
    • Redshift に IAM ロール redshift-role を作成してアタッチする。
      • arn:aws:iam::aws:policy/AmazonS3FullAccess ポリシーをアタッチした IAM ロール
  • S3バケットを作成する。
    • s3://redshift-unload-by-lambda
  • GitHub - jkehler/awslambda-psycopg2 をダウンロードする。
  • lambda_function.py
import psycopg2

def lambda_handler(event, context):
    conn = psycopg2.connect(
        host="redshift-dc2l-1node.************.ap-northeast-1.redshift.amazonaws.com",
        dbname="dev",
        port="5439",
        user="awsuser",
        password="********"
    )

    unload_template = "UNLOAD ('{query}') TO 's3://redshift-unload-by-lambda/' iam_role 'arn:aws:iam::123456789012:role/redshift-role' delimiter ',' allowoverwrite;"
    query = unload_template.format(query="select relname,reltype,relowner from pg_class")

    print query
    cur = conn.cursor()
    cur.execute(query)
    cur.close()
    conn.close()
$ ls -1
lambda_function.py
psycopg2
$ zip -r lambda_function.zip ./*
  • Lambda 関数を作成する。
    • 基本設定
      • タイムアウト: 15分
      • ロール: VPCLambdaRole(AWSLambdaVPCAccessExecutionRole をアタッチしたロール)
    • VPC
      • VPC: Redshift クラスターと同じ VPC
      • サブネット: Redshift クラスターと同じ サブネット
      • セキュリティグループ: Redshift クラスターと同じ VPC のセキュリティグループで、INBOUND で タイプ: Redshift/プロトコル: TCP/ポート範囲: 5439/セキュリティグループ: 自セキュリティグループ を許可。

実行してみる

  • AWS マネジメントコンソールの Lambda 関数のテストから実行

f:id:yohei-a:20200405120432p:plain

  • 実行が成功したことを確認

f:id:yohei-a:20200405120305p:plain

f:id:yohei-a:20200405120308p:plain

  • S3 Select からファイルの中身を確認

f:id:yohei-a:20200405120736p:plain