re develop

re:develop

Redshift ServerlessでS3のファイルをAUTO COPYする

Redshift Serverlessにて、S3にファイルが追加された際にCOPYが自動実行される機能、Auto Copyの設定手順について

S3のバケットポリシーを作成する

S3のバケットポリシーを以下のように設定する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Auto-Copy-Policy-01",
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": [
                "s3:GetBucketNotification",
                "s3:PutBucketNotification",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::xxxxxxxxxx",
            "Condition": {
                "StringLike": {
                    "aws:SourceAccount": "123456"
                },
                "ArnEquals": {
                    "aws:SourceArn": "arn:aws:redshift:ap-northeast-1:12345678:integration:*"
                }
            }
        }
    ]
}

上記のポリシーで変更すべき点は以下になる

  • Resource
    • S3バケットのARNに変更する
  • condition
    • StringLike
      • aws:SourceAccount: 123456の部分を自分のAWSアカウントのIDに変更する
    • ArnEquals
      • aws:SourceArn:Redshift Serverlessで利用するintegrationのARNに変更する
        • 具体的には、リージョンAWSアカウントIDを変更する

Redshift Serverlessのコンソールにて、S3 Event Integrationを作成する

  1. Redshift Serverlessコンソールの左サイドナビゲーションから、S3 Event Integrationsを選択
  2. コンソールにS3 Event Integrationsが表示されるので、オレンジ色のボタン Create S3 Event Integration をクリック
    1. Enter name and description
      1. S3統合名を入力、バケット毎の作成になるのでバケット名などにしておくと良い
      2. descriptionは任意で入力
    2. Source Select
      1. バケットポリシーを追加したバケットを選択
    3. Select Target
      1. 対象のRedshift Serverlessを選択
        1. 現在のAWSアカウント上にあるならば、Use the current accountを選択
        2. Browse Redshift data warehouseから選択
        3. この後、エラーメッセージとともに、Fix it to meというチェックボックスが表示されるのでチェックを入れる
        4. 次へを選択
    4. Tagが必要であればTagを設定
    5. 設定内容を確認して、作成完了

Query Editor V2にてAuto Copy JOBを作成する

Query Editor V2にて、COPY JOBを作成するようにAUTO COPY JOBを設定する

COPY データベース.スキーマ.テーブル(
  カラム,
  カラム
) FROM 's3://バケット/フォルダ/フォルダ/フォルダ/'
IAM_ROLE 'arn:aws:iam::xxxxxxxxxxxxx:role/service-role/AmazonRedshift-CommandsAccessRole-xxxxxxxxxxx'
CSV
IGNOREHEADER 1
DELIMITER ','
JOB CREATE xxxxxxxxxxxxxxxxxx
AUTO ON
;

すでにCOPY JOBを作成している場合は、2行を追加

  • JOB CREATE ジョブ名
  • AUTO ON

ここまでの設定が完了すれば、ジョブが動作する状態になっている

Auto Copy JOBの確認方法

Auto Copy JOBを利用するうえでよく利用するSQLを以下に記載

Auto Copy JOBの一覧

COPY JOB LIST

Auto Copy JOBの詳細

COPY JOB SHOW ジョブ名

Auto Copy JOBの削除

COPY JOB DROP ジョブ名

ロード履歴の確認

SELECT
  status,
  user_id,
  query_id,
  table_name,
  TRUNC(start_time),
  data_source
FROM
  sys_load_history
WHERE copy_job_id != 0
ORDER BY start_time DESC

ロードされたデータの確認

SELECT
 *
FROM
  SYS_LOAD_DETAIL
ORDER BY start_time DESC

所感

データ分析基盤を運用していくうえで、AWS外から送られてくるファイルをS3に連携することはユースケースとしてよくあると思います

ファイルが追加されればテーブルへ自動的に反映される機能は非常にありがたく、便利に使っていければと

注意点や課題として

  • 同名のファイルが配置された場合はジョブは動かない
    • Auto Copyではなく、Copyコマンドを使うこと
  • ジョブが失敗した場合の調査は、自分で調べるしか無い
    • Query Editor V2のスケジュールクエリなどはエラー原因が特定しやすい

参考