Open7

TerraformをAzure上に展開する

shimakaze_softshimakaze_soft

Ubuntu 20.04にterraformをインストールする

$ sudo apt update
$ sudo apt upgrade

公式リポジトリからTerraformをインストールする

$ curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
$ sudo apt-add-repository "deb [arch=$(dpkg --print-architecture)] https://apt.releases.hashicorp.com $(lsb_release -cs) main"

リポジトリが追加されたら、次のコマンドを実行してTerraformをインストールする

$ sudo apt update
$ sudo apt install terraform

Terraformがインストールされていることを確認する。

$ terraform -v
Terraform v1.1.6
on linux_amd64
shimakaze_softshimakaze_soft

Azure CLIでのログイン

Azure CLIのインストール方法などは、こちらを参照してください。

以下コマンドでAzureのログインができます。ブラウザが立ち上がって認証画面にリダイレクトされます。

$ az login

以下コマンドで、以下のような認証情報が出ていれば成功です。

$ az account show
{
  "environmentName": "AzureCloud",
  "homeTenantId": "<tenantId>",
  "id": "<subscription_id>",
  "isDefault": true,
  "managedByTenants": [],
  "name": "<subscription_name>",
  "state": "Enabled",
  "tenantId": "<tenantId>",
  "user": {
    "name": "<username>",
    "type": "user"
  }
}

サービスプリンシパル (SP) での認証

自分の個人アカウントでTerraformを実行しても良いと思いますが、大抵はCI/CD上からTerraformのコマンドを実行するかと思います。

そのために、個人ではなくサービスプリンシパルというアプリケーション用のアカウントというのを作れます。

# サブスクリプション情報を表示
$ az account list --query "[].{name:name, subscriptionId:id}"
[
  {
    "name": "subscription_name",
    "subscriptionId": "********************"
  }
]

# 特定のサブスクリプションへの操作設定
$ az account set --subscription="<subscription_id>"

# SPの作成
$ az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/<subscription_id>"

Creating a role assignment under the scope of "/subscriptions/******************:"
{
  "appId": "**************",
  "displayName": "*****",
  "name": "***********",
  "password": "***********",
  "tenant": "*********"
}

ここで表示されたパスワードは必ず控えてください。
後から参照することはできません。

$ az login --service-principal -u <service_principal_name> -p <service_principal_password> --tenant <service_principal_tenant>

これでサービスプリンシパルとしてAzureにログインができます。

shimakaze_softshimakaze_soft

Terraform構成ファイルを作成

それでは実際にTerraform構成ファイルを作成していきます。

まずはTerraform用のディレクトリを作成します。

$ mkdir terraformTest
$ cd terraformTest

次にTerraform構成ファイルを作成していきます。
今回はterraformTest.tfというファイルで作成します。

terraform {

  required_version = ">=0.12"

  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name = "terraformTest-rg"
  location = "japaneast"
}

内容としては以下を作成するという内容になります。

  • Azureに対してのTerraform構成ファイル
  • リージョンは東日本リージョン
  • リソースグループ terraformTest-rg

それぞれのブロックについて紹介します。

provider

providerブロックで、Azureプロバイダー(azurerm)を使用することを指定します。

resource リソース

azurerm_resource_group のリソースの種類に対するもの

azure_resource_groupに必要な引数は以下の2つ

  • name
  • location
shimakaze_softshimakaze_soft

Terraformの実行

実際に実行してみます。実行する時は必ず構成ファイルがある場所まで移動する必要があります。

Terraformの初期化

リソースグループの作成に必要なモジュールがDLされる

$ terraform init

アクションのプレビュー

期待した通りに実行されるかを確かめることができる。

-outパラメータを使用すると、後々のためにこのプランを保存しておくことができます。

$ terraform plan

実行プランの適用

実際にTerraformを実行します。

$ terraform apply

確認

実際にできているかを確認します。

$ az group show -n "terraformTest-rg"

{
  "id":  "/subscriptions/****/resourceGroups/terraformTest-rg",
  "location": "japaneast",
  "managedBy": null,
  "name": "terraformTest-rg",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": {},
  "type": "Microsoft.Resources/resourceGroups"
}
shimakaze_softshimakaze_soft

実行プランの保存

実行プランをファイル形式で保存しておくことができる。
複雑な操作の場合は実行プランを指定して実行すると使いやすい。

# -out で出力するファイル名を指定
$ terraform plan -out terraTest.tfplan

# 上記ファイルを指定し、実行
$ terraform apply terraTest.tfplan

削除

なんと以下のコマンドで、Terraformで作成したリソースは以下のコマンドで削除できる。

# 途中でyesと入力することが求められる
$ terraform destroy

# 削除の確認
$ az group show -n "terraformTest-rg"

(ResourceGroupNotFound) Resource group 'terraformTest-rg' could not be found.
Code: ResourceGroupNotFound
Message: Resource group 'terraformTest-rg' could not be found.
shimakaze_softshimakaze_soft

Terraformを元にインフラ構成図を自動生成

インフラ構成図を作っていくのがめんどくさかったので、調べたら以下のような便利なツールが出てきた。

https://github.com/cycloidio/inframap

インストール方法

$ git clone https://github.com/cycloidio/inframap
$ cd inframap
$ go mod download
$ make build

nframapという実行ファイルが生成される。次に以下のコマンドでシンボリックリンクを貼る。

$ cd /usr/local/bin
$ ln -s <inframapがあるPATH> inframap