【LiveLabs】Terraform を 使用して OracleCloud で Compute を構築してみた

# はじめに

パブリッククラウドでアーキテクチャを構築する際、Webコンソール画面からGUIベースでポチポチ構築できることは気軽に環境を立ち上げるという点で魅力の一つです。
ただし、複数のワークロードで同じ構成を使いまわしたいときや、PoCで一度環境を構築し、本番環境にリリースするまでに不要な課金を避けたい場合には、IaC(Infrastructure As Code)による、コードベースでの構築が有効な手段となります。
OracleCloudでは、IaCのOSSであるTerraformに対応しており、IaCでアーキテクチャを構築することが可能です。今回は、LiveLabsにある""でTerraformを用いてComputeを立ち上げてみたいと思います。

**Deploying Infrastructure using Terraform Workshop**

https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=663&clear=RR,180&session=111618999171367

# Livelabsってなに？

Oracle LiveLabsとは、DatabaseやCloud等、OracleのサービスをWebブラウザから気軽に試せるワークショップサービスです。ワークショップの中には、ハンズオン用のサンドボックス環境を無料で使用できるものもあり、例えば、初期費用が発生するOracleDatabaseのライセンス等が必要なく、一定の制限時間内で使用感を確かめることができます。手を動かして技術を学習するエンジニアにとっては、大変有用なサービスです。

**Oracle LiveLabs**
https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/home?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/a0ed9735-8b68-67f6-1f5a-4121c4408ba1.png)

強いてデメリットを上げるとするのであれば、全ての手順が日本語対応していないことでしょうか。
ブラウザから翻訳機能を有効にすることで、一部の言語は翻訳されますが、肝心な手順の部分が翻訳対象とならないので、英語が読めない方は少し取っ掛かりづらいかもしれません。
今回対象とするハンズオンは、手順を和訳して記載いたします。

# 構築するもの

今回構築するアーキテクチャは下記の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/baa3792e-d681-19fc-1bb3-336a166d2c3f.png)


ハンズオン手順に構成イメージがなかったので、構築後、構成イメージに起こしました。
VCNの中にComputeを立てるだけの簡潔な構成となっています。

# イントロダクション：Terraformってなに？

Terraformとは、HashiCorpによってGo言語で開発されたオープンソースであり、インフラの構成をコードで宣言します。構造化された構成ファイルでは、手動で操作することなくインフラ構成を自動で管理できます。インフラの初期プロビジョニング、更新、破棄、いずれもTerraformではコードにより宣言し、実行します。
AWS、Azure、GCPといったパブリッククラウドサービスにも対応しているため、マルチクラウド化したワークロードのインフラ管理にも最適です。また、画面で設定したプロパティ値を設計書に落とし、改修の際にそのドキュメントを更新していくといったアプローチも必要なく、構成ファイルを読めれば一目で構成内容が把握できることも魅力の一つです。

>Terraformは、インフラストラクチャを効率的かつエレガントに構築および管理するためのコードツールとしてのインフラストラクチャです。 Terraformファイルは、OracleCloudインスタンスの設定を支援するために使用できます。 Terraform構成ファイルを使用すると、コンピューティングインスタンスのプロパティを定義できます。ファイルは、変更や再利用のために他の人と共有することもできます。 Terraformを使用することで、複数の同様のインスタンスを作成するプロセスを合理化できます。

# 構築手順
1. Oracle Cloud Shellを使用したSSHキーの作成
2. TerraformによるVCNとComputeのデプロイ
3. お片付け 

# 1. Oracle Cloud Shellを使用したSSHキーの作成

>SSH（Secure Shell）プロトコルは、あるコンピューターから別のコンピューターへの安全なリモートログインのための方法です。 SSHは、暗号化を使用してエンドポイント間の接続を保護することにより、安全でないネットワーク上での安全なシステム管理とファイル転送を可能にします。 SSHキーは、クラウド内のOracleCloudInfrastructureコンピューティングインスタンスに安全にアクセスするための重要な部分です。
Oracle Cloud Shellを使用して、作成するOCIコンピューティングインスタンスとのインターフェースをとることをお勧めします。 Oracle Cloud Shellはブラウザベースであり、ラップトップにソフトウェアをインストールまたは構成する必要がなく、ネットワーク設定とは独立して機能します。

ということですので、まずはCloud Shellを立ち上げます。
画面右上の、リージョン名が記載してある右のアイコンを押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/cf3fd91b-de6f-7689-bdcd-9b0a09d9255e.png)
立ち上がると、画面下半分にCloud Shellが立ちあがります。
SSHキーは、ここから生成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/3dd7d859-5435-9124-edf7-d7f7a18478c6.png)
次のコマンドを入力します。覚えやすいキー名を選択してください。これは、作成するコンピューティングインスタンスへの接続に使用するキー名になります。パスフレーズがない場合は、Enterキーを2回押します。
```
cd .ssh
ssh-keygen -b 2048 -t rsa -f cloudshellkey
```

キー名にはcloudshellkeyという名前を使用することをお勧めしますが、選択した名前を自由に使用してください。
作成した2つのファイルを調べます。
```
ls
```
cloudshellkey、cloudshellkey.pubという2つのファイルが確認できます。

:::note warn
出力には、秘密鍵：cloudshellkeyと公開鍵：cloudshellkey.pubの2つのファイルがあります。秘密鍵を安全に保ち、その内容を誰とも共有しないでください。公開鍵はさまざまなアクティビティに必要であり、特定のシステムにアップロードしたり、コピーして貼り付けたりして、クラウドでの安全な通信を容易にすることができます。
:::

公開鍵の内容を一覧表示するには、catコマンドを使用します。

```
cat cloudshellkey.pub
```

公開鍵の内容をコピーして、後で使用できるようにどこかに保存します。今後のラボでキーをコンピューティングインスタンスに貼り付けるときは、コピー時に追加された可能性のあるハードリターンをすべて削除してください。 .pubキーは1行である必要があります。

# 2. TerraformによるVCNとComputeのデプロイ

次に、Terraformサンプルコードをダウンロードします。クラウドシェルに次のコマンドを入力します。

```
curl https://objectstorage.us-ashburn-1.oraclecloud.com/p/W7d4rKt71E8pOkTyB1ca5lbuerxDcyL0ZjuIMIRQ15-i-JW7KJOC6TMKSnD-_bZO/n/ociobenablement/b/lab/o/terraform_demo.zip -o terraform-demo.zip
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5454e149-6d95-6a9a-edf7-e48f27979ecb.png)
この操作により、サンプルのterraformzipファイルがダウンロードされます。
ファイルを解凍します。

```
unzip terraform-demo.zip
```
以下のファイルが展開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4ed43b01-5be0-8792-47c8-fa867883dd58.png)

試しに、下記コマンドを打ってcompute.tfを見てみましょう。
```
cd terraform_demo
cat compute.tf
```
今回は詳細なプロパティ値までご説明しませんが、Shapeやブートボリュームのサイズなど、Computeの構成情報が定義されていることが確認できます。

```resource "oci_core_instance" "compute_instance" {
  availability_domain = var.availablity_domain_name == "" ? data.oci_identity_availability_domains.ADs.availability_domains[0]["name"] : var.availablity_domain_name
  compartment_id      = var.compartment_ocid
  display_name        = "test-instance"
  shape               = var.instance_shape
  fault_domain        = "FAULT-DOMAIN-1"

  shape_config {
    ocpus         = var.instance_ocpus
    memory_in_gbs = var.instance_shape_config_memory_in_gbs
  }

  metadata = {
    ssh_authorized_keys = var.ssh_public_key == "" ? tls_private_key.public_private_key_pair.public_key_openssh : var.ssh_public_key
  }

  create_vnic_details {
    subnet_id                 = oci_core_subnet.subnet.id
    display_name              = "primaryvnic"
    assign_public_ip          = true
    assign_private_dns_record = true
  }

  source_details {
    source_type             = "image"
    source_id               = lookup(data.oci_core_images.InstanceImageOCID.images[0], "id")
    boot_volume_size_in_gbs = "50"
  }

  timeouts {
    create = "60m"
  }
}
```
次に、terraform.tfvarsファイルを編集します。
ここには、他ファイルに参照させる"variable" という変数を定義しています。
**次の変数を更新します：-tenancyocid, region, conpartmentocid**
**sskpublickeyは空白のままにします。**

viコマンドでファイルを編集します。
```
vi terraform.tfvars
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/f9aaf11e-5e07-5b3f-b6f5-7ad7bd4c1919.png)

viコマンドで i と打って、ファイルを編集します。
-tenancyocid, region, conpartmentocidに個人のアカウント情報を入力します。
ファイルを保存して終了するには、Ctrl＋Cを押下後、" **：wq！** "と入力します。

次に、次のコマンドを使用してテラフォームを初期化します。

```
terraform init
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b26b5d2f-b54b-484e-49cd-68c2e2e96229.png)
上記のように表示されたら成功です。
うまくいかない場合は、-tenancyocid, region, conpartmentocidの編集を見直してみてください。

展開計画を表示するには、次のコマンドを入力します。
```
terraform plan
```
これにより、OCIで構成される内容の詳細が提供されます。
最後に、計画を適用してインフラストラクチャを作成します。次のコマンドを入力します。
```
terraform apply
```
途中、下記の質問をされるかもしれません。
```
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: 
```
" **yes** "と入力し、実行しましょう。
このスクリプトの実行には時間がかかります。 OCIコンソールに切り替えて、VCN、Computeインスタンスの作成を監視できます。実際に見てみましょう。

**VCN**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/bc491ad6-98fa-49fb-6dbf-4ee01f449484.png)

**Compute**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/f212fefd-bebc-5f09-1d2a-23a2ad69e08d.png)

これらのリソースが確認できたところで、CloudShellに戻りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/67115289-f95e-a55c-0fda-ba878871c823.png)
"**Apply complete!**""と表示されていれば、成功です！

# 3. お片付け 

コマンド一発でこれらのリソースを一括削除できる点もTerraformの魅力です。
Computeを立ち上げた状態にしておくと、余計なコストが生じるため、検証が終わった後に消しちゃいましょう。
作成したインフラストラクチャを破棄します。次のコマンドを入力します。

```
terraform destroy
```
コンソールから先ほど確認できたリソースはどうなっているでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c3c43f8b-bf15-87f4-5223-14c441bbac8e.png)
終了が開始されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/344eb111-1eae-48ba-873e-8814ed440ff5.png)
終了しました！
VCNもリストから消えていることを確認できました。

お疲れ様でした！これにてハンズオンは終了です。

# おわりに

いかがだったでしょうか。今回は、Cloud ShellからTerraformを実行し、リソースを構築してみましたが、
OCIにはResource Managerというフルマネージドサービスも用意されており、こちらでもTerraformを活用することで、より簡単にリソースを作成、管理、運用することができます。
次回は、こちらのサービスについてハンズオンを行いたいと思います。