TerraformのAzure認証をマネージドIDを使ってやってみた

 Azure マネージドID(Azure managed identity)を使ってTerraformのAzure認証をする事が出来ます。

Azure Provider: Authenticating using managed identities for Azure resources

 今回は公式サイトの情報を参考にTerraformのAzure認証にマネージドIDを利用し、リソースグループをデプロイする所までやってみました。

 Terraform初心者が色々やってみた内容を公開しています。過去のTerraform関連の記事はこちらに記載しております。

Terraformの記事一覧

スポンサーリンク

TerraformのAzure認証は大きく分けると3種類

 TerraformでAzureリソースを扱う場合のAzure認証処理はAzure CLIを使った対話形式のログイン、AzureサービスプリンシパルやマネージドIDを使った非対話式のログイン方法があります。CI/CDで利用の場合にはサービスプリンシパルやマネージドIDと言った非対話形式のログイン方法を利用します。

実施手順

Azure CLI(Microsoft アカウント)を使用した認証

Azure CLIを使用してコマンドラインで認証します。

az loginコマンドで認証します(対話形式(ログイン画面が表示されてログインする形))。

Azure サービス プリンシパルを使用した認証

Azureサービスプリンシパルを利用してコードの中で非対話形式(自動ログイン)する形式になります。
Managed identitiesを使用した認証

AzureマネージドIDを利用してコードの中で非対話形式(自動ログイン)する形式になります。

※テナント内のAzure VMからアクセスする場合にのみ使用可能です。(テナント外の場合はサービスプリンシパルを利用する形になります。)

 TerraformのセットアップやAzure CLI使ったログイン等についてはこちらを参照ください。

TerraformのAzure認証をマネージドIDで行う

マネージドIDで認証を行う為に必要な設定は4つ

 必要な設定は4つになります。

      • Terraformを実行する仮想マシンにマネージドIDを割り当てる。(今回はシステム割り当てマネージドIDを利用しています)
      • 割り当てたマネージドIDにAzure ロールの割り当てを行う
      • provider blockにマネージドIDで権限を割り当てたサブスクリプションID(とテナントID)を記載する
      • TerraformでマネージドIDで認証を行うようにprovider blockに追記する

 ※マネージドIDに割り当てたAzureロールの権限がTerraformで実行できる権限になります。
 ※サブスクリプションIDやテナントIDについては環境変数に指定する方法もあります。

仮想マシンでシステム割り当てマネージドIDを有効化

 Windows 10の仮想マシン(VM名:Terraform-Test-VM-01)にシステム割り当てマネージドIDの設定を実施します。

仮想マシンでマネージドID設定
仮想マシンのメニューでIDを選択します。
システム割り当て済みのタブで状態をオンに設定後に保存をクリックします。

システム割り当てマネージドID有効化の確認メッセージが表示されますのではいを選択します。

これで有効化の設定は完了です。

システム割り当てマネージドIDにAzureロール割り当てる

 システム割り当てマネージドIDにAzureロールを割り当てます。今回はサブスクリプションに対して共同作成者の権限を付与します。

システム割り当てマネージドIDでAzureロール割り当て
仮想マシンのIDのメニューでAzureロールの割り当てを選択します。
ロールの割り当ての追加を選択します。
ロールの割り当ての追加設定画面が表示されます。スコープ、適用するサブスクリプション、役割を選択します。
数分待ってから最新の情報に更新すると権限が付与されている事が分かります。
サブスクリプションのメニューでアクセス制御(IAM)を確認すると同様に仮想マシンに対して共同作成者の権限付与されている事が分かります。

TerraformでAzureマネージドIDを使って認証するように設定

 TerraformでAzureマネージドIDを使って認証するように設定します。

    • 設定内容
      • provider blockにsubscription_idを追加
        • このsubscription_idはシステム割り当てマネージドIDで権限付与したサブスクリプションのIDとなります。
      • use_msi = trueを追加
        • この設定によりマネージドIDを使って認証を行うように指示されます。

 ※別のサブスクリプションIDを割り当てたり記載してない場合は認証エラーになります。

AzureマネージドIDを使う場合の記述例
terraform {
 required_version = “>= 1.0.0"
 required_providers {
  azurerm = {
   source = “hashicorp/azurerm"
   version = “>= 2.46.0"
  }
 }
}

provider “azurerm" {
 features {}
 subscription_id = “123456789-1234-1234-1234-123456789012"
 use_msi = true
}

resource “azurerm_resource_group" “rg-managed-id" {
  name = “rg-managed-id-test"
  location = “East US2"
 }

 ※テナントID(tenant_id)を指定する必要があるとの記載も見かけたのですが、subscription_idだけで認証が通ったので今回はテナントIDは記載していません。必要に応じて追記します。
 ※テナントIDの確認方法はマイクロソフト公式サイトに記載の通りになります。

マネージドIDで認証を行いAzureリソースグループをデプロイ

 terraform init、plan、applyまで実行してみます。applyは-auto-approveオプションを付与して確認メッセージを表示しないようにしています。
 認証されてデプロイ出来ている事が確認出来ました。 

Azureで複数サブスクリプションを指定する場合のprovider記述例

PS C:\Terraform> terraform init

Initializing the backend…

(~中略~)

Terraform has been successfully initialized!

PS C:\Terraform> terraform plan

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.rg-managed-id will be created
+ resource “azurerm_resource_group" “rg-managed-id" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “rg-managed-id-test"
}

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

 

PS C:\Terraform\test> terraform apply -auto-approve

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.rg-managed-id will be created
+ resource “azurerm_resource_group" “rg-managed-id" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “rg-managed-id-test"
}

Plan: 1 to add, 0 to change, 0 to destroy.
azurerm_resource_group.rg-managed-id: Creating…
azurerm_resource_group.rg-managed-id: Creation complete after 0s [id=/subscriptions/123456789-1234-1234-1234-123456789012/resourceGroups/rg-managed-id-test]

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

最後に

 TerraformでマネージドIDを使ったAzure認証をやってみましたが、設定自体は非常に簡単でした。
 他の認証方法にはサービスプリンシパルもありますので継続して色々確認していきたいと思います。

 過去のTerraform関連の記事はこちらに記載しております。

Terraformの記事一覧