OCI リソース・マネージャ で 3層Webアプリケーション を爆速で構築する

# はじめに

前回の記事で、TerraformによるOCI構築を紹介しました。
[【LiveLabs】Terraform を 使用して OracleCloud で Compute を構築してみた](https://qiita.com/yama6/items/7898fe304efc1bf50fff "【LiveLabs】Terraform を 使用して OracleCloud で Compute を構築してみた")
前回の構築方法は、CloudShellからサンプルソースをダウンロードし、それを展開するというものでしたが、今回はOCIのIaCフルマネージドサービスである**リソース・マネージャ**から3層Webアプリケーションをデプロイしてみたいと思います。

# リソース・マネージャとは
[Oracle Cloud InfrastructureResourceManager](https://www.oracle.com/jp/devops/resource-manager/ "リソースマネージャ")
Oracle Cloud InfrastructureResourceManagerは、Terraformを使用してOracleCloudInfrastructureにインフラストラクチャリソースをプロビジョニングできるフルマネージドサービスです。
Terraformテンプレート定義を取り込み、インフラストラクチャリソースを簡単に作成および管理できます。
これにより、Infrastructure-as-Codeを使用して、コンピューティング、ネットワーキング、ロードバランサー、ブロック、オブジェクトストレージを含むすべてのOCIリソースにわたるプロビジョニングを自動化できます。 **Resource Managerは、Identity and Access Management（IAM）とも統合されているため、Terraform操作の詳細なアクセス許可を定義できます。現在、CLI、SDK、およびコンソールをサポートしています。**

# 構築するもの
今回もLiveLabsの中から、リソース・マネージャのハンズオンを選び、進めていきます。
ただ、LiveLabsのシナリオの中で選択していたアーキテクチャがAlways Free対象のもので、私のアカウントでは選択できなかったため、「MuShop Basicクイックスタート」というテンプレートを選択しました。ここがLiveLabsとの差異になりますが、手順には影響がございません。

構築するシステム構成イメージは下記の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/fdec75d4-28fc-a4bb-71cd-e8a83c7cf6c8.png)

# 構築手順
1. リソース・マネージャ スタックを作成する
2. アプリケーションをデプロイする
3. お片付け

# 1. リソース・マネージャ スタックを作成する

左上のナビゲーションメニューをクリックし、開発者サービスに移動して、[スタック]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/7ab44907-93af-f9f7-36ef-90c21de1bd98.png)
[スタックの作成]ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/18d830fd-b0c4-1260-c7b3-e6930199dfbc.png)

テンプレートを選択し、テンプレートの選択をクリックします。 [クイックスタート]タブに移動し、[MuShop Basicクイックスタート]を選択します。 [テンプレートの選択]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e1cc5877-598e-ac66-74fd-6157ebf0ebfb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/489711f1-5ddc-a95c-cadb-7764a49dab4d.png)
[次]ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/cbbca6bc-3bfa-1f40-886f-18fad8334781.png)
[次]ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/fd469b4b-7fea-8682-66b2-bb2eb4e719c7.png)
[作成]ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ecbee38b-59b1-788b-92f3-f4a1dc881956.png)
どのようなリソースがスタックに登録されたか確認してみましょう。
[Terraform構成:ダウンロード]ラベルを押下すると、zipファイルがダウンロードされ、登録されたリソースが参照できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/69e829a5-9b69-2ae2-4b7d-13376cba7c8f.png)
このうち、tfvars.example拡張子のファイルで各リソースの環境情報を定義し、tfファイルで各リソースのプロパティ値を設定していることがわかります。

# 2. アプリケーションをデプロイする

コンソール画面から、リソース・マネージャで設定したTerraform構成をベースに、アプリケーションをデプロイしましょう。リソース・マネージャでは、デプロイ操作をジョブと呼んでいます。
>ジョブは、スタックに関連付けられたTerraform構成ファイルに対してアクションを実行します。 3つのアクションを実行でき、それらは計画、適用、および破棄です。 Terraformコマンドの実行はアトミックではないため、並列実行による競合状態や状態の破損を防ぐことが重要です。これが発生しないようにするために、Resource Managerは、単一の状態ファイルに対して、特定の時間に1つのジョブのみがスタックに対して実行できるようにします。
[スタックの詳細]ページから、スタックの構成（つまり、更新、削除、タグの追加、変数の編集）を完全に管理し、最新のTerraform構成を含むzipアーカイブをダウンロードすることもできます。これはトラブルシューティングの際に特に役立ちます。

[計画]をクリックして計画を実行し、次の情報を入力します。

名前：MuShopAppPlan
[計画]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c86d21ff-8e2b-25bd-2446-0b9d44939c15.png)

すると、ジョブが受け入れ済み➤進行中となります。

しばらくして、スタックがアクティブに変わったら成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/f26f9e90-10c5-dd0c-6729-9ea03c9f84ba.png)

では、[適用]ボタンを押下してみましょう。
名前は「MuShopAppApply」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/84925da0-12cb-1f92-0c2e-1c8474abeadf.png)
適用アクションが成功したら、ログに含まれるTerraform出力を読み取ってリソースがプロビジョニングされていることを確認するか、コンソール画面から、様々なリソース（VCN、ロードバランサー、サブネット、データベースなど）を確認することができます。
2インスタンスはComputeに一覧表示されます。
※ロードバランサーのヘルスステータスがOKステータスになるまでに数分かかります。

**VCN**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4f024b3e-bd6c-4848-9991-749135e4696d.png)

**Load Balancer**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/788020c8-248c-20ea-bc20-4bd3a8dcc639.png)

**Compute**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/61246426-c718-5ef0-301a-e919873a4b31.png)
ComputeはWebサーバ兼アプリケーションサーバとして機能しており、上記のロードバランサーにバックエンドとして２インスタンスが設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c42fbf82-0de1-f418-1a62-e904e12e1d2b.png)


**Autonomous Database**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b9cb2cda-7c45-ed7b-9cd8-f4fc482f8607.png)

これらのリソースが全て作成され、スタックの適用ジョブも成功したことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/edf207ec-8614-8426-72e8-fe93f50cec63.png)

ロードバランサのステータスが[OK]に変わったら、IPアドレスをコピーして新しいWebブラウザタブに貼り付けます。サンプルのWebページが読み込まれ、ページの上部に接続しているWebサーバーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/56fa6e95-a9d5-39cb-0d67-b476d01f59bb.png)

# 3. お片付け

Terraformを正常に適用してクラウドリソースを構築した（そしてオプションでGitlabへのソース移行を完了した）ので、[スタックの詳細]ページに戻り、リソースマネージャーを使用してすべてを破棄しましょう。

[破棄]をクリックして、次の情報を入力することから始めます。

名前：MuShopAppDestroy
[破棄]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/a00e60fa-e468-1efa-fbf2-f34971c1d56e.png)

最後のステップは、[スタックの詳細]ページの[その他のアクション]ボタンをクリックしてスタックを削除することです。 [スタックの削除]をクリックし、モーダルウィンドウで[削除]をクリックして確認します。
ステータスが「成功」と表示されるまで待ってから続行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/32a294c5-3c0d-17cc-b5f1-5159f1ee4085.png)

# さいごに
今回はリソース・マネージャのテンプレートからアーキテクチャを構築いたしましたが、GitLabと連携し、ローカルで編集したリソースから任意のアーキテクチャを構築することも可能です。
今回のように、サーバ上のアプリケーションを一緒にデプロイすることも可能です。

また、個別のサービスに対するOCI用のTerraformリファレンスは下記に用意されています。
**Oracle Cloud Infrastructure Provider**
https://registry.terraform.io/providers/oracle/oci/latest/docs
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/26b4e7a3-1b42-1f94-510a-7da9b2bd99d8.png)
IaCによる構築、開発は運用コストを下げるだけではなく、開発の迅速性を向上させ、手作業による構築ミスを低減する効果もあります。
今回のような基本構成についてはスクリプトが公開されているので、汎用的なソースは踏襲し、ワークロードに合わせてプロパティ値をカスタマイズしていく開発方法でスモールスタートしていく方針がよいと考えています。