Terraformを使い、Azureのインフラ構築してみた

仕事でTerraformを使用する機会をもらえたので作業ログ
Azureのqiita少なくないですか…？

## 環境
ホストPC: Mac
Terraform v0.11.7
Azure CLI 0.10.18

## Terraformをインストール
`tfenv`を使ってインストールします
Macユーザーの方は`Homebrew`を使ってインストールできます

```
$ brew install tfenv
```

### 　tfenv install/uninstall
指定したversionをインストール/アンインストールすることが出来ます。
今回は`latest`で最新版をインストールします

```
$ tfenv install 0.8.0
$ tfenv install latest # 最新のversion
$ tfenv uninstall 0.8.0
```

### tfenv use
terraformの利用するversionを切り替えることが出来ます

```
$ tfenv use 0.8.0
```



## Azure CLI 2.0をインストールする
まず、Azureリソースを管理するために必要なコマンドラインツールであるAzure CLIをインストールします。
これはTerraform から Azure にアクセスするための設定になります
Macを使っている方は、Homebrewを使用するのが最も簡単です。

```
$ brew update && brew install azure-cli
```

CLIインストール後は、`az`コマンドでAzure CLIを実行することが出来ます

## Azure CLIを設定する
まずは次のコマンドを実行しAzure CLIにログインします

```
$ az login
```

そうするとWebブラウザを開くようにと指示されます

```
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code XXXXXXXX to authenticate.
```

`https://aka.ms/devicelogin`にログインし、指示通りにcodeをうちこみます
ログイン後は次のコマンドを実行することでアカウントに紐付いている サブスクリプションの一覧を表示することが出来ます

```
$ az account list
```

実行結果

```
[
  {
    "cloudName": "AzureCloud",
    "id": "00000000-0000-0000-0000-000000000000",
    "isDefault": true,
    "name": "PAYG Subscription",
    "state": "Enabled",
    "tenantId": "00000000-0000-0000-0000-000000000000",
    "user": {
      "name": "user@example.com",
      "type": "user"
    }
  }
]
```

サブスクリプション一覧の中から自分が利用したいものを選択し、次のコマンドでサブスクリプションをを設定します。

```
$ az account set --subscription="SUBSCRIPTION_ID"
```

アカウントを照会してサブスクリプション ID とテナント ID の値を取得します。

```
$ az account show --query "{subscriptionId:id, tenantId:tenantId}"
```

```
実行結果
{
  "subscriptionId": "***********************",
  "tenantId": "********************"
}
```


そして、terraform用に別個の資格情報を作成します

```
$ az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}"
```

```
実行結果
{
  "appId": "****************************:",
  "displayName": "***********************",
  "name": "************************",
  "password": "**********************************",
  "tenant": "************************************"
}
```

資格情報のテストは下記コマンドを実行します

```
$ az login --service-principal -u SP_NAME -p PASSWORD --tenant TENANT
$ az vm list-sizes --location westus
```

## Terraformの環境変数を構成する
Azureリソースを作成する時に以下の設定を使用するようにTerraformを構成します
- ARM_SUBSCRIPTION_ID
- ARM_CLIENT_ID
- ARM_CLIENT_SECRET
- ARM_TENANT_ID
- ARM_ENVIRONMENT

次のシェルスクリプトを使用して設定します
それぞれにAzure CLIで確認した項目を入力していきます

```bash
echo "Setting environment variables for Terraform"
export ARM_SUBSCRIPTION_ID=your_subscription_id
export ARM_CLIENT_ID=your_appId
export ARM_CLIENT_SECRET=your_password
export ARM_TENANT_ID=your_tenant_id
```

## Terraformを実行する

`terraform`ディレクトリを作成し、`test.tf`ファイルを作成

```test.tf
provider "azurerm" {
}
resource "azurerm_resource_group" "test" {
        name = "testResourceGroup"
        location = "westus"
}
```

`test.tf`ファイルを保存し、`terraform init`コマンドを実行
このコマンドを実行することによってAzureリソースグループを作成するために必要なAzureモジュールがダウンロードされます

## terraform plan
`terraform plan`コマンドは、作成したテンプレートに誤りが無いかと、テンプレートを適用した結果意図したリソースが作成されるか(実行計画)を確認するためのコマンドになります

```
$ terraform plan
```

## terraform apply
`terraform plan`の結果、問題ないことが確認できたら、実際にリソースグループを作成していきます。

```
$ terraform apply
```

```
実行結果
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

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

azurerm_resource_group.rg: Creating...
  location: "" => "westus"
  name:     "" => "testResourceGroup"
  tags.%:   "" => "<computed>"
azurerm_resource_group.rg: Creation complete after 1s
```

できでる〜〜
今回は
- Terraformのインストール
- Azrue資格情報の構成
- Azureリソースグループの作成

を行いました。次はAzure VMを作成していきます！
ありがとうございました！

## 参考
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/terraform-install-configure
https://www.terraform.io/docs/providers/azurerm/authenticating_via_azure_cli.html