TerraformでAzure構築・運用自動化の入門

　terraformを使えばクラウド上のリソースを定義ファイルの状態になるように構築してくれます。
今回はterraformを使いAzureの環境の構築・運用自動化に入門してみます。

本記事では、以下を掲載します。
1,CentOS7にterraform実行環境インストール
2,TerraformからAzureにアクセスするための値を取得
3,実際にAzureのリソースグループをterraformで作成

## 前提
Azureアカウント作成済みであること。

# 1,CentOS7にterraform実行環境インストール
※rootユーザでの作業とします。

```
# terraformダウンロード
wget https://releases.hashicorp.com/terraform/0.11.13/terraform_0.11.13_linux_amd64.zip

# terraform配置
unzip ./terraform_0.11.13_linux_amd64.zip -d /usr/local/bin/

# 確認
terraform -v

# terraform用ディレクトリ作成
mkdir terraform
cd terraform
```
# 2,TerraformからAzureにアクセスするための値を取得
Azureコンソール上部の以下のマークをクリックし、Azure Cloud Shellに接続。
<img width="269" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/720b3c55-7abb-0c08-adde-d5b8e35aa381.png">

[bash]か[PowerShell]か選ぶ画面が表示されたら[bash]を選ぶ。すると以下の画面が表示される。

<img width="413" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/81c842d3-4626-70df-1244-6e1b06201a9b.png">

ここで以下コマンドで値を取得する。

```
# サブスクリプションID、テナントIDを表示
araki@Azure:~$ az account show --query "{subscriptionId:id, tenantId:tenantId}"
{
  "subscriptionId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "tenantId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}


# アカウントにSUBSCRIPTIONが複数ある場合以下でID設定をする。
　一つしかない場合はやる必要がない。むしろやるとエラーになる。
araki@Azure:~$ SUBSCRIPTION_ID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
araki@Azure:~$ az account set --subscription="SUBSCRIPTION_ID"

# Terraformで使用するサービス プリンシパルを作成
araki@Azure:~$ az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}"
Creating a role assignment under the scope of "/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  Retrying role assignment creation: 1/36
{
  "appId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "displayName": "azure-cli-YYYY-MM-DD-hh-mm-ss",
  "name": "http://azure-cli-YYYY-MM-DD-hh-mm-ss",
  "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "tenant": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
```

# 3,実際にAzureのリソースグループをterraformで作成
### 変数設定
CentOS7に戻り先程取得した値を変数に設定する。

```
export ARM_SUBSCRIPTION_ID=サブスクリプションID
export ARM_CLIENT_ID=アップId
export ARM_CLIENT_SECRET=パスワード
export ARM_TENANT_ID=テナントID
```

### tfファイル作成
```
vi test.tf
※以下記載。

provider "azurerm" {
}
resource "azurerm_resource_group" "rg" {
        name = "testResourceGroup"
        location = "westus"
}
```
上記はtestResourceGroupという名前のリソースグループをwestusに作成する定義をしています。

### Terraformのデプロイを初期化
```
terraform init
※Terraform has been successfully initialized! と表示されたら成功。
```

### ドライラン
```
terraform plan
※最下部に以下のように表示される。

Terraform will perform the following actions:

  + azurerm_resource_group.rg
      id:       <computed>
      location: "westus"
      name:     "testResourceGroup"
      tags.%:   <computed>


Plan: 1 to add, 0 to change, 0 to destroy.
```
「+」マークがリソース定義により作成される項目です。最終行は追加、変更、削除の項目が何個あるかを表しています。

### リソース定義を適用
```
terraform apply

※途中、本当に適用するか確認されるのでyesと入力する。
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

※最後に以下表示される。
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
```

実際にコンソール上で確認するとリソースグループが作成されています。
<img width="268" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/248eab03-4b32-52fe-2e8c-91fc1249612e.png">


以上、簡単にTerafformでAzureリソースを作成してみましたが、リソース定義についてこちらも参考になります。
[・TerraformによってAzureに完全な Linux 仮想マシンのインフラストラクチャを作成する](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/terraform-create-complete-vm)

## 参考
[・VM などのインフラストラクチャを Azure にプロビジョニングするための Terraform のインストールと構成](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/terraform-install-configure)