[OCI]リソース・マネージャを使って、MYSQL Database Serviceを作成してみた (2020/11/15)


この記事では、OCIのマネージドTerraform環境であるリソース・マネージャを使って、MySQL Database Serviceを作成してみたことを紹介します。

# リソース・マネージャとは
Oracle Cloud Infrastructureリソースをプロビジョニングするプロセスを自動化できるOracle Cloud Infrastructureサービス
「infrastructure-as-code」モデルを使用してリソースをインストール、構成、および管理するのに役立つTerraformのマネージド環境

## リソース・マネージャの機能
リソース・マネージャは以下のような特徴、機能があります（2020/11/15時点）
- インフラストラクチャの自動化と標準化、環境のレプリケーションを容易に行う
- Terraform エンジンのフルマネージドサービス
- 指定したコンパートメントのリソースをTerraform構成ファイルの生成（Resource Discovery）
- GitLabで管理されたTerraform構成ファイルからリソース・マネージャスタックの作成（構成ソース・プロバイダ）
- スタックの最後に実行された構成と実際(現在)のインフラストラクチャの状態との差分抽出（ドリフト検出）
- サンプル構成を使った環境構築
- 使用できる Terraform フォーマットは v0.11/v0.12/v0.13

以下のサンプルは Terraform v0.12 フォーマットで記載しています。

# MYSQL Database Service 作成サンプル
## 使用している変数
- mysql_configuration_id：MYSQL Database ServiceのコンフィグレーションID![zu05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/9eff2800-1d5b-cb7a-f48f-679c3a3d8717.png)
- mysql_password	：管理者ユーザパスワード
- mysql_shape		：MYSQL Database Serviceで利用するシェイプ
- privateSubnet_id	：サブネットOCID

## 指定している名前
- admin_username	：管理者ユーザ名（admin）
- hostname_label/display_name：ホスト名（mysql1）

## そのほかはデフォルト設定を指定

```mysql.tf
resource oci_mysql_mysql_db_system export_MySQL1 {
  admin_password      = var.mysql_password
  admin_username      = "admin"
  availability_domain = data.oci_identity_availability_domain.TGjA-AD-1.name
  backup_policy {
    is_enabled        = "true"
    retention_in_days = "7"
    window_start_time = "00:00"
  }
  compartment_id          = var.compartment_ocid
  configuration_id        = var.mysql_configuration_id
  data_storage_size_in_gb = "50"
  display_name = "MySQL1"
  fault_domain = "FAULT-DOMAIN-1"
  hostname_label = "mysql1"
  maintenance {
    window_start_time = "WEDNESDAY 04:22"
  }
#  mysql_version = "8.0.22-u2-cloud"
  port          = "3306"
  port_x        = "33060"
  shape_name    = var.mysql_shape
  state     = "ACTIVE"
  subnet_id = var.privateSubnet_id

  lifecycle {
    ignore_changes = [admin_password, admin_username]
  }
}
data oci_identity_availability_domain export_TGjA-AD-1 {
  compartment_id = var.compartment_ocid
  ad_number      = "1"
}
```

# サンプル環境の作成
MySQL Database Serviceを構築する例として以下の構成を作成
![zu01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/f54467dc-441f-c4d5-8f32-dd19f7709d53.gif)
コンピュートインスタンスにnginxとphpをインストールし、wordpressモジュールを展開、MySQL Database ServiceにDatabaseとユーザを作成しています。
Terraform構成ファイルは[github](https://github.com/kenwatan/terraform_OCIRM_sample_wordpress)からダウンロード可能です。



# 環境構築の実行

1.Webコンソールのメニューから「リソース・マネージャ」＞「スタック」を開き「スタックの作成」をクリック
2.githubから入手したtfファイルを圧縮したZIPファイルもしくはフォルダを指定してリソース・マネージャスタックを作成![zu03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/f86ea1f6-9fa7-30dd-df20-d8e221de6e11.png)
3. 計画ジョブ・適用ジョブを実行

# サンプルファイルの補足
## 予約済パブリックIPの使用
コンピュートインスタンスとロード・バランサには、それぞれ予約済パブリックIPを割り当ててみた

### 予約済パブリックIPの生成

```publicip.tf
resource oci_core_public_ip publicip_lb {
  compartment_id = var.compartment_ocid
  display_name = "lb01"
  lifetime = "RESERVED"
}
```

### コンピュートインスタンスへの割り当て
パブリックIPを割り当てるVNIC、プライベートIPのOCIDを取得し、予約済パブリックIPを割り当てる

```publicip_compute.tf
data oci_identity_availability_domain AD-1 {
  compartment_id = var.compartment_ocid
  ad_number      = "1"
}
data oci_core_vnic_attachments instance1_vnics {
  availability_domain = data.oci_identity_availability_domain.AD-1.name
  compartment_id      = var.compartment_ocid
  instance_id         = oci_core_instance.ap1.id
}

data oci_core_vnic instance1_primary_vnic {
    vnic_id = data.oci_core_vnic_attachments.instance1_vnics.vnic_attachments[0].vnic_id
}

data oci_core_private_ips instance1_ip {
    vnic_id = data.oci_core_vnic.instance1_primary_vnic.id
}
resource oci_core_public_ip publicip_ap {
  compartment_id = var.compartment_ocid
  display_name = "ap01"
  lifetime      = "RESERVED"
  private_ip_id = data.oci_core_private_ips.instance1_ip.private_ips[0].id
}
```

### ロード・バランサへの割り当て
```publicip_lb.tf
resource oci_load_balancer_load_balancer LB1 {
  compartment_id = var.compartment_ocid
  display_name = "LB1"
  ip_mode    = "IPV4"
  is_private = "false"
  reserved_ips {
    id = oci_core_public_ip.publicip_lb.id
  }
  network_security_group_ids = [
    oci_core_network_security_group.export_Network-Security-Group-for-AP.id,
  ]
  shape = "100Mbps"
  subnet_ids = [
    oci_core_subnet.export_PublicSubnet.id,
  ]
}
```

## 適用ジョブログ
適用ジョブのログに、ロードバランサ、APサーバのパブリックIPアドレスとAPサーバへのsshログイン用秘密鍵ファイル内容が出力される
![zu04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/d7d14641-4682-676c-e540-9c9f070456a1.png)


## wordpressの初期設定
コンピュートインスタンスのパブリックIPアドレスに ブラウザで httpアクセスすることで wordpress 初期画面が表示されることを確認
http://<コンピュートインスタンスパブリックIPアドレス>/
![zu02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/d5a79762-c0c8-b24e-8fec-dab031258d13.png)


# おわりに
OCIの Terraform マネージドサービスのリソース・マネージャを使用して MySQL Database Serviceおよびそれにアクセスするコンピュートインスタンスにwordpress環境をデプロイしてみた。