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を変更する
- aws:SourceArn:Redshift Serverlessで利用するintegrationのARNに変更する
- StringLike
Redshift Serverlessのコンソールにて、S3 Event Integrationを作成する
- Redshift Serverlessコンソールの左サイドナビゲーションから、S3 Event Integrationsを選択
- コンソールにS3 Event Integrationsが表示されるので、オレンジ色のボタン Create S3 Event Integration をクリック
- Enter name and description
- S3統合名を入力、バケット毎の作成になるのでバケット名などにしておくと良い
- descriptionは任意で入力
- Source Select
- バケットポリシーを追加したバケットを選択
- Select Target
- 対象のRedshift Serverlessを選択
- 現在のAWSアカウント上にあるならば、Use the current accountを選択
- Browse Redshift data warehouseから選択
- この後、エラーメッセージとともに、Fix it to meというチェックボックスが表示されるのでチェックを入れる
- 次へを選択
- 対象のRedshift Serverlessを選択
- Tagが必要であればTagを設定
- 設定内容を確認して、作成完了
- Enter name and description
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 LISTAuto 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のスケジュールクエリなどはエラー原因が特定しやすい
参考
- https://aws.amazon.com/jp/blogs/big-data/simplify-data-ingestion-from-amazon-s3-to-amazon-redshift-using-auto-copy/
- https://docs.aws.amazon.com/redshift/latest/dg/loading-data-copy-job.html
- S3バケットポリシーのstringEqualsの部分でWarningが出るので本ブログ記事では修正しています
- https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html#access-analyzer-reference-policy-checks-security-warning-string-like-operator-with-arn-condition-keys