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 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のスケジュールクエリなどはエラー原因が特定しやすい
参考
- 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