Redshiftの新機能、S3からの自動コピー(preview)を試してみた

# はじめに
re:Invent 2022での発表の一つに、S3に置いたファイルをRedshiftに自動的にCOPYコマンドで取り込んでくれる機能がプレビューで開始、というのがありましたので早速試してみました。

https://dev.classmethod.jp/articles/amazon-redshift-auto-copy-from-s3/

# 概要
- <font color="red">**プレビューの段階ですので、本運用に使うのは避けてください。**</font>
    - 2023/2/28に終了する予定とのこと
- 今までのcopyコマンドの末尾に、以下を入れるだけ。
```
JOB CREATE my-copy-job-name
AUTO ON     
```
- 過去に取り込まれたファイルパスは、再取り込みされない。
    - 新しく上げなおしても、取込対象外
- 取込の結果は`STL_LOAD_COMMITS`で確認できる。

# 参考

作成の仕方は以下より。

https://docs.aws.amazon.com/redshift/latest/dg/loading-data-copy-job.html

コマンドの書き方は以下にあります。

https://docs.aws.amazon.com/redshift/latest/dg/r_COPY-JOB.html

# やってみた
## COPY用IAMロール作成
使用するロールを作成します。
```yaml
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  RSRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: for-rspreview
      Path: "/"
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - "redshift.amazonaws.com"
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonRedshiftFullAccess
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
```
## Redshift(preview)作成
左ペインの”プロビジョニングされたクラスターダッシュボード”をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/02968303-37aa-fc68-3496-37772d5215f4.png)

上にバナーがでてくるので、右端のボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e86d2639-54bd-a930-7c33-485db1a2595e.png)

Preview trackに以下を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7f1d7d5a-b861-7605-b274-8b71afac55cb.png)

最安価インスタンスで作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1451c59f-eafb-57c7-b30f-8098e906fde4.png)

作成したIAMロールを関連付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/16e9f8b2-16c5-ccf2-340b-df155008bebf.png)

あとはデフォルトで作成します。作成されるまでしばらくかかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/10c9c85c-f6e9-92d0-17da-6d065d076d63.png)

クエリエディタで、以下のSQLを実行してテーブルを作成します。
```sql
CREATE TABLE "public"."climbing" (
  episode INTEGER
  , name VARCHAR(100) 
  , elevation INTEGER 
);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a841339e-5287-bc13-d717-ce280fd45036.png)

この時点で、コピーJOBの一覧コマンドも実行できました。まだ作成前なので空が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/96321dbf-502b-0b37-0f73-9cbc61c0850a.png)

## JOB作成
以下のコマンドを、クエリエディタで実行します。
```sql
COPY public.climbing
FROM 's3://[バケット名]/yama-no-susume' CSv
IAM_ROLE 'arn:aws:iam::123456789012:role/for-rspreview'
IGNOREHEADER 1
JOB CREATE addclimbinglogjob
AUTO ON
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f5b92b35-2cd3-d5fd-e0c4-e51962b66f6d.png)

`COPY JOB LIST`を実行すると、以下のような結果になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7164b4ca-3edb-9939-128a-d13d44a9133a.png)

`COPY JOB SHOW xxx`で、以下のような結果が出てきました。定義時のコマンドのようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/350edc8c-9a85-02d0-2467-7053f797e32d.png)

## ファイル追加
フォルダにファイルを追加する前のテーブルは以下の通り空の状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/cc7aa008-7cdd-aa5f-3021-75fdaf7bc682.png)

フォルダにファイルを置きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1d04dfbf-2d01-986c-d624-6afc9c118f5e.png)

少し待つと、テーブル内にデータが入ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9d9f2b21-7e89-dddf-ff2e-71778b397b2a.png)

2つ目のファイルを置くと、2つ目のファイルのみ追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a36ddb02-a7fd-28d6-212a-79cb7911b9ff.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/00f257ec-c704-4f91-4ad5-97cddd872f2a.png)

## 取込の履歴

`STL_LOAD_COMMITS`の中に、定義時およびファイル単位で入っていました。各ファイルごとにsliceも行うようで、1ファイルあたり2レコード発生していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/86b67fb3-4901-96ec-de32-28237e32153a.png)

その他、`SYS_COPY_JOB`や`SYS_LOAD_HISTORY`には、最初の定義のみが入っており、都度アップロードで実行されるCOPYについての履歴はありませんでした。

## ファイルの上げなおし
3回目のファイルを上げると同時に、1,2回目のファイルも上げなおしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0ed7280b-e1c5-df66-52d5-9b1c626488b8.png)
1,2回目のファイルのデータは増えずに、3回目のファイルだけ追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/5400a814-0665-88f9-32d7-0d5bc8eabcb3.png)

`STL_LOAD_COMMITS`を確認すると、3ファイル目のみ追加されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/23887ded-2729-d6f9-31a5-8524b7cb55ce.png)

ファイルパスで取り込み可否を判断していて、更新日時では見ていないようです。

## ファイルの削除
S3上の元ファイルを削除しても、テーブルに変化はありませんでした。COPYだけですので、"削除トリガーでデータを消す"のようなことはやられていませんでした。

## データの削除
テーブルを空にして、過去に挙げたファイルと新しいファイルをフォルダに置いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/b0c31a2f-956e-44c0-6b0d-c4fa2d6b748e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/494f4037-d43c-39af-172d-c38a0b67a071.png)
過去に取り込んでいないファイルのデータのみ、入ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/fa033406-0757-1a1b-dd9c-4cc00f21c26d.png)

## JOBの削除
`COPY JOB DROP xxx`でJOBが削除できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7f7e33b0-882b-254a-4103-34f0bf955232.png)

実行後は`COPY JOB LIST`からは無くなり、`COPY JOB SHOW xxx`はJOBがないためエラーとなりました。

この状態で、未取込のファイルを置いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2e6e938c-ae3c-e49f-db58-53a52877e677.png)

JOBが無くなっていますので、待っても取り込まれないことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/baf0d9cc-7e5b-44f1-b791-d4f5b8433a7f.png)

# おわりに
外部DBとシステム間連携で取り込むツール等ありますが、担当がファイルを受領してアップ、という運用を行われている方には、大変ありがたいアップデートでしょう。
早く一般利用開始になってほしい機能と感じました。