【OCI クラウド移行ガイド】Amazon DocumentDB を Autonomous JSON Databaseへ移行してみた

# 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/905c3b07-d0fc-669b-35a1-801d1abc36ff.png)


# 移行するサービス：Amazon DocumentDB→Autonomous JSON Database

今回、移行対象とするのはAmazon DocumentDBです。
Amazon DocumentDBはMongoDB互換のフルマネージド型のネイティブ JSON ドキュメントデータベースです。
Autonomous JSON Databaseでは、Oracle Database API for MongoDBを使用してMongoDB互換のDBとして利用することができます。
本記事では、mongoimportを利用してAmazon DocumentDBからAutonomous JSON Databaseへのデータ移行手順をガイドします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0c9f620a-1837-498e-e119-b9a8a9f8713c.png)

Autonomous JSON Databaseの起動、mongoshellからの接続、mongoimportユーティリティの利用方法について厚めに記載したいと思います。


# 移行方式
AWS上のEC2からmongoimportを使用して、Autonomous JSON Databaseへデータを移行していきます。
青い点線が上記の過去記事で実施した、mongoexportユーティリティを利用してAmazon DocumentDBからデータを出力する手順になります。（[2.mongoexportでMongoDB形式のJSONファイルエクスポート](https://qiita.com/yama6/items/d940074277510ceae53d#2-mongoexport%E3%81%A7mongodb%E5%BD%A2%E5%BC%8F%E3%81%AEjson%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88 "mongoexport")）

この記事では、赤枠で囲った部分を対象に移行手順を対象とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/3e9bc0f0-579e-d063-c4a4-33e32b3dffc8.png)


# 前提条件
前提条件としては、下記記事を参考にし、Amazon DocumentDBからmongexportでデータをjson形式で出力していることです。

https://qiita.com/yama6/items/d940074277510ceae53d

この手順で出力したoutput-restaurant.jsonをインプットデータとして使用し、Autonomous JSON Databaseを構築していきます。

# 移行手順
1.Autonomous JSON Databaseの構築
2.mongoimportの実行
3.結果確認

# 1. Autonomous JSON Databaseの構築

# 1-1. Autonomous JSON Databaseの作成
OCIのコンソールにログインし、Oracle DatabaseからAutonomous JSON Databaseを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/27d3fad3-8c65-8b5e-3340-16bc54f30dc1.png)

Autonomous Databaseの作成ボタンを押下します。
作成に当たり、入力内容は下記のとおりです。

|項目 |入力内容
|---|---
|コンパートメント|任意
|表示名|任意
|データベース名|任意
|ワークロード・タイプの選択|JSON
|デプロイメント・タイプの選択|サーバーレス
|データベース・バージョンの選択|19c
|OCPU|1
|ストレージ(TB)|1
|管理者資格証明の作成|
|パスワード|任意
|ネットワーク・アクセスの選択|
|アクセス・タイプ|許可されたIPおよびVCN限定のセキュア・アクセス
|IP表記法タイプ|CIDRブロック
|値|0.0.0.0/0
|相互TLS (mTLS)認証が必要|チェックしない
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/7962117e-ecad-3959-8387-077ea9829b99.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d4a1044a-669e-b86f-666b-dd50d239c7ab.png)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d33f2179-4c58-e6f8-7f1f-2106986ba6d0.png)|

作成ボタンを押下する前に、拡張オプションの表示をクリックし、ツールタブを開くと、MongoDB APIがツールで有効になっていることがわかります。今回、こちらを利用してmongoimportユーティリティからデータを移行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/64e8ccbd-72aa-57f7-92db-1cc42d115b3a.png)

作成ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b0cecf66-ff6e-1d89-5225-8a97b93c8e2e.png)
数分でAutonomous JSON Databaseが作成されました。

# 1-2. Oracle Database API for MongoDBの接続準備

作成したDBの詳細画面から、データベース・アクション->すべてのデータベース・アクションの表示を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2f3b76bf-408c-3477-bc8f-7311e81e0df8.png)

別タブでDatabase Actionsの起動パッドが開きます。
関連サービスのOracle Database API for MongoDBをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/f70e145e-4058-6142-9cf4-634aa2c36bf9.png)

クリックすると、接続文字列のURLが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b9cda860-9c58-f121-5bd6-bb8e2e7fad22.png)
これをコピーしてメモします。

# 1-3. Autonomous JSON Databaseへの接続

mongoshellがインストールされた接続用のEC2からAutonomous JSON Databaseへ接続します。
さきほどメモした接続文字列にユーザ名とパスワードを付与し、mongoshで接続を行います。

```
[ec2-user@ip-10-1-3-138 ~]$ mongosh 'mongodb://admin:passward@XXXXXXXXXXXX-MONGOAJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/admin?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true'
Current Mongosh Log ID: 6549d93437e9fa1c2b87814c
Connecting to:          mongodb://<credentials>@XXXXXXXXXXXX-MONGOAJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/admin?authMechanism=PLAIN&authSource=%24external&ssl=true&retryWrites=false&loadBalanced=true&appName=mongosh+2.0.2
Using MongoDB:          4.2.14
Using Mongosh:          2.0.2

For mongosh info see: https://docs.mongodb.com/mongodb-shell/


To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.

Warning: Found ~/.mongorc.js, but not ~/.mongoshrc.js. ~/.mongorc.js will not be loaded.
  You may want to copy or rename ~/.mongorc.js to ~/.mongoshrc.js.

Deprecation warnings:
  - Using mongosh on the current operating system is deprecated, and support may be removed in a future release.
See https://www.mongodb.com/docs/mongodb-shell/install/#supported-operating-systems for documentation on supported platforms.
admin> 
```
接続が完了しました。

# 2.mongoimportの実行
EC2上にエクスポートされたoutput-restaurant.jsonを使用し、mongoimportを実行します。


```
admin> exit
$ ls
output-restaurant.json
$ mongoimport --uri='mongodb://admin:password@XXXXXXXXXX-MONGOAJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/admin?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true' --collection=restaurants  --type=json  --file=restaurant.json --writeConcern {w:0}
2023-11-07T08:32:26.061+0000    connected to: mongodb://[**REDACTED**]@XXXXXXXXXX-MONGOAJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/admin?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true
2023-11-07T08:32:26.153+0000    done
```

# 3.結果確認 
再度mongoshellで接続し、データが移行されたか確認します。
```
$ mongosh 'mongodb://admin:password@XXXXXXXXXXXX-MONGOAJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/admin?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true'
Current Mongosh Log ID: 6549f63423d796817b99e8df
Connecting to:          mongodb://<credentials>@XXXXXXXXXXXX-MONGOAJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/admin?authMechanism=PLAIN&authSource=%24external&ssl=true&retryWrites=false&loadBalanced=true&appName=mongosh+2.0.2
Using MongoDB:          4.2.14
Using Mongosh:          2.0.2

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

Warning: Found ~/.mongorc.js, but not ~/.mongoshrc.js. ~/.mongorc.js will not be loaded.
  You may want to copy or rename ~/.mongorc.js to ~/.mongoshrc.js.

Deprecation warnings:
  - Using mongosh on the current operating system is deprecated, and support may be removed in a future release.
See https://www.mongodb.com/docs/mongodb-shell/install/#supported-operating-systems for documentation on supported platforms.
admin> show collections
restaurants
admin> db.restaurants.find()
[
  {
    _id: ObjectId("55f14312c7447c3da7051b6a"),
    URL: 'http://www.just-eat.co.uk/restaurants-5starpizza-ha9/menu',
    address: '379 High Road',
    'address line 2': 'Wembley',
    name: '5 Star Pizza',
    outcode: 'HA9',
    postcode: '6AA',
    rating: 2.5,
    type_of_food: 'Pizza'
  },
  ・・・・
admin> db.restaurants.find().count()
2548
```
データの中身が確認でき、jsonファイルに用意されていた2,548行のデータが格納されていることが確認できました。

# まとめ
mongoimportユーティリティを利用し、Autonomous JSON Databaseへのデータ移行を簡単に行うことができました。Autonomous JSON DatabaseはOracle Database API for MongoDBをサポートしているため、MongoDB互換のDBとして操作することが可能です。
また、SQL を使用して他のデータ モデル (リレーショナル、XMLなど) と一緒に JSONデータ をクエリすることも可能なので、フルマネージド統合DBクラウドサービスとしての活用も考えられます。


# 参考

https://medium.com/@mail2crsathishkumar/migration-of-mongodb-collections-to-oracle-json-atp-part-2-a975606cf5

https://blogs.oracle.com/database/post/mongodb-api