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

この記事では、Azure で Terraform を使用する場合の一般的な問題と考えられる解決策を示します。

Terraform 固有の問題が発生した場合は、HashiCorp のコミュニティ サポート チャネルのいずれかを使用してください。

HashiCorp の Terraform 固有のサポート チャネル

プロバイダーの登録状態を一覧表示できない

エラー メッセージ:

Error: Unable to list provider registration status, it is possible that this is due to invalid credentials or the service principal does not have permission to use the Resource Manager API, Azure error: resources.ProvidersClient#List: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="AuthorizationFailed" Message="The client '00000000-0000-0000-0000-000000000000' with object id '00000000-0000-0000-0000-000000000000' does not have authorization to perform action 'Microsoft.Resources/subscriptions/providers/read' over scope '/subscriptions/00000000-0000-0000-0000-000000000000' or the scope is invalid. If access was recently granted, please refresh your credentials." (エラー: プロバイダーの登録状態を一覧表示できません。資格情報が無効であるか、サービス プリンシパルに Resource Manager API を使用する権限がないことが原因である可能性があります。Azure エラー: resources.ProvidersClient#List: リクエストへの応答に失敗しました: StatusCode=403 -- 元のエラー: autorest/azure: サービスからエラーが返されました。状態=403 コード="AuthorizationFailed" メッセージ="オブジェクト ID '00000000-0000-0000-0000-000000000000' を持つクライアント '00000000-0000-0000-0000-000000000000' には、スコープ '/subscriptions/00000000-0000-0000-0000-000000000000' に対してアクション 'Microsoft.Resources/subscriptions/providers/read' を実行する権限がないか、スコープが無効です。アクセス許可が最近付与された場合は、資格情報を更新してください。")

背景: Cloud Shell から Terraform コマンドを実行していて、特定の Terraform/Azure 環境変数を定義している場合は、競合が発生することがあります。 環境変数と、これらの環境変数が表す Azure の値を次の表に示します。

環境変数 Azure の値
ARM_SUBSCRIPTION_ID Azure サブスクリプション ID
ARM_TENANT_ID Microsoft アカウント テナント ID
ARM_CLIENT_ID Azure サービス プリンシパル アプリ ID
ARM_CLIENT_SECRET Azure サービス プリンシパル パスワード

原因: この文書の作成時点では、Cloud Shell で実行される Terraform スクリプトは、現在の Azure サブスクリプションの値を使用して、ARM_SUBSCRIPTION_ID 環境変数と ARM_TENANT_ID 環境変数を上書きします。 その結果、環境変数によって参照されるサービス プリンシパルに現在の Azure サブスクリプションに対する権限がない場合、Terraform の操作はすべて失敗します。

状態ロックの取得中にエラーが発生した

エラー メッセージ:

Error: Error acquiring the state lock; Error message: 2 errors occurred:
* state blob is already locked
* blob metadata "terraformlockid" was empty
Terraform acquires a state lock to protect the state from being written by multiple users at the same time. Please resolve the issue above and try again. For most commands, you can disable locking with the "-lock=false" flag, but this is not recommended.
(エラー: 状態ロックの取得中にエラーが発生しました; エラー メッセージ: 2 つのエラーが発生しました:* 状態 BLOB がすでにロックされています* BLOB メタデータ "terraformlockid" が空でしたTerraform は状態ロックを取得することで、同時に複数のユーザーによって書き込まれないように状態を保護しています。上記の問題を解決してから、再度お試しください。ほとんどのコマンドでは、"-lock=false" フラグでロックを無効にすることができますが、これは推奨されません。)

背景: Terraform の状態ファイルに対して Terraform コマンドを実行していて、このエラー メッセージのみが表示される場合、次の原因が該当する可能性があります。 ローカルおよびリモートの状態ファイルに当てはまります。

原因: このエラーには、2 つの原因が考えられます。 1 つ目は、Terraform コマンドが状態ファイルに対して既に実行されていて、破損が発生しないように、ファイルが強制的にロックされています。 2 つ目の原因として、コマンドの実行時に状態ファイルと CLI の間で接続が中断されたことが考えられます。 この中断は、リモート状態ファイルを使用している場合に最もよく発生します。

解決策: まず、状態ファイルに対してコマンドを実行していないことを確認します。 ローカルの状態ファイルを操作している場合、コマンドを実行しているターミナルがあるかどうかを確認します。 または、デプロイ パイプラインを調べて、実行中のものが状態ファイルを使用している可能性があるかどうかを確認します。 これで問題が解決しない場合は、2 つ目の原因によってエラーが発生した可能性があります。 Azure Storage アカウント コンテナーに格納されているリモート状態ファイルの場合、そのファイルを見つけて、[リースの解約] ボタンを使用できます。

Screenshot that shows the Azure Storage container Break lease button.

他のバックエンドを使用して状態ファイルを格納している場合、推奨事項については、HashiCorp のドキュメントを参照してください。

VPN エラー

VPN エラーの解決方法の詳細については、ハイブリッド VPN 接続のトラブルシューティングの記事をご覧ください。