【AWS】S3からDynamoDBへのインポートができるようになりました！(& ちょっと検証)

## きっかけ
ネットサーフィンしていたら、AWS公式からDynamoDBでS3からのインポートをサポートしました！というブログポストが出ていたので、以前はちょっとしたLambdaとか書いてたなぁと思いつつ、便利っぽいので動作確認しようと思いました。

https://aws.amazon.com/jp/blogs/database/amazon-dynamodb-can-now-import-amazon-s3-data-into-a-new-table/

（流石のクラメソさん、以下でとてもわかりやすくまとめてくれております！）

https://dev.classmethod.jp/articles/amazon-dynamodb-import-amazon-s3-data-into-a-new-table/

### 前提
####  移行前テーブル: before_migrate_table
- 項目: ttl項目についてTTL設定なし, alt_nameはLSI設定時に使用想定
    - id: Number, PK
    - name: String, SK
    - alt_name: String
    - ttl: String
![スクリーンショット 2022-08-20 22.24.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/c4ba166d-28de-d36e-a135-3bfab0c1dc09.png)
![スクリーンショット 2022-08-20 22.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/5f127e90-5e0a-6f6e-1878-66dd26f4501a.png)
![スクリーンショット 2022-08-20 22.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/4b3c3c28-e5b3-c560-2372-e7a7bf1015a4.png)
![スクリーンショット 2022-08-20 22.01.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/bb80cdb5-a357-5b2e-cf09-ebc2b253d2f9.png)

####  移行後テーブル想定: after_migrate_table_(json or csv)
- 項目:
    - id: Number, PK
    - name: String, SK
    - alt_name: String
    - ttl: String

### 検証① DynamoDBのエクスポート後ファイルからのインポート
- DynamoDBからのエクスポートジョブを設定し、エクスポートを実施
![スクリーンショット 2022-08-20 22.04.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/5ee63b2c-4bab-0219-3979-21d427ec5a0e.png)
- エクスポート結果として各レコードごとに.gz形式でエクスポートされることを確認
![スクリーンショット 2022-08-20 22.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/2b583b6d-3fb0-e752-148b-c348a371fcd6.png)
- (解凍後のファイル内容例)
![スクリーンショット 2022-08-20 22.15.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/5366ae95-7e53-20fe-4428-a6851da50c09.png)

- S3からのインポートジョブを作成
    - S3のプレフィックスで階層で指定することも可能（ファイル単位でなくても大丈夫そう） 
![スクリーンショット 2022-08-20 22.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/4205add2-5366-997d-6d6d-68c7a5813abb.png)
- テーブルは新規作成する必要あり。(既存テーブルに追加することはできなさそう)
![スクリーンショット 2022-08-20 22.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/22fc64a4-b106-6664-50db-dc349e2f25b7.png)
- LSIを作成することは出来ない
![スクリーンショット 2022-08-20 22.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/99d7c123-63cc-0f29-e1d2-2b908e02c5b3.png)
- ジョブを作成、完了したことを確認
    - テーブル作成+3レコードインポートで3分程度かかっていた
![スクリーンショット 2022-08-20 22.41.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/4775ebb0-7f9a-43d3-1b32-fa684e5b62d0.png)
- 正常にインポートできていることを確認
![スクリーンショット 2022-08-20 22.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/04300e9d-5d64-27fa-705a-0d99b005af20.png)
![スクリーンショット 2022-08-20 22.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/2f7c89ae-e493-2172-5581-6bd0ac4a84e8.png)

### 検証② CSVエクスポート後ファイルからのインポート
- DynamoDBから項目をCSVにてダウンロード
![スクリーンショット 2022-08-20 22.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/958b60ca-14f8-84b7-e081-9e6edd4d50fa.png)
-　(ダウンロードファイル内容)
![スクリーンショット 2022-08-20 22.17.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/5421d448-e3ee-e3b0-ae95-5c8efabd9538.png)

- S3からのインポートジョブを作成
    - jsonの時と異なり、ヘッダとデリメータの設定項目が表示される
![スクリーンショット 2022-08-20 22.50.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/29ea7431-3c24-49fa-10a1-793052087bd1.png)
- ジョブを作成、完了したことを確認
    - テーブル作成+3レコードインポートで3分程度かかっていた(jsonと大差なし)
 ![スクリーンショット 2022-08-20 22.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/a5da3585-cc3f-58c5-5019-b9febec78a90.png)
- 正常にインポートできていることを確認
![スクリーンショット 2022-08-20 22.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/36715a5f-e7cc-de2f-4f2f-e58766aba8c0.png)
![スクリーンショット 2022-08-20 22.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/0efa0f25-4f48-4a2f-ddec-fe1093b524bf.png)

### 検証③ インポート後のTTL設定追加
- after_migrate_table_jsonでttl項目についてTTL設定を有効化する
![スクリーンショット 2022-08-20 22.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/836e46bf-c0b9-a0ac-dfbe-ea0d018d7120.png)
- 有効化されたことを確認
![スクリーンショット 2022-08-20 23.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/80272389-69ac-dd39-09c2-44b97537afb0.png)
![スクリーンショット 2022-08-20 23.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/6d16d134-dad1-e25a-6238-dc432f9eeeb7.png)

### 検証④ インポート時間の検証
- CSVデータを１万行に拡張し、インポートジョブを作成
![スクリーンショット 2022-08-20 23.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/70591881-8a56-bfe8-0488-0d31bee5ae00.png)
- 実行結果を確認
    - テーブル作成と10000件インポートで約3分半
    - 前述の結果からDynamoDBの初期設定で約３分、 データ量に対しては十分な速度が出そう
![スクリーンショット 2022-08-20 23.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/0edcf25f-07bd-63f9-f53c-794ea1d7ac94.png)

## まとめ
- CSV, JSONで取り込めた
- S3配下のフォルダ内ファイル全部を対象にできた
- LSIは設定できなかった
- TTLは通常と同じく、設定できた
- インポート時間はDynamoDBの初期設定で3分くらい、データ量に対しては十分な速度が出ていた