次の方法で共有


サービス プリンシパルを使用して Azure に対する認証を行う

この記事では、サービス プリンシパルを使用して Azure に対して Terraform を認証する方法について説明します。

この記事では、次のことについて説明します。

  • サービス プリンシパルの作成
  • 環境変数でのサービス プリンシパル資格情報の指定
  • Terraform プロバイダー ブロックでサービス プリンシパルの資格情報を指定する

サービス プリンシパルの作成

サービス プリンシパルにアクセスできない場合は、このセクションに進んで新しいサービス プリンシパルを作成します。 使用できるサービス プリンシパルがある場合は、「Specify サービス プリンシパルの資格情報セクションに進んでください。

Azure サービスをデプロイまたは使用する自動化ツール (Terraform など) のアクセス許可は、常に制限されている必要があります。 Azureは、完全な権限を持つユーザーとしてアプリケーションにサインインさせる代わりに、サービス プリンシパルを提供します。

最も一般的なパターンは、Azure に対話形式でサインインし、サービス プリンシパルを作成し、サービス プリンシパルをテストして、そのサービス プリンシパルを (対話形式またはスクリプトから) 今後の認証に使用することです。

  1. サービス プリンシパルを作成するには、Azure にサインインします。 Microsoft アカウントを使用して Azure に対して認証を行った後で、ここに戻ります。

  2. Git Bash からサービス プリンシパルを作成している場合は、MSYS_NO_PATHCONV 環境変数を設定します (Cloud Shell を使用している場合、この手順は必要ありません。)

    export MSYS_NO_PATHCONV=1    
    

    重要なポイント:

    • MSYS_NO_PATHCONV 環境変数は、グローバルに (すべてのターミナル セッションに対して) 設定することも、ローカルで (現在のセッションのみに) 設定することもできます。 サービス プリンシパルの作成は頻繁に行うものではないため、サンプルでは現在のセッションの値を設定します。 この環境変数をグローバルに設定するには、~/.bashrc ファイルに設定を追加します。
  3. サービス プリンシパルを作成するため、az ad sp create-for-rbac を実行します。

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    重要なポイント:

    • <service-principal-name> を、ご使用の環境のカスタム名に置き換えることも、パラメーターを完全に省略することもできます。 パラメーターを省略する場合、サービス プリンシパル名は現在の日付と時刻に基づいて生成されます。
    • 正常に完了すると、az ad sp create-for-rbac によっていくつかの値が表示されます。 appIdpassword、および tenant の値は、次のステップで使用します。
    • このパスワードは、紛失した場合、取得できません。 したがって、パスワードは安全な場所に保管してください。 パスワードを忘れた場合は、サービス プリンシパルの資格情報をリセットできます。
    • この記事では、共同作成者ロールを指定したサービス プリンシパルが使用されています。 ロールベースのアクセス制御 (RBAC) ロールの詳細については、「RBAC: 組み込みロール」を参照してください。
    • サービス プリンシパルの作成時の出力には、機密性の高い資格情報が含まれています。 これらの資格情報をコードに含めないようにするか、資格情報をソース管理にチェックインしてください。
    • Azure CLI でサービス プリンシパルを作成するときのオプションの詳細については、記事「Azure CLI で Azure サービス プリンシパルを作成する」を参照してください。

サービス プリンシパルの資格情報を指定する

サービス プリンシパルの資格情報を指定するには、いくつかの方法があります。 ただし、セキュリティ上の理由から、プロバイダー ブロックに資格情報を格納しないことをお勧めします。 この手法は、完全性とテスト目的でのみ示されています。

環境変数でサービス プリンシパルの資格情報を指定する

サービス プリンシパルを作成したら、環境変数を使用して、その Terraform への資格情報を指定できます。

  1. 次の環境変数を追加して、~/.bashrc ファイルを編集します。

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. ~/.bashrc スクリプトを実行するために、source ~/.bashrc (または同等の省略形である . ~/.bashrc) を実行します。 また、スクリプトを自動的に実行するために Cloud Shell を終了してからもう一度開くこともできます。

    . ~/.bashrc
    
  3. 環境変数を設定したら、次のように値を確認できます。

    printenv | grep ^ARM*
    

    重要なポイント:

    • 他の環境変数と同様に、Terraform スクリプトから Azure サブスクリプションの値にアクセスするには、${env.<environment_variable>} という構文を使用します。 たとえば、ARM_SUBSCRIPTION_ID の値にアクセスするには、${env.ARM_SUBSCRIPTION_ID} を指定します。
    • Terraform 実行プランを作成して適用すると、サービス プリンシパルに関連付けられている Azure サブスクリプションが変更されます。 1 つの Azure サブスクリプションにログインしていて、環境変数が 2 つ目の Azure サブスクリプションを指している場合、これは混乱を招くことがあります。 これを説明する次の例を見てみましょう。 たとえば、SubA と SubB という 2 つの Azure サブスクリプションがあるとします。 現在の Azure サブスクリプションが SubA であり (az account show で特定)、環境変数が SubB を指している場合、Terraform によって行われたすべての変更は SubB に適用されます。 そのため、SubB サブスクリプションにログインし、Azure CLI コマンドか Azure PowerShell コマンドを実行して、変更内容を表示する必要があります。
  4. セクションに進み、 次の手順に進みます

Terraform プロバイダー ブロックでサービス プリンシパルの資格情報を指定する

注意事項

Terraform 構成ファイルで Azure サブスクリプションの資格情報を指定する機能は、特にテスト時に便利です。 ただし、信頼されていない個人が表示できるクリアテキスト ファイルに資格情報を格納することは推奨されません。

Azure プロバイダー ブロックでは、Azure サブスクリプションの認証情報を指定できるようにする構文が定義されます。

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

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

次のステップ