DynamoDBのS3 Exportを確認する

# 背景・目的
DynamoDB(以降、DDBという。)のデータをS3に出力し、Glueで参照するにあたり以下の内容を確認します。
- DDBからS3にExportの時間
- ファイル数

# まとめ
以下の条件でのExportの実行時間は「5分程度」、ファイル数は「6」でした。
- DDBのレコード件数は約104万件

# 実践
## 準備
### データの準備
1. CSVファイルをアップロードするバケットを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d0100e8c-cf20-a895-0b49-f1282313c403.png)

1. ファイルを準備します。
```
$ head ddb-import.csv 
"id","time"
"12","20221027"
"13","20221027"
"14","20221027"
"15","20221027"
"16","20221027"
"17","20221027"
"18","20221027"
"19","20221027"
"20","20221027"
$


$ ls -l ddb-import*csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:23 ddb-import-10.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:22 ddb-import-2.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:22 ddb-import-3.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:22 ddb-import-4.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:22 ddb-import-5.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:23 ddb-import-6.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:23 ddb-import-7.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:23 ddb-import-8.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:23 ddb-import-9.csv
-rw-r--r--  1 XXXX  YYYY  20909047 10 27 02:20 ddb-import.csv
$ 

$ wc -l ddb-import*csv
 1048576 ddb-import-10.csv
 1048576 ddb-import-2.csv
 1048576 ddb-import-3.csv
 1048576 ddb-import-4.csv
 1048576 ddb-import-5.csv
 1048576 ddb-import-6.csv
 1048576 ddb-import-7.csv
 1048576 ddb-import-8.csv
 1048576 ddb-import-9.csv
 1048576 ddb-import.csv
 10485760 total
$

```

1. データをアップロードします。
19.9MB*10ファイル≒200MBのファイルを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/17535161-60e6-4e28-e99d-ae927a993030.png)


### DDBへインポート
S3ファイルをインポートします。
1. DDBの画面で「S3からインポート」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/60a16965-2101-6f1b-858c-2c5206362f30.png)

1. 以下を入力し「次へ」をクリックします。
    - ソースS3URL:アップロードしたファイルが格納されているS3パス
    - S3バケット所有者：このAWSアカウント
    - ファイル圧縮をインポート：圧縮なし
    - インポートファイルのフォーマット：CSV
    - CSVヘッダー:ソースファイルの最初の行を使用
    - CSV区切り文字：カンマ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3eccdfd4-f8ff-b2cd-33a8-271c7cd9ace5.png)

1. 以下を入力し、「次へ」をクリックします。
    - テーブル名：EXPORT_TABLE006
    - パーティションキー：
        - id
        - time
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ddb642ff-a2b4-73b6-5ff1-acd2deebfbed.png)

1. 「インポート」をクリックします。
1. しばらくして、失敗しました。
:::note warn
CloudWatch Logsには、以下のエラーが出ていました。原因の調査ができていません。（後日調査予定）
Unable to map value based on the given schema. Remainder of the file will not be processed
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c47df1e2-7d22-f638-f68c-11707f7459d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5cab6ae1-6d13-1227-72f1-2b0a0c129af5.png)


## エクスポート
1. DDBのテーブルでポイントインタイムリカバリ（以降、PITRという。）を有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f319da4e-0c06-9cc8-693c-d4fa3a6d9149.png)

1. 以下を指定して「エクスポート」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/19620810-b9e4-e0ac-63be-bcbb10ee4fe4.png)

1. しばらくするとエクスポート中から、完了になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2d1a87b9-d595-018d-fc77-161ae9e4753c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8cc0a5b0-c517-4b48-6d55-c4f714b1ec42.png)

1. 出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/509ec794-a4f8-7df5-d02b-612bc96fb33a.png)

1. ファイルの件数を確認します。104万件でした。
```
$ aws s3 ls XXXX/ddb-export/AWSDynamoDB/01666809631252-b06e07bc/data/
2022-10-27 03:45:05     655774 aagmcask6azqrldvsymxbknosu.json.gz
2022-10-27 03:44:43     652058 gck6vxjj2a7gtdk3b6gmzp5sya.json.gz
2022-10-27 03:45:04     654112 gg5nfwkv3e4odd5a6fzpvplal4.json.gz
2022-10-27 03:45:09     653818 gwcolxdf3e2btc5gf5xk7qg2by.json.gz
2022-10-27 03:45:08     651472 mdyoqwtfsq7vtlmkvvndz3qd2a.json.gz
2022-10-27 03:45:08     654626 o4kd5m6el45c5aou6szy35mh2e.json.gz
2022-10-27 03:45:35     652502 wtz25phida5nnbgwgngnxmbkqa.json.gz
$

$ aws s3 cp s3://XXXX/ddb-export/AWSDynamoDB/01666809631252-b06e07bc/data/aagmcask6azqrldvsymxbknosu.json.gz - | gunzip | wc -l

  150292
$ ^aagmcask6azqrldvsymxbknosu.json.gz^gck6vxjj2a7gtdk3b6gmzp5sya.json.gz
aws s3 cp s3://XXXX/ddb-export/AWSDynamoDB/01666809631252-b06e07bc/data/gck6vxjj2a7gtdk3b6gmzp5sya.json.gz - | gunzip | wc -l
  149484
$ ^gck6vxjj2a7gtdk3b6gmzp5sya.json.gz^gg5nfwkv3e4odd5a6fzpvplal4.json.gz
aws s3 cp s3://XXXX/ddb-export/AWSDynamoDB/01666809631252-b06e07bc/data/gg5nfwkv3e4odd5a6fzpvplal4.json.gz - | gunzip | wc -l
  150006
$ ^gg5nfwkv3e4odd5a6fzpvplal4.json.gz^gwcolxdf3e2btc5gf5xk7qg2by.json.gz
aws s3 cp s3://XXXX/ddb-export/AWSDynamoDB/01666809631252-b06e07bc/data/gwcolxdf3e2btc5gf5xk7qg2by.json.gz - | gunzip | wc -l
  149856
$ ^gwcolxdf3e2btc5gf5xk7qg2by.json.gz^mdyoqwtfsq7vtlmkvvndz3qd2a.json.gz
aws s3 cp s3://XXXX/ddb-export/AWSDynamoDB/01666809631252-b06e07bc/data/mdyoqwtfsq7vtlmkvvndz3qd2a.json.gz - | gunzip | wc -l
  149320
$ ^mdyoqwtfsq7vtlmkvvndz3qd2a.json.gz^o4kd5m6el45c5aou6szy35mh2e.json.gz
aws s3 cp s3://XXXX/ddb-export/AWSDynamoDB/01666809631252-b06e07bc/data/o4kd5m6el45c5aou6szy35mh2e.json.gz - | gunzip | wc -l
  150029
$ ^o4kd5m6el45c5aou6szy35mh2e.json.gz^wtz25phida5nnbgwgngnxmbkqa.json.gz
aws s3 cp s3://XXXX/ddb-export/AWSDynamoDB/01666809631252-b06e07bc/data/wtz25phida5nnbgwgngnxmbkqa.json.gz - | gunzip | wc -l
  149588
$

```

# 考察
- 100万件で6ファイル出力されました。ある程度まとめられて出力されることからGlueでも扱えそうです。
- Importに失敗したため、原因は後日確認したいと思います。

# 参考
https://docs.aws.amazon.com/cli/latest/reference/dynamodb/export-table-to-point-in-time.html