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見るだけでもわかることがあります。
例えば今回、エラー出てたのは azurerm_cosmosdb_account
だったらこの辺りとか。
どうやら1ヵ月くらい変更無さそうです。
ログを取得する
以下のように指定してTerraform実行するとTraceログ取れます。
export TF_LOG=TRACE export TF_LOG_PATH=$(pwd)/tf.log
↓詳細はこちらから
変な部分がひっかかりました。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
今回は以下のAPIが当てはまります。
Database Accounts - Check Name Exists (Azure Cosmos DB Resource Provider) | Microsoft Docs
実行してみると500が返ってきます。別のアカウントやサブスクリプションで切り替えて実行しても同じなので、このAPIが問題のようです。
ただ、ここHEADで500だと、得られる情報も少ない。
500かつ x-ms-failure-cause: service
なので、たぶんサービス側の問題で間違い無いと思いますが。
Githubを検索
念のため、APIの名前の databaseAccountNames
でGithubを検索してみます。
Issueが直近で沢山あがっているのがわかります。みんな同じ状態ですね。
Issueの中を見るとMSのCosmosDBのチームも事象を把握していて、対応始めているようなので、「いいね」ボタン押して対応を待つことにします。
最終手段
時間が無くて、Azure Portalから実行したらリソース作成できる場合は手で作ってしまって、後からインポートするのも一つの手です。
$ terraform import \ azurerm_cosmosdb_account.account1 \ /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.DocumentDB/databaseAccounts/account1
そしてブログ公開した翌日直りました
対応してくださった中の人たちに感謝です。