【OCI】oracle cloud -Terraformで環境構築-

# Terraformとは
インフラ構築や設定をコード(テンプレートファイル)を使って自動化するためのツールで、
Infrastructure as Codeによるコードベースで安全で効率的にインフラを管理できる。

複数クラウドに対応しており、OCIだけでなく他のクラウドでもTerraformを利用することができる。

## 前準備

Terraformの実行環境を用意しておく必要がある。
今回は前回の記事で作成したdockerコンテナを利用する。
https://qiita.com/manaki079/items/34053de1224ae3b7fb2b

以下の内容を用意しておく

|やること|内容|
| :--- | :--- |
| APIキーの登録 | OCIのコンソールからユーザ詳細ページで公開鍵をterraformを利用するユーザに登録する |
| 登録したAPIキーのフィンガープリントをメモする | OCIのコンソールからユーザ詳細ページでフィンガープリントを確認する |
| ユーザのOCIDをメモする | OCIのコンソールからユーザ詳細ページでOCIDを確認する |
| テナンシのOCIDをメモする | OCIのコンソールからテナンシ詳細ページでOCIDを確認する |
| コンパートメントのOCIDをメモする | OCIのコンソールからコンパートメント詳細ページでOCIDを確認する |
| タグのネームスペース.キーを作成する | OCIのコンソールからガバナンス→タグ・ネームスペースで作成する |

自分が利用しているTerraformのコードを簡略化したものをgithubに上げています。
https://github.com/manaki-naoe/oci-terraform
この記事ではこのコード使用していますので、
クローンして見ながら記事を見る事をお勧めします。

## 構成図
このような構成を作成するためのterraformになっています。
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/875d8003-e750-818c-fb64-aba1ac143cf9.png)

## ファイルの紹介

|ファイル名|内容|
| :--- | :--- |
| provider.tf | プロバイダ情報の指定 |
| provider-var.tf | provider.tfで使用している変数の宣言 |
| common.tf | 共通して利用する変数の宣言 |
| network.tf | ネットワーク関連リソースの作成 |
| network-var.tf | network.tfで使用している変数の宣言 |
| network.auto.tfvars | network-var.tfで宣言した変数へ値を代入する |
| adminservers.tf | admin用インスタンスの作成 |
| adminserversvar.tf | adminservers.tfで使用している変数の宣言 |
| adminservers.auto.tfvars | adminserversvar.tfで宣言した変数へ値を代入する |
| webservers.tf | web用インスタンスの作成 |
| webserversvar.tf | webservers.tfで使用している変数の宣言 |
| webservers.auto.tfvars | webserversvar.tfで宣言した変数へ値を代入する |
| dbservers.tf | db用インスタンスの作成 |
| dbserversvar.tf | dbservers.tfで使用している変数の宣言 |
| dbservers.auto.tfvars | dbserversvar.tfで宣言した変数へ値を代入する |

変数は宣言した上で、値を代入する必要があり、
変数の宣言しているファイルではデフォルト値を代入しています。
デフォルト値以外にしたい場合は～.auto.tfvarsで値を代入して使用します。

dbサーバがいらない場合などは
dbservers.tf
dbserversvar.tf
dbservers.auto.tfvars
の3つを消すなどカスタマイズしてください。

## Step.1

### 変数の編集

| file                     | variable                      | value                                    |
| :----------------------- | :---------------------------- | :--------------------------------------- |
| common.tf                | compartment_ocid              | コンパートメントのOCIDを入力してください。  |
|                          | defined_tag                   | タグのネームスペース.キーを入力してください。|
|                          | defined_tag_value             | ご自由にタグの値を入力してください。        |
|                          | instance_ssh_public_key       | インスタンスに設置する公開鍵の値を入力してください。 |
| provaider-var.tf         | tenancy_ocid                  | テナンシのOCIDを入力してください。          |
|                          | user_ocid                     | ユーザのOCIDを入力してください。            |
|                          | fingerprint                   | 登録したAPIキーのフィンガープリントを入力してください。|
|                          | private_key_path              | APIキーのプライベートキーがあるパスを入力してください。 |
|                          | region                        | 東京リージョン以外を利用する場合はリージョンを入力してください。 |
| network.auto.tfvars      | vcn_cidr_block                | VCNのCIDRを入力してください。  |
|                          | vcn_display_name              | OCIのコンソールで表示されるVCN名を入力してください。 |
|                          | vcn_dns_label                 | VCNのDNS label名を入力してください。       |
|                          | internet_gateway_display_name | OCIのコンソールで表示されるインターネットゲートウェイ名を入力してください。 |
|                          | nat_gateway_display_name      | OCIのコンソールで表示されるNATゲートウェイ名を入力してください。 |
|                          | availability_domain           | アベイラビリティドメイン(OCIのコンソールからインスタンスを作成する際にAD名が表示されています)を入力してください。 |
|                          | elb_subnet_cidr_block         | lbサブネットのCIDRを入力してください。  |
|                          | admin_subnet_cidr_block       | adminサブネットのCIDRを入力してください。  |
|                          | web_subnet_cidr_block         | webサブネットのCIDRを入力してください。  |
|                          | db_subnet_cidr_block          | dbサブネットのCIDRを入力してください。  |
| adminservers.auto.tfvars | NumInstances_admin            | 作成するインスタンスの台数を入力してください。 |
|                          | instance_shape_admin          | 作成するインスタンスのシェイプを入力してください。 |
|                          | instance_host_name_admin      | 作成するインスタンスのホスト名を入力してください。  |
|                          | instance_display_name_admin   | OCIのコンソールで表示されるインスタンス名を入力してください。 |
|                          | instance_volume_size_admin    | ルートボリュームサイズを入力してください。  |
|                          | private_ip_admin              | 内部IPアドレスを入力してください。       |
| webservers.auto.tfvars   | NumInstances_web              | 作成するインスタンスの台数を入力してください。 |
|                          | instance_shape_web            | 作成するインスタンスのシェイプを入力してください。 |
|                          | instance_host_name_web        | 作成するインスタンスのホスト名を入力してください。  |
|                          | instance_display_name_web     | OCIのコンソールで表示されるインスタンス名を入力してください。 |
|                          | instance_volume_size_web      | ルートボリュームサイズを入力してください。  |
|                          | private_ip_web                | 内部IPアドレスを入力してください。       |
| dbservers.auto.tfvars    | NumInstances_db               | 作成するインスタンスの台数を入力してください。 |
|                          | instance_shape_db             | 作成するインスタンスのシェイプを入力してください。 |
|                          | instance_host_name_db         | 作成するインスタンスのホスト名を入力してください。  |
|                          | instance_display_name_db      | OCIのコンソールで表示されるインスタンス名を入力してください。 |
|                          | instance_volume_size_db       | ルートボリュームサイズを入力してください。  |
|                          | private_ip_db                 | 内部IPアドレスを入力してください。       |

## Step.2

### Terraformコンテナの起動

dockerにてterraformコンテナを立ち上げます。

<font color="DeepPink">※terraformコンテナに関してはURLを参考にしてください※</font>

```bash
$ docker-compose up -d
$ docker exec -it terraform_container /bin/sh
$ cd oci-terraform/environment/production
```

### terraform initの実行

configファイルのパースが行われ、
ociのpluginがダウンロード・インストールされます。
不備がある場合はエラーとなります。


`terraform init`

```bash
$ terraform init

Initializing the backend...

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking  
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings    
suggested below.

* provider.oci: version = "~> 3.36"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see  
any changes that are required for your infrastructure. All Terraform commands  
should now work.

If you ever set or change modules or backend configuration for Terraform,      
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

### terraform planの実行

変更予定の情報を出力します。

`terraform plan -out=<plan名>`

```bash
$ terraform plan -out=test
# 長いので省略
This plan was saved to: test

To perform exactly these actions, run the following command to apply:
    terraform apply "test"
```

### terraform applyの実行

出力したplanの内容でリソースの作成を行います。

`terraform apply "<plan名>"`

```bash
$ terraform apply "test"
# 長いので省略
Apply complete! Resources: 11 added, 0 changed, 0 destroyed.
```

問題がなければOCIのコンソールで確認すれば作成されているはずです。

## 備考

### OCI用のterraformマニュアル
https://www.terraform.io/docs/providers/oci/index.html

### githubで公開しているコード
実際に使用したterraformを少し簡略したものです。
不具合がある場合はご報告頂ければ修正していきたいと思います。
https://github.com/manaki-naoe/oci-terraform

## 追記
作成したコードを記事上で紹介していないので、
時間がある時にこの記事を修正していきたいと思います。