Azure MarketplaceでTerraform環境を手軽にゲット

#はじめに
2018年3月にTerraform入りのUbuntuイメージがAzure Marketplaceで公開されたので、さっそく使ってみました。

[Announcing Terraform availability in the Azure Marketplace](https://techcommunity.microsoft.com/t5/Azure/Announcing-Terraform-availability-in-the-Azure-Marketplace/m-p/174793#M2373)

#Terraformって
Terraform on Azureの説明は以下のサイト参照。

[Terraform on Azure のドキュメント](https://docs.microsoft.com/ja-jp/azure/terraform/?WT.mc_id=AZ-MVP-5002499)

Azureのインフラ構築を行う手段として、ベーシックなものとしては

- Azureポータルから
- Azure Powershellから
- Azure CLIから
- Azureテンプレート(json)から

などがありますが、最近はHashiCorpが提供しているTerraformのAzure Provider(モジュール?)が色々できるみたいです。

[HashiCorp Terraform Azure Provider](https://www.terraform.io/docs/providers/azurerm/?WT.mc_id=AZ-MVP-5002499)

Terraformの詳しいお話はほかのサイトにお任せするとして、本記事ではAzure MarketplaceからTerraform入りのUbuntuイメージをデプロイして、とりあえずTerraformを使い始めるところにフォーカスを当ててお伝えします。

#Terraform入り仮想マシンのデプロイ

以下サイトに英語ですが手順や使い方は詳しく書かれていますが、こちらの記事ではサクっと要点だけお知らせします。

[Use an Azure Marketplace image to create a Terraform Linux Virtual Machine with Managed Service Identity](https://docs.microsoft.com/en-us/azure/terraform/terraform-vm-msi?WT.mc_id=AZ-MVP-5002499)

Azureポータルにログインして、「＋リソースの作成」から新規ブレードを開き、検索文字列に「terraform」を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/ebfd2ff2-9539-bbdc-529a-5b42a93a31b3.png)

検索結果の一覧から「Terraform」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/a56a828d-d43c-0b51-0b64-98928d789df4.png)

Marketplaceの概要説明がでるので、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/cd6c792e-0c52-bad8-cf49-b58fa39d29fb.png)

「1.基本」ブレードでは作成するVM名、ログインユーザ名、ログイン方法、リソースグループ名、作成リージョン等お好みで設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/8be2d958-f6b5-402a-9c1d-755e855e1518.png)

「2.Additional Settings」ではVMのサイズ、ディスク種別をお好みによって選択します。
デフォルトのStandard DS2で32GBのSSDの場合、ざっくり月額2万円くらいでしょうか。こちらの仮想マシンサイズを下げてもTerraformのデプロイ時間が遅くなる他は特に影響はないと思いますので、個々の事情に合わせたサイズを選択しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/a893a78f-96b1-c6b5-e1fa-33a89d10fe38.png)

「3.概要」では先に設定した内容が正しいか確認後に「OK」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/8fdc8e34-e201-f47b-b9c4-579ba643c971.png)

「4.購入」では念のため使用条件を確認後、「作成」をクリックします。
今回のTerraformではAzure仮想マシン関連の料金の他はかかりません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/591582df-1ae4-b91d-1099-66750126fcf5.png)

暫く待つと、指定したリソースグループ内に仮想マシンが作成完了します。
DNS名をクリップボードなどにコピーしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/a1db35cc-95fe-da85-b60c-1b3c644ece96.png)

TeraTermなどで先ほどの仮想マシンにsshでログインできることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/a2742699-c0f4-d9ae-8acc-a54647cbd335.png)

#Terraformの初期設定

仮想マシンにログイン後、以下のコマンドを実行します。

```
$ . ./tfEnv.sh
```

https://microsoft.com/devicelogin を開き、指定されたコードを入力後、先ほどと同じAzureポータルにサインインした時と同じアカウントでサインインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/5413633d-4ba2-ae89-2f5b-845965787ed8.png)

サイインイン完了後、特にエラーメッセージが出力されなければ初期設定は完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/ab87a402-303c-65b6-b37d-85ae0700e765.png)

#サンプルスクリプトの準備

[Terraform によって Azure に完全な Linux 仮想マシンのインフラストラクチャを作成する](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/terraform-create-complete-vm?WT.mc_id=AZ-MVP-5002499)の最後の方にある「[完全な Terraform スクリプト](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/terraform-create-complete-vm#complete-terraform-script?WT.mc_id=AZ-MVP-5002499)」をベースに若干修正してテスト実行してみましょう。

まずは適当な作業ディレクトリを作成して(今回はsample1)、その中にtfTemplateディレクトリ配下にあるremoteState.tfをコピーします。

```
$ mkdir sample1
$ cp tfTemplate/remoteState.tf sample1/.
$ cd sample1
```

続いてサンプルスクリプトを適当な名前でsample1ディレクトリ内に保存します(今回はazurevm.tf)。

サンプルスクリプト内の修正前に、ssh鍵の生成を行っておきます。
以下のコマンドを実行後、確認待ちの部分は全てEnterを押下します。

```
$ ssh-keygen
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/37850f01-16ae-5a46-78e8-a597d5b5cf54.png)

.ssh/id_rsa.pub の内容をクリップボード等にコピーしておきます。

サンプルスクリプトの6行目から11行目(providerの一節)を全てコメントアウトします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/a1b1b4cb-7fe7-7272-82a6-0d86f83bebee.png)

151行目のkey_data内容を先ほどコピーした.ssh/id_rsa.pubの内容と入れ替えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/9493c589-485b-28bd-35c6-57ffde04e9ff.png)

これで準備完了です。

#サンプルスクリプトの実行
作成したディレクトリに移動していることを確認後、「terraform init」でTerraform環境の初期化を行います。
必要なモジュールのアップデートが行われて実行環境が準備されます。

```
$ pwd
/home/azureuser/sample1
$ terraform init
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/46ec12b6-abee-8b3b-dfd5-f418241bc1b5.png)

続いて、「terraform plan」コマンドでスクリプト内の検証が行われます。
下記の出力例ではAzureリソースとして8つ新規作成されると表示されています。

```
$ terraform plan
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/4e903628-0b80-23e5-2d31-213b84d876f1.png)

最後に「terraform apply」で実際にAzure側に仮想マシンを作成します。
最終確認が行われるので「yes」と入力します。

```
$ terraform apply
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/30b8636d-a6b0-71d4-0bb5-c47e458c5f68.png)

暫く待つと完了メッセージと共に実行したコマンドも終了します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/7214851d-709f-ca1d-1dc3-cf791d4e1126.png)

ちゃんとAzure上にもリソースが出来上がっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/774b89fc-6113-6e3d-e8a9-01fbfb7895e4.png)

作成された仮想マシン「myVM」のパブリックIPアドレスをコピーして、Terraform環境の仮想マシンからsshで接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/5888b823-3317-fbcf-0959-6ed41ecb93c3.png)

```
$ ssh azureuser@(パブリックIPアドレス)
```

無事ログインできました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/7f84f095-6c09-193d-bad6-b7a27800493d.png)

#おわりに
今回は自身もTerraformを使い始めたばかりなので、先ずは第一歩の記事となりました。
インフラ野郎真壁パイセンのブログ「[RE-IMAGINE](http://torumakabe.github.io/)」にはもっと充実したTerraformをAzureで利用する際の記事が豊富に乗っているので、続きはそちらで！
私ももっとTerraformいじり倒したら追加記事を書きたいと思います。