OKITでデザインしたシステム構成をResource Managerと連携してOCI上に構築してみた

- OCI Designer Toolkit (OKIT) の使い方メモ〜その2
- OKITを利用してリファレンス・アーキテクチャをデザインする
- OKITとResource Managerを連携してデザインされたシステムを構築する

# はじめに
OCI Designer Toolkit (OKIT)は、ブラウザベースのシステム・アーキテクチャ設計ツール (オープンソース) で、Oracle Cloud Infrastructure (OCI) 上のアーキテクチャ設計・プロトタイピングをグラフィカルなインターフェースで直感的に行うことができます。本記事ではOKITとResource Managerを連携し、OKIT上にデザインされたリファレンス・アーキテクチャをOCI上に構築します。OKITのインストール方法については前回の記事を参照ください。

[OKITを利用してOCI上のアーキテクチャを可視化してみた](https://qiita.com/orakurara/items/0dd75a1332ac1845e974)

# OKITリファレンス・アーキテクチャの利用
## 検証環境 （クライアント）
- macOS 10.15.7 Catalina
- Docker Engine 19.03.13
- Oracle Cloud Infrastructure Designer and Visualisation Toolkit 0.13.0

## OKITリファレンス・アーキテクチャの展開
OKITコンテナが稼働しているクライアントのブラウザから、下記URLでOKITにアクセスします。

[`http://localhost/okit/designer`](http://localhost/okit/designer)

OKITのメニューを開き**Reference Architecture**から**HA Web Application**を選択してください。
![20-11-09-21-56-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/8f5ca3eb-b2fa-ecae-b1c6-a9303055e1ff.png)
リファレンス・アーキテクチャには、各アーティファクトが配置され、各種プロパティが事前定義済のシステム・アーキテクチャが用意されています。HA Web Applicationを選択するるとPrivate Subnetに配置された2台のWebアプリケーション、Database Cloud Service (DBCS) インスタンス (Database System)、Public Subnetに配置されたPublic Load Balancerと踏台サーバ (bastion) が配備された、代表的なWebシステム・アーキテクチャがキャンバスに表示されます。
![20-11-09-22-07-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/7be41168-521b-857e-2def-8859f8e24ab2.png)

もし、参考になるようにシステム・アーキテクチャがリファレンス・アーキテクチャにない場合はパレットからアーティファクトを選択、キャンバス上に配置し新規にアーキテクチャをデザインすることも可能です。そのとき[OCI Designer Toolkit Usage Guide - Examples](https://github.com/oracle/oci-designer-toolkit/blob/master/documentation/Usage.md#examples)が参考になります。（英語ドキュメントですがキャンバスのスクリーンショットを見れば視覚的に理解できるはずです）

# OKITリファレンス・アーキテクチャの編集
リファレンス・アーキテクチャをキャンバスに展開した状態で、画面の右側に表示される検証 (Valodate) パネルを開くと、未設定のプロパティ項目や適切でない設定を洗い出すことができます。
![20-11-09-22-32-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/1e233d0b-25d6-596c-16d4-d2f941ac625c.png)

今回の場合はDatabase Systemのhawebdbインスタンスに公開鍵が登録されていないエラー（修正必須）、Compute Serviceの各インスタンスに公開鍵が登録されていないと警告（修正任意 : 構築後でも登録可能）メッセージが表示されています。キャンバス上の該当するアーティファクトをクリックしプロパティ (Properties) パネルを表示し、**Authorized Keys**にインスタンスへのアクセスに利用するSSHキーペアの公開鍵の内容をコピー＆ペーストして値を登録します。その際に**Shape**等の設定も確認し、適宜修正してください。また、Single ADのリージョンへの展開を予定している場合には、**Availability Domain**の値を`Availability Domain 1`に変更し、適切な**Fault Domain**に変更してください。
![20-11-09-22-50-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e63c0a2d-b9c8-101c-72d5-d06794c6787a.png)

Database Systemの場合は、さらの選択項目が多いです。上記**Availability Domain**や**Fault Domain**、**Shape**に加えて、Oracle Databaseのバージョン（**Version**）、エディション (**Database Edition**), ライセンスタイプ (**License Model**) 等を忘れずに確認ください。
![20-11-09-22-50-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/98aa6e76-b442-cd29-4770-19c13214011a.png)

プロパティの編集が終わりましたら、再度Validateパネルを表示し、エラーと警告が全て消えていることを確認します。

# OKITからOCI利用料金の見積りを取得
Validateパネル下のCost Estimateパネルを開くとキャンバス上に展開されているアーキテクチャをOCI上に展開した際の月額費用を算出し、確認することができます。(設定ミスなどで思わぬ出費を防ぐ意味でも次のステップに進む前に確認することを推奨します) 
![20-11-09-23-01-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/08e56a98-b986-43ba-22fe-ce5ca0319fa0.png)

また、**Download BoM**ボタンから利用するサービス名と数量、稼働時間、月額費用が記載された部品リストをダウンロードできます。
![20-11-09-23-02-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/3f077b38-4596-432e-320e-3a3a627b4acc.png)

構成や課金金額の管理、部門長への申請に便利な機能です。

# OKITとResource Managerの連携
それではいよいよOKITとOracle Cloud Infrastructure Resource Managerと連携してデザインしたシステム・アーキテクチャをOCI上に展開したいと思います。OKITメインメニューより**Resource Manager**を選択してください。**Export To Resource Manager**ダイアログの各設定項目を確認します。
![20-11-09-23-12-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/2243ee27-4953-8426-e124-b3c8e9f86d99.png)


**Connection Profile**にはconfigファイルの設定プロファイル、**Region**にはシステムを展開するリージョン、**Compartment**にはシステムを展開するコンパートメント名、**Create/Update**はResource Managerスタックを新規作成/既存スタックの更新どちらの操作を行うか、**Stack Name**にはResource Managerスタック名、**Plan/Apply**はResource Managerスタックを**Plan** (Terraformスクリプトの登録・検証を行ってシステムを構成可能な状態にする)するか**Apply** (Plan後、システムを実際に構築する)するか設定・選択を行います。今回はとりあえず**Plan**を選択して**Create Stack**をクリックします。
その後、OCIダッシュボードにログインし、OCIダッシュボードメニューから、**ソリューションおよびプラットフォーム**、**リソース・マネージャー**にアクセスし、OKITから作成したスタックが存在しているか確認してください。スタックの詳細を表示すると画面下部に現在実行中のジョブを確認することができます。
![20-11-09-23-27-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/c0520e7e-0591-a2d2-15f0-b4252f4a94bb.png)

ジョブの進捗を見守るためにジョブ名をクリックし、ジョブの詳細画面に行くと・・・


・・・


・・・

失敗
![20-11-09-23-28-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5dad16b0-ebde-a82f-15c1-6e4c0c0bdff3.png)

次項でResource Managerのログを確認し、Terraformスクリプトを修正します。

### (OKIT Version 0.13.0で確認) Terraformスクリプトの修正
Resource Manager内、ジョブの詳細画面よりジョブのエラーメッセージを確認すると`oci_database_db_system`リソース作成する際の`fault_domains`の値が不正だと怒られています。
![20-11-09-23-39-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9aeb96c3-c3f8-ef37-0d3d-e88a7b5e3b92.png)

[Terraformのドキュメント](https://registry.terraform.io/providers/hashicorp/oci/latest/docs/resources/database_db_system)を確認すると、`fault_domains = "['FAULT-DOMAIN-1']"`ではなく、`fault_domains           = ["FAULT-DOMAIN-1"]`が正しい記述の様です。

ジョブの詳細画面、画面上部中央の　**Terraform構成のダウンロード**ボタンをクリックして構成ファイルをダウンロードします。ダウンロードしたzipファイルを解答し、`main.tf`ファイルを修正します。実際の修正箇所は下記をご確認ください。

```json:main.tf
# ------ Create Database System
resource "oci_database_db_system" "Hawebdb" {
    #Required
    availability_domain = data.oci_identity_availability_domains.AvailabilityDomains.availability_domains["1" - 1]["name"]
    compartment_id      = var.compartment_ocid
    database_edition    = "STANDARD_EDITION"
    db_home {
        #Required
        database {
            #Required
            admin_password      = "DevOps_123#"
            #Optional
            db_name        = "aTFdb"
            db_workload    = "OLTP"
        }
        #Optional
        db_version = "18.0.0.0"
        display_name = "hawebdb"
    }
    hostname        = "hawebdb1"
    shape           = "VM.Standard2.1"
    ssh_public_keys = ["ssh-rsa 省略"]
    subnet_id       = local.Ha_Web_Db_Sn_id
    #Optional
    data_storage_size_in_gb = "256"
    db_system_options {
        #Optional
        storage_management  = "LVM"
    }
    display_name            = "hawebdb"
    fault_domains           = ["FAULT-DOMAIN-1"] 
    license_model           = "LICENSE_INCLUDED"
    node_count       = "1"
}
```
`main.tf`ファイルを修正後、Resource Managerスタックに再アップロードします。
スタックの詳細画面上部中央左よりの**スタックの編集**ボタンより、スタックの編集ウィザードを開始します。`main.tf`ファイルを修正したフォルダをそのままアップロードし**次**へ、変数はそのままで変更の保存を行ってください。
![20-11-09-23-54-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f947a1cc-4ae9-f38e-f3f9-2e2ef4ec8b9c.png)

スタックの詳細画面上部中央の**Terraformアクション**セレクタより、**計画**を実行します。今回は、下記のように問題なくPlanジョブが完了しました。
![20-11-09-23-58-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/488bbc23-071e-4ff9-fd6d-bf6e9973af1e.png)


### Resource ManagerスタックのApply
スタックの詳細画面上部中央の**Terraformアクション**セレクタより、**適用**を実行します。下記のようにApplyジョブが完了することを確認してください。
![20-11-10-00-07-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/6f089d10-5343-dda0-72fc-cded955826e9.png)

Resource ManagerスタックのApplyが終了するとNetworkリソース、Conputeインスタンス、DBCSインスタンスが作成されていることが確認できていると思います。Bastionインスタンス経由で各サーバにアクセスし、OSおよびアプリケーションの設定を行ってください。


# まとめ
[前回](https://qiita.com/orakurara/items/0dd75a1332ac1845e974)と今回の記事でOCI Designer Toolkit (OKIT) のインストールとOCIアカウントとの連携、Resource Managerと連携しデザインしたアーキテクチャを実際に構築できることを確認しました。Microsoft Visioの様なデザインツールをイメージして利用すると柔軟性に欠ける部分もありますが、複数のOCIリソースをシングルページで設定できることで作業効率の改善ができます。また、デザインしたアーキテクチャからTerraformやAnsibleのスクリプトを生成してくれるのでInfrastructure as Codeの入門としても心強いツールです。



# 関連情報
[oci-designer-toolkit](https://github.com/oracle/oci-designer-toolkit)
[OCI Designer Toolkit Documentation](https://github.com/oracle/oci-designer-toolkit/blob/master/documentation/README.md)
[[ORACLE A-Team Chronicles] Introduction to OKIT the OCI Designer Toolkit](https://www.ateam-oracle.com/introduction-to-okit-the-oci-designer-toolkit)
[[ORACLE A-Team Chronicles] The OCI Designer Toolkit Templates Feature](https://www.ateam-oracle.com/the-oci-designer-toolkit-templates-feature)
[[ORACLE A-Team Chronicles] OCI Designer Toolkit Resource Manager Integration](https://www.ateam-oracle.com/oci-designer-toolkit-resource-manager-integration)
[[SmartStyle社 技術ブログ] OCI Designer Toolkit(OKIT)を触ってみた](https://www.s-style.co.jp/blog/2020/05/6068/) 
[[Qiita] 【OKIT OCI Designer Toolkit】OCI 構成図作成ツールを使って、3分で環境構築をする](https://qiita.com/MUCHIUCHI_OJISAN/items/8ffe7567b50528efae3c)