理系学生日記

おまえはいつまで学生気分なのか

はじめてのAzure+Terraform

TerraformでAzureを触ってみます。

先週、ついにTerraformの0.15.0がGAになりました。

最新版のTerraformのインストール

というわけで、まずはTerraformの0.15.0をインストールします。

$ tfenv install 0.15.0
$ tfenv use 0.15.0
$ terraform version
Terraform v0.15.0
on darwin_amd64

Azure CLIのインストール

Azureに対してTerraformを利用するためには、当然Azureの認証をパスする必要があります。 最初はもっとも簡易と思われるAzure CLIを利用した認証をしてみましょう。

Azure CLIのインストール方法はこちらに記載があります。

homebrewでインストールできるようなので、さっとインストールしてみます。

$ brew update && brew install azure-cli
$ az version
{
  "azure-cli": "2.22.0",
  "azure-cli-core": "2.22.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}

Azureへのログイン

それでは早速Azure CLIを使ったユーザー認証をしてみましょう。az loginを実行すると、ブラウザが立ち上がり、そこでログインを行うことになります。 実際にそのフローを行うと、以下のような出力が得られました。

$ az login
The default web browser has been opened at https://login.microsoftonline.com/common/oauth2/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.
You have logged in. Now let us find all the subscriptions to which you have access...
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "xxxxxx",
    "id": "xxxxxx",
    "isDefault": true,
    "managedByTenants": [],
    "name": "無料試用版",
    "state": "Enabled",
    "tenantId": "xxxxxx",
    "user": {
      "name": "xxxxxx",
      "type": "user"
    }
  }
]

Terraformを実行してみる

ここでは、最初にリソースグループだけを作ってみましょう。以下のようなtfファイルをmain.tfとして保存します。

terraform {
  required_version = "0.15.0"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.56.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example"
  location = "Japan East"
}

これをapplyしてみます。

$ ls
main.tf
$ terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # azurerm_resource_group.example will be created
  + resource "azurerm_resource_group" "example" {
      + id       = (known after apply)
      + location = "japaneast"
      + name     = "example"
    }

Plan: 1 to add, 0 to change, 0 to destroy.

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

azurerm_resource_group.example: Creating...
azurerm_resource_group.example: Creation complete after 0s [id=/subscriptions/xxxxxx/resourceGroups/example]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

うまくいったようですね。実際に作成できているのか確認してみましょう。

$ az group list -o table
Name     Location    Status
-------  ----------  ---------
example  japaneast   Succeeded

きちんとリソースが作成されているようです。

Azureにログインできていなかった場合はどうなるか

Azureにログインできていなかった場合はどのようになるでしょうか。

az logoutをした上でterraform applyを実行すると、認証エラーが返却されます。

$ az logout
$ terraform apply
╷
│ Error: Error building AzureRM Client: obtain subscription() from Azure CLI: Error parsing json result from the Azure CLI: Error waiting for the Azure CLI: exit status 1: ERROR: Please run 'az login' to setup account.
│
│   on main.tf line 12, in provider "azurerm":
│   12: provider "azurerm" {
│
╵

まとめ

今日は単にAzureのプロバイダを使ってリソースグループを作ってみただけです。 Azure CLIを使った認証方法だと、基本的にはinteractiveな操作が要求され、インフラ構築の「自動化」には向きません。

Terraform Registryには、Azure CLI以外の認証方法もまとまっているので、学びながら試してみます。