terraform-provider-azurermでエラーが出たときの調査ログ

Terraformのトラブルシューティングログです。

問題起きた時にどうやって原因を突き止めるのか、後で手順を誰かに説明する時のために書いておきます。

事象

昨日まで動いていたTerraformでのAzureのプロビジョニングが急に動かなくなりました。 既に存在すると出ていますが、存在していません。実際にAzure Portalから作成すると作成できます。

Error: Error checking if CosmosDB Account "my-cosmos" already exists (Resource Group "my-datastore-rg"): documentdb.DatabaseAccountsClient#CheckNameExists: Failure responding to request: StatusCode=500 -- Original Error: autorest/azure: error response cannot be parsed: "" error: EOF

  on ../../modules/cosmos/main.tf line 34, in resource "azurerm_cosmosdb_account" "my_cosmos_account":
  34: resource "azurerm_cosmosdb_account" "my_cosmos_account" {

TerraformのProviderのリポジトリを確認する

リポジトリでリリースを確認します。

現時点では、10日に1回くらいのペースでリリースが走っているので、直っていたり、対応されているものもあります。特に、動きの早いサービス使っているなら要確認です。

Releases · terraform-providers/terraform-provider-azurerm · GitHub

特にこの辺りから関連ファイル探して(Golang読めなくてもサービス名等で簡単に見つかるはず)、Gitのhistoryやblame見るだけでもわかることがあります。

terraform-provider-azurerm/azurerm/internal/services at v2.12.0 · terraform-providers/terraform-provider-azurerm · GitHub

例えば今回、エラー出てたのは azurerm_cosmosdb_account だったらこの辺りとか。

terraform-provider-azurerm/azurerm/internal/services/cosmos at v2.12.0 · terraform-providers/terraform-provider-azurerm · GitHub

どうやら1ヵ月くらい変更無さそうです。

f:id:yomon8:20200602185442p:plain

ログを取得する

以下のように指定してTerraform実行するとTraceログ取れます。

export TF_LOG=TRACE
export TF_LOG_PATH=$(pwd)/tf.log

↓詳細はこちらから

www.terraform.io

変な部分がひっかかりました。500のエラーが出てそうです。

HTTP/2.0 500 Internal Server Error

2020-06-02T16:39:37.187+0900 [DEBUG] plugin.terraform-provider-azurerm_v2.12.0_x5: [DEBUG] AzureRM Response for https://management.azure.com/providers/Microsoft.DocumentDB/databaseAccountNames/account-name-cosmos?api-version=2015-04-08: 
2020-06-02T16:39:37.187+0900 [DEBUG] plugin.terraform-provider-azurerm_v2.12.0_x5: HTTP/2.0 500 Internal Server Error
2020-06-02T16:39:37.187+0900 [DEBUG] plugin.terraform-provider-azurerm_v2.12.0_x5: Content-Length: 323
2020-06-02T16:39:37.187+0900 [DEBUG] plugin.terraform-provider-azurerm_v2.12.0_x5: Cache-Control: no-store, no-cache
2020-06-02T16:39:37.187+0900 [DEBUG] plugin.terraform-provider-azurerm_v2.12.0_x5: Date: Tue, 02 Jun 2020 07:39:36 GMT

APIを確認する

実際にAPIを確認してみます。OAuth2のトークンを一緒に渡さないと確認できないのですが、面倒です。

https://management.azure.com/providers/Microsoft.DocumentDB/databaseAccountNames/account-name-cosmos?api-version=2015-04-08

ただ、Azureでは API Explorerが提供されていて、ブラウザからログオン情報を利用して、トークン生成して、AzureのAPIを実行して試すことができるので便利です。

REST API Browser | Microsoft Docs

f:id:yomon8:20200602185854p:plain

今回は以下のAPIが当てはまります。

Database Accounts - Check Name Exists (Azure Cosmos DB Resource Provider) | Microsoft Docs

実行してみると500が返ってきます。別のアカウントやサブスクリプションで切り替えて実行しても同じなので、このAPIが問題のようです。

f:id:yomon8:20200602185730p:plain

ただ、ここHEADで500だと、得られる情報も少ない。 500かつ x-ms-failure-cause: service なので、たぶんサービス側の問題で間違い無いと思いますが。

Githubを検索

念のため、APIの名前の databaseAccountNames でGithubを検索してみます。 Issueが直近で沢山あがっているのがわかります。みんな同じ状態ですね。

f:id:yomon8:20200603225815p:plain

Issueの中を見るとMSのCosmosDBのチームも事象を把握していて、対応始めているようなので、「いいね」ボタン押して対応を待つことにします。

最終手段

時間が無くて、Azure Portalから実行したらリソース作成できる場合は手で作ってしまって、後からインポートするのも一つの手です。

$ terraform import \
  azurerm_cosmosdb_account.account1 \
 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.DocumentDB/databaseAccounts/account1

そしてブログ公開した翌日直りました

対応してくださった中の人たちに感謝です。 f:id:yomon8:20200604092345p:plain