【OCI クラウド移行ガイド】 NoSQL Database MigratorでAmazon DynamoDB を Oracle NoSQL Database Cloud Serviceへ移行してみた

# OCIクラウド移行ガイドとは

オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア（@araidon,@kazunishi,@yama6）による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。

# 移行したいサンプルワークロード

日々の業務でよく目にするサービスを中心に、サンプルワークロードとしてまとめてみました。このシリーズでは、主にAWSからの移行を取り上げます。
このワークロードは、ユーザがログインして、Web上で写真を共有するWebサービスをイメージしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/86ace69d-7aef-5440-7436-1df3b0e3e69f.png)

# 移行するサービス：Amazon DynamoDB →　Oracle NoSQL Database Cloud Service

今回、移行対象とするのはAmazon DynamoDBです。
OCIにもOracle NoSQL Database Cloud ServiceというNoSQL Databaseサービスがあり、Amazon DynamoDBやMongoDBからの移行をサポートするNoSQL Database Migratorというツールが用意されております。
こちらの記事では、NoSQL Database Migratorを利用して、Amazon DynamoDBからNoSQL Database Cloud Serviceへの移行手順をガイドします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/72fa3250-d04d-bf2c-e9bd-3c8f6bfb3454.png)

# NoSQL Database Migratorとは

>Oracle NoSQL Databaseマイグレータを使用して、NoSQL表をあるデータ・ソースから別のデータ・ソース(オンプレミスまたはクラウドのOracle NoSQL Databaseなど)または単純なJSONファイルに移動できます。MongoDB形式のJSON入力ファイル、DynamoDB形式のJSON入力ファイル(AWS S3ソースまたはファイルから格納)またはCSVファイルをオンプレミスまたはクラウドのNoSQLデータベースにコピーすることもできます。

https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/nosql-database/doc/overview.html

下記は、現在サポートされている移行元(ソース)のデータ形式の一部です。

|タイプ（移行元ファイルの場所） |フォーマット（データ形式）
|---|---
|ファイル・システム  |JSON
|ファイル・システム  |MongoDB JSON
|ファイル・システム  |DynamoDB JSON
|ファイル・システム  |CSV
|OCIオブジェクト・ストレージ  |JSON
|OCIオブジェクト・ストレージ  |MongoDB JSON
|OCIオブジェクト・ストレージ  |CSV
|Amazon S3  |DynamoDB JSON

NoSQL Database Migratorでは、移行元を"ソース"、移行先を"シンク"と表現します。
今回は、下記を移行元、移行先とした場合のガイドをご案内します。
|移行元（ソース） |移行先（シンク）
|---|---
|Amazon S3 DynamoDB JSON  |Oracle NoSQL Database Cloud Service

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6ffd73b5-b08b-1f92-21db-8e1b1a6b294d.png)

移行手順は下記のサイトを参考にしました。

https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/nosql-database/doc/use-case-demonstrations.html#NCSAI-GUID-12D9BCE9-16F5-4852-999E-AD52320071C8


# 移行手順
① DynamoDBの作成とエクスポート
② NoSQL Database Migratorのダウンロードとインストール
③ NoSQL Database Migratorの権限設定
④ 構成ファイル(JSON形式)の作成
⑤ runMigratorコマンドの実行
⑥ 移行データの確認

# 1. DynamoDBの作成とエクスポート
# 1-1. DynamoDBの作成
移行元のソースとするDynamoDBは、下記記事を参考に作成しました。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SampleData.html

マネージドコンソールから、ステップ1、ステップ2を実施することで、今回の移行元のDynamoDBとして扱うMusicという名前のテーブルデータが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0136932f-1234-8e18-37c6-bc2d2be6a4fb.png)
※画像では、ステップ4まで実施しています。

# 1-2. DynamoDBのエクスポート
下記サイトを参考に、DynamoDBをS3にエクスポートします。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/S3DataExport_Requesting.html

エクスポートされたファイル形式は、DynamoDB JSONを選択します。
DynamoDBからS3へのエクスポートが完了すると、下記ファイル群が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/7a9e07e4-cc26-d90c-92cf-6927cbec955b.png)

このファイル群のうち重要なのは、dataフォルダの中に入っている<自動生成ランダム文字列>.jsonファイルです。ここに、DynamoDBからエクスポートした実データがjson形式で格納されます。

```
{"Item":{"Artist":{"S":"No One You Know"},"SongTitle":{"S":"Call Me Today"},"AlbumTitle":{"S":"Somewhat Famous"},"Awards":{"N":"1"}}}
{"Item":{"Artist":{"S":"No One You Know"},"SongTitle":{"S":"Howdy"},"AlbumTitle":{"S":"Somewhat Famous"},"Awards":{"N":"2"}}}
{"Item":{"Artist":{"S":"Acme Band"},"SongTitle":{"S":"Happy Day"},"Awards":{"N":"10"},"AlbumTitle":{"S":"Updated Album Title"}}}
{"Item":{"Artist":{"S":"Acme Band"},"SongTitle":{"S":"PartiQL Rocks"},"AlbumTitle":{"S":"Another Album Title"},"Awards":{"N":"8"}}}
```

のちの構成ファイル(JSON形式)の作成にて、ファイル群がエクスポートされたプレフィックスへのURLを使用しますので、「URLのコピー」ボタンを押下して、URLをメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/fc8cd14d-b883-65d9-fd9a-85236f5a67b7.png)


# 2. NoSQL Database Migratorのダウンロードとインストール
# 2-1. NoSQL Database Migratorのダウンロード
では、本記事のメインコンテンツとなるNoSQL Database Migratorをダウンロードします。

https://www.oracle.com/database/technologies/nosql-database-server-downloads.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5fac5193-0adf-8118-574b-009d05442732.png)

:::note warn
AWS S3をソースとして移行する機能はver.1.4.0で対応したため、nosql-migrator-1.5.0 を選択します。
:::

ラベルを押下すると、別タブでログイン画面に遷移します。
Oracleアカウントでログインすると、Oracle Software Delivery Cloudが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/9a4df727-17fb-51c1-3e8f-65df57bd2be5.png)

:::note warn
Oracleアカウントをお持ちでない場合には、こちらでユーザ登録します。
https://www.oracle.com/jp/education/guide/newuser-172640-ja.html
:::

"I reviewed and accept the Oracle License Agreement."にチェックを入れ、Downloadボタンを押下します。

Oracle_SSN_DLM_XXXXXXX.exe がダウンロードされるので、ローカルPCで実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/929a83d0-0561-fad5-72df-4f6a8e1acbca.png)

最初に表示される画面でダウンロードディレクトリを選択し、NEXTボタンを押下すると、ダウンロードが開始されます。このうち、"V1033765-01.zip"ファイルを使用してNoSQL Database MigratorをEC2上に展開します。

# 2-2. NoSQL Database Migratorのインストール
このzipファイルを、移行元であるAmazon EC2上で展開します。
Amazon CloudShellのアップロード機能を使用し、CloudShell上にzipファイルをアップロードします。
アップロード後、EC2へファイルを転送します。
※EC2上で、nosqlMigratorというディレクトリを予め作成しています。

```
scp -i test-pub-key.pem V1033765-01.zip ec2-user@XXX.XXX.XXX.XXX:/home/ec2-user/nosqlMigrator
```
zipを展開します。
```
unzip V1033765-01.zip -d /home/ec2-user/nosqlMigrator
```
展開すると、nosql-migrator-1.5.0ディレクトリに下記ファイル群が解凍されます。
```
CHANGELOG.md  LICENSE.txt  README.md  THIRD_PARTY_LICENSES.txt  lib  log4j2.xml  runMigrator  sdk_logging.properties
```

# 2-3. NoSQL Database Migratorの環境設定：Java11インストール
Oracle NoSQL Database Migratorを実行するには、Java 11以降のバージョンが必要です。
Java11をインストールします。
NoSQL Database MigratorをダウンロードしたEC2のOSに合わせてインストールコマンドを実行します。
本検証環境ではAmazon Linux 2023を使用しているので、java-11-amazon-correttoをインストールしました。
```
sudo yum install java-11-amazon-corretto-devel.x86_64
```

# 3. NoSQL Database Migratorの権限設定
# 3-1. OCIの権限設定
EC2上のNoSQL Database MigratorからOCI側のリソース（今回はNoSQL Database Cloud Service）を操作できるよう権限設定をします。
NoSQL Database Cloud Serviceを操作する権限が付与されているユーザを使用するものとします。

下記記事を参考に、OCIのconfigファイル作成、APIキーのアップロードを行います。

https://qiita.com/yama6/items/59e526a63e724a7f8f85#1-2-1-ec2%E4%BD%9C%E6%A5%AD%E7%94%A8%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E3%81%A6oci%E6%8E%A5%E7%B6%9A%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A8%A9%E9%99%90%E8%A8%AD%E5%AE%9Aconfig%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BD%9C%E6%88%90

# 3-2. AWSの権限設定
EC2上のNoSQL Database MigratorからAWS側のリソースを操作できるよう権限設定をします。
S3を操作するAmazonS3FullAccessの権限が付与されているIAMユーザを使用するものとします。

下記リファレンスを参照し、IAMユーザのアクセスキー、シークレットアクセスキーを作成します。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey

configファイル作成のため、下記コマンドを実行します。ユーザ名は任意です。

```
aws configure --profile 【ユーザ名】
```
作成したIAMユーザのアクセスキー、シークレットアクセスキーを使用し、順番に入力していきます。
```
AWS Access Key ID [None]: XXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
/.awsディレクトリに config  credentials ファイルが生成されます。

```
[ec2-user@ip-XXX-XXX-XXX-XXX .aws]$ ls
config  credentials
```
これでNoSQL Database Migratorから必要なサービスを扱う上での権限設定は完了です。

# 4. 構成ファイル(JSON形式)の作成
ここからは構成ファイルを作成していきます。
migrator-config.jsonという名前でnosqlMigratorディレクトリに空ファイルを作成します。
```
$ touch migrator-config.json
```
このファイルに記載する内容は下記のとおりです。
→以降は、それぞれのパラメータで設定しているものを解説しています。

```
{
  "source" : {
    "type" : "aws_s3",→ エクスポートファイルの出力先タイプの指定
    "format" : "dynamodb_json",→ 1-2. DynamoDBのエクスポートでエクスポートされたファイル形式のDynamoDB JSONのこと
    "s3URL" : "https://dynamojson.s3.ap-northeast-1.amazonaws.com/AWSDynamoDB/01697945981151-8c5a4858/",　→ 1-2. DynamoDBのエクスポートでメモしたDynamoDBのエクスポートファイルが出力されたS3のURL
    "credentials" : "/home/ec2-user/.aws/credentials",→credentialファイルの保存先
    "credentialsProfile" : "XXXXX" →　3-2. AWSの権限設定で設定したユーザ名
  },
  "sink" : {
    "type" : "nosqldb_cloud",→ シンクの種類を選択
    "endpoint" : "ap-tokyo-1",
    "table" : "test",→ table名（任意）
    "compartment" : "test",→コンパートメント名（任意）
    "schemaInfo" : {
      "defaultSchema" : true,→Trueの場合、ツールがデフォルトでスキーマを作成してくれる
      "readUnits" : 100,
      "writeUnits" : 60,
      "DDBPartitionKey" : "Artist:String",→DynamoDBのパーティションキーを指定
      "DDBSortKey" : "SongTitle:String",→DynamoDBのソートキーを指定
      "storageSize" : 1
    },
    "credentials" : "/home/ec2-user/.oci/config",→configファイルの保存先
    "credentialsProfile" : "DEFAULT",→3-1. OCIの権限設定で設定したユーザ名
    "writeUnitsPercent" : 90,
    "requestTimeoutMs" : 5000
  },
  "abortOnError" : true,
  "migratorVersion" : "1.5.0"→3-1. NoSQL Database Migratorのバージョン指定
}
```
ポイントとしては、1-1. DynamoDBの作成で構築したDynamoDBの下記の項目を明示的に指定している点です。

|DynamoDB項目名 |DyanmoDBキー種類|Migratorパラメータ|
|---|---|---
|Artist|パーティションキー|DDBPartitionKey
|SongTitle|ソートキー|DDBSortKey

この設定を誤ると、ツールが正常実行されても予期せぬ結果になる可能性があるため、ソースのDynamoDBのテーブル構造を把握して本ファイルを作成することが重要です。
ちなみにDynamoDB側で存在していたSongTitleというソートキーをDDBSortKeyに設定せずツールを実行したら、Oracle NoSQL Database Cloud Service側の行数は2行になりました。

# 5. runMigratorコマンドの実行

ではここまで準備が整ったら、ツールを実行してみましょう。
```
$ ./runMigrator --config /home/ec2-user/nosqlMigrator/migrator-config.json
2023-10-26 11:14:56.191 [INFO] Configuration for migration:
{
  "source" : {
    "type" : "aws_s3",
    "format" : "dynamodb_json",
    "s3URL" : "https://dynamojson.s3.ap-northeast-1.amazonaws.com/AWSDynamoDB/01697945981151-8c5a4858/",
    "credentials" : "/home/ec2-user/.aws/credentials",
    "credentialsProfile" : "XXX"
  },
  "sink" : {
  },
  "sink" : {
    "type" : "nosqldb_cloud",
    "endpoint" : "ap-tokyo-1",
    "table" : "test2",
    "compartment" : "XXX",
    "schemaInfo" : {
      "defaultSchema" : true,
      "readUnits" : 100,
      "writeUnits" : 60,
      "DDBPartitionKey" : "Artist:String",
      "DDBSortKey" : "SongTitle:String",
      "storageSize" : 1
    },
    "credentials" : "/home/ec2-user/.oci/config",
    "credentialsProfile" : "DEFAULT",
    "writeUnitsPercent" : 90,
    "requestTimeoutMs" : 5000
  },
  "abortOnError" : true,
  "migratorVersion" : "1.5.0"
}
2023-10-26 11:14:56.198 [INFO] creating source from given configuration:
2023-10-26 11:14:58.701 [INFO] source creation completed
2023-10-26 11:14:58.710 [INFO] creating sink from given configuration:
2023-10-26 11:15:00.612 [INFO] sink creation completed
2023-10-26 11:15:00.613 [INFO] creating migrator pipeline
2023-10-26 11:15:00.614 [INFO] migration started
2023-10-26 11:15:00.614 [INFO] [cloud sink] : start loading DDLs
2023-10-26 11:15:00.638 [INFO] [cloud sink] : executing DDL: CREATE TABLE IF NOT EXISTS test2 (Artist String,SongTitle String,document JSON, PRIMARY KEY(SHARD(Artist),SongTitle)),limits: [100, 60, 1]
2023-10-26 11:15:05.748 [INFO] [cloud sink] : completed loading DDLs
2023-10-26 11:15:05.868 [INFO] [cloud sink] : start loading records
2023-10-26 11:15:05.877 [INFO] [DDB S3 source] : start parsing JSON records from object: AWSDynamoDB/01697945981151-8c5a4858/data/7py2vdvmqm5khbgqumgvc7phry.json.gz
2023-10-26 11:15:06.288 [INFO] migration completed.
Records provided by source=4, Records written to sink=4, Records failed=0, Records skipped=0.
Elapsed time: 0min 5sec 653ms
Migration completed.
```
正常に処理が実行できました！

4. 構成ファイル(JSON形式)の作成 にて記載した "defaultSchema" : true で生成されたDDL文が下記となります。
```
CREATE TABLE IF NOT EXISTS test2 (Artist String,SongTitle String,document JSON, PRIMARY KEY(SHARD(Artist),SongTitle))
```
これがCREATE TABLE文となり、Oracle NoSQL Database Cloud Serviceが生成されます。

ここまでの手順も加味した、NoSQL Database Migratorの実行イメージは下記のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0a202571-9eae-27c4-bddd-dd73f4f97358.png)

# 6. 移行データの確認
では実際にOCIにログインし、Oracle NoSQL Database Cloud Serviceが作成されているか確認してみましょう。
画面左上のハンバーガーメニューから、データベース>Oracle NoSQL Databaseに遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0a905e13-7221-e258-3162-74ab1bf32d7c.png)

4. 構成ファイル(JSON形式)の作成でパラメータに指定した"table" : "test2"の通り、テーブルが作成されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/10efdb4f-e5ed-1ab2-8819-7faa8678e353.png)

テーブル名のラベルをクリックすると表の詳細が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/92cc5d97-7ba1-9b06-e0bf-d10d13ae0c70.png)
データの探索フィールドで、「実行ボタン」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/bddcda50-1ac1-a9b2-94a7-e6f62a9a9c04.png)
すると、パーティションキーに設定したArtistカラム、ソートキーに設定したSontgTitleカラム、documetカラムにそれぞれソースの値が入っていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/bf6a9cda-8038-d4d1-e858-9d63e727de7a.png)

以上で、NoSQL Database Migratorを使用した、Amazon DynamoDB から Oracle NoSQL Database Cloud Serviceへの移行は完了です。

# まとめ
移行ツールが用意されているため、容易にDynamoDBからOracle NoSQL Database Cloud Serviceへの移行ができました。構成ファイルに記載するソースとシンクのパラメータについての詳細は下記をご確認ください。

https://docs.oracle.com/cd/F79106_01/admin/mapping-dynamodb-types-oracle-nosql-types.html#GUID-8E500CF0-4DD8-4B78-9AA8-C592A21F2313

# 参考

https://docs.oracle.com/ja-jp/iaas/nosql-database/doc/overview.html

https://docs.oracle.com/cd/F79106_01/admin/mapping-dynamodb-table-oracle-nosql-table.html#GUID-5845149C-8043-456B-986B-4668F29B9F0A

https://www.oracle.com/database/technologies/nosql-database-server-downloads.html