Bash を使用して Azure Cloud Shell で Terraform を構成する

Terraform を使用すると、クラウド インフラストラクチャの定義、プレビュー、およびデプロイを行うことができます。 Terraform を使用する際は、HCL 構文を使って構成ファイルを作成します。 HCL 構文では、Azure などのクラウド プロバイダーと、クラウド インフラストラクチャを構成する要素を指定できます。 構成ファイルを作成したら、"実行プラン" を作成します。これにより、インフラストラクチャの変更をデプロイ前にプレビューすることができます。 変更を確認したら、実行プランを適用してインフラストラクチャをデプロイします。 Azure で Terraform を使用する方法の詳細については、Azure Terraform のデベロッパー センターを参照してください

この記事では、Terraform で使用するために Azure に対して認証を行うオプションについて説明します。

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

  • Cloud Shell を構成する
  • 現在の Azure アカウントを表示する
  • Terraform と Azure の一般的な認証シナリオを理解する
  • Microsoft アカウントを使用して、Cloud Shell から認証する (Bash または PowerShell を使用)
  • Microsoft アカウントを使用して、Windows から認証する (Bash または PowerShell を使用)
  • Azure CLI を使用してサービス プリンシパルを作成する
  • Azure PowerShell を使用してサービス プリンシパルを作成する
  • 環境変数でサービス プリンシパルの資格情報を指定する
  • Terraform プロバイダー ブロックでサービス プリンシパルの資格情報を指定する

1. 環境を構成する

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

2. Cloud Shell を開く

  1. 既に Cloud Shell セッションを開いている場合は、次のセクションに進むことができます。

  2. Azure portal を参照します

  3. 必要に応じて、Azure サブスクリプションにログインし、Azure ディレクトリを変更します。

  4. Cloud Shell を開きます。

    Open Cloud Shell from the top menu in the Azure portal.

  5. Cloud Shell を以前に使用したことがない場合は、環境とストレージの設定を構成します。

  6. コマンドライン環境を選択します。

    Select the CLI you want to use in Cloud Shell.

3. 最新バージョンの Terraform を Azure Cloud Shell にインストールする

Cloud Shell は、Terraform を最新バージョンに自動的に更新します。 ただし、更新はリリースから数週間以内に行われます。 この記事では、Terraform の現在のバージョンをダウンロードしてインストールする方法について説明します。

  1. Cloud Shell で使用されている Terraform のバージョンを確認します。

    terraform version
    
  2. Cloud Shell にインストールされている Terraform のバージョンが最新バージョンではない場合は、Terraform のバージョンが最新ではないことを示すメッセージが表示されます。

  3. 示されているバージョンをそのまま使用する場合は、次のセクションに進んでください。 それ以外の場合は、次の手順に進みます。

  4. Terraform のダウンロード ページを参照します。

  5. Linux のダウンロード リンクまで下にスクロールします。

  6. 64-bit のリンクの上にマウスを移動します。 これは、Cloud Shell に適した、最新の 64 ビット Linux AMD バージョンのリンクです。

  7. URL をコピーします。

  8. プレースホルダーを前の手順の URL に置き換えて、curl を実行します。

    curl -O <terraform_download_url>
    
  9. ファイルを解凍します。

    unzip <zip_file_downloaded_in_previous_step>
    
  10. ディレクトリが存在しない場合は、bin という名前のディレクトリを作成します。

    mkdir bin
    
  11. terraform ファイルを bin ディレクトリに移動します。

    mv terraform bin/    
    
  12. Cloud Shell を閉じて再起動します。

  13. ダウンロードしたバージョンの Terraform がパスの先頭にあることを確認します。

    terraform version
    

4. 既定の Azure サブスクリプションを確認する

Microsoft アカウントを使用して Azure portal にログインすると、そのアカウントの既定の Azure サブスクリプションが使用されます。

Terraform は、既定の Azure サブスクリプションの情報を使用して自動的に認証を行います。

az account show を実行して、現在の Microsoft アカウントと Azure サブスクリプションを確認します。

az account show

Terraform を使用して行った変更は、表示された Azure サブスクリプションに対して適用されます。 それが希望どおりの場合は、この記事の残りの部分をスキップしてください。

5. Azure に対して Terraform を認証する

Terraform と Azure の認証シナリオ

Terraform は、Azure CLI を使用した Azure に対する認証のみをサポートしています。 Azure PowerShell を使用した認証はサポートされていません。 そのため、Terraform の作業を行うときには Azure PowerShell モジュールを使用できますが、まず Azure CLI を使用して Azure に対する認証を行う必要があります。

この記事では、次のシナリオで Azure に対して Terraform を認証する方法について説明します。 Azure に対して Terraform を認証するオプションの詳細については、「Azure CLI を使用した認証」を参照してください。

Microsoft アカウントを使用して Azure に対する認証を行う

Microsoft アカウントは、Azure などの Microsoft サービスにサインインするために使用されるユーザー名 (メール アドレスとその資格情報に関連付けられている) です。 Microsoft アカウントは 1 つ以上の Azure サブスクリプションに関連付けることができ、そのいずれかのサブスクリプションが既定値になります。

次の手順では、Microsoft アカウントを使用して対話形式で Azure にサインインし、アカウントに関連付けられている Azure サブスクリプション (既定値を含む) を一覧表示して、現在のサブスクリプションを設定する方法を示します。

  1. Azure CLI にアクセスできるコマンド ラインを開きます。

  2. パラメーターを指定せずに az login を実行し、指示に従って Azure にサインインします。

    az login
    

    重要なポイント:

    • サインインが成功すると、az login により、ログインした Microsoft アカウントに関連付けられている Azure サブスクリプションの一覧 (既定のサブスクリプションを含む) が表示されます。
  3. 現在の Azure サブスクリプションを確認するには、az account show を実行します。

    az account show
    
  4. 特定の Microsoft アカウントのすべての Azure サブスクリプションの名前と ID を表示するには、az account list を実行します。

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    重要なポイント:

    • <microsoft_account_email> プレースホルダーを、Azure サブスクリプションを一覧表示する Microsoft アカウントのメール アドレスに置き換えます。
    • Hotmail や Outlook などの Live アカウントを使用している場合は、完全修飾メール アドレスの指定が必要になることがあります。 たとえば、メール アドレスが admin@hotmail.com の場合は、プレースホルダーを live.com#admin@hotmail.com に置き換える必要があります。
  5. 特定の Azure サブスクリプションを使用するには、az account set を実行します。

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    重要なポイント:

    • <subscription_id_or_subscription_name> プレースホルダーを、使用するサブスクリプションの ID または名前に置き換えます。
    • az account set を呼び出すと、指定した Azure サブスクリプションに切り替えた結果が表示されません。 ただし、az account show を使用して、現在の Azure サブスクリプションが変更されたことを確認できます。
    • 前の手順で az account list コマンドを実行している場合、既定の Azure サブスクリプションが、az account set で指定したサブスクリプションに変更されていることがわかります。

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

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 コマンドを実行して、変更内容を表示する必要があります。

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

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

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.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

注意事項

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

Azure での Terraform のトラブルシューティング

Azure で Terraform を使用する場合の一般的な問題のトラブルシューティング

次のステップ