re develop

re:develop

Redshift Auto Copy from S3のS3パスの注意点について

こちらの記事にて、Auto Copy JOBを設定する方法を記載しました。

その際に、Query Editor V2にて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
;

この時に、S3のパスを設定するのですがある意味使えるようで使えないような仕様があります。

もし仮に、以下のS3パスのフォルダ以下にファイルが追加されたらAuto Copy JOBが動作するようにしたいとします。

s3://test-bucket/test-folder-1/test-folder-2/

この場合、test-folder-2以下にファイル名が重複しないファイルが追加されるたびにAuto Copy JOBが動作します。

ですが、ここで注意点があります。もしS3パスの最後の / を取るとどの様な挙動になるでしょうか。

s3://test-bucket/test-folder-1/test-folder-2

この場合も、test-folder-2以下にファイルが追加されるとAuto Copy JOBが動作します。

しかし、以下のS3パスのファイルも取り込んでしまいます。

  • s3://test-bucket/test-folder-1/test-folder-2-1
  • s3://test-bucket/test-folder-1/test-folder-2-sample

S3パスの最後にきっちり / を指定しない場合、前方一致したフォルダのファイルも取りこもうとしてしまいます。

この仕様は特定のケースで利用できそうではありますが、バグを発生させかねないのでS3のパスをきっちり指定し、S3のフォルダ構造やファイルの持ち方をよく検討したほうが良さそうです。

(先の例はCOPYコマンドでカラムを指定している場合、取り込みの時にファイル構造とテーブル構造が一致していないと取り込むことはできませんが、パーティション分けしているファイル等、同じ構造のファイルを似通った名前のフォルダに保存しているとこのような事が起きやすいのでは?というか、起こしてしまいました。)

開発メモ

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

参考

開発メモ

(サンプル)まずはこの記事を開きましょう

ブログテンプレートから作成されました🎉

ブログテンプレートからAPIを作成しました。
おつかれさまでした🎉

APIプレビューを試そう🚀

最初に「APIプレビュー」をしてみましょう。

入稿したコンテンツはAPI経由で取得し、Viewに繋ぎ込みます。APIプレビューでは実際のAPIレスポンスを確認でき、あなたの開発を加速させます。

👇まずはここをクリックします。

APIプレビュー画面が開いたら、「取得」ボタンでリクエストを試してみましょう。

この記事の内容がAPIで取得できていることがわかります。

次にやること🏃

APIプレビューで確認したレスポンスを参考に、あなた自身のWebサイトを構築しましょう。
microCMSはAPIでコンテンツを取得するため、お好きな言語・フレームワークで画面を構築できます。

その他にサーバーサイドSDK(PHP / Go / Ruby)やモバイルSDK(iOS / Android)もございます。

お困りなことや疑問点などございましたらお気軽にご連絡ください。
サポート窓口:support@microcms.io
よくある質問:https://help.microcms.io/ja/knowledge

書評