TerraformでAzureリソースを作成するときの前準備(Service PrincipalとStorage Account)

Tags:

#Azure #Terraform
このエントリーをはてなブックマークに追加

TerraformでAzureリソースを作成するチュートリアルをやっていて以外と準備に時間がかかったのでメモしていきます。 「チュートリアルやってみた」の記事はまた、次回書きます。

サービスプリンシパルを作る

TerraformからAzureリソースを作成する際の認証についてです。 いくつか認証の方法はありますが、今回はサービスプリンシパルで認証する方法について書きます。 サービスプリンシパルはAWSでいうところのIAMユーザーのアクセスキーに対応するかと思います。 TerraformでAWSリソースを作成するときにAWS_ACCESS_KEY_IDやAWS_SECRET_ACCESS_KEYを環境変数にセットすると思いますが、Azureでも同様のことを行います。

まずはAzure CLIを利用してサービスプリンシパルの作成します。

// azureへのログイン
az login

// アカウントのリストを表示
az account list

// ServicePrincipalを作成
az ad sp create-for-rbac --role="Contributor" --scope="/subscriptions/<サブスクリプションID>"

ServicePrincipalの作成で以下のような出力が得られます。

{
  "appId": "xxxxxxxxxx",
  "name": "xxxxxxxxxxxx",
  "password": "xxxxxxxxxxxxxxx",
  "tenant": "xxxxxxxxxxx"
}

この値を環境変数にセットします。

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からAzureリソースを作成できるようになりました。

state用のBlob Storageを用意する

Terraformはstateをローカルで管理すこともできますが、今回はAzureのBlobでstateを管理するための準備です。 BlobはAWSでいうところのS3に対応すると思います。

Blobを利用するにはAzure上でストレージアカウントを作成する必要があります。 Azureポータルでストレージアカウントを作成します。 ストレージアカウント作成後、アクセスキーというメニューからアクセスキーを取得しておきます。 このアクセスキーを利用してストレージを作成していきます。

az storage container create -n <ContainerName> --account-name <YourAzureStorageAccountName> --account-key <YourAzureStorageAccountKey>

containerというのはBlobを管理する単位のことです。上記のコマンドでコンテナが作成されます。 これでTerraformのstate管理にBlobを利用する準備ができました。

実際にTerraformでリソースを作ってみる

テスト用に以下のtfファイルを使います。 Azureのリソースグループを作成していきます。 リソースグループはAzureのリソースをグループ化するものです。

provider "azurerm" {
  # The "feature" block is required for AzureRM provider 2.x. 
  # If you are using version 1.x, the "features" block is not allowed.
  version = "~>2.0"
  features {}
}

terraform {
  backend "azurerm" {}
}

resource "azurerm_resource_group" "test" {
  name     = "test-resouce-group"
  location = "japan east"
}

まずはterraform initを実行します。 Blobでstateを管理するには以下のオプションを付与してterraform initします。

terraform init -backend-config="storage_account_name=<YourAzureStorageAccountName>" -backend-config="container_name=<ContainerName>" -backend-config="access_key=<YourStorageAccountAccessKey>" -backend-config="key=<TFStateFileName>"

その後、terraform plan, terraform applyすると無事リソースグループが作成できました。

まとめ

TerraformでAzureリソースを作成するため準備について書きました。 次はチュートリアルの記事を書きます。