Terraformで「SERVICE_DISABLED」エラーが出た時の対処法

記事タイトルとURLをコピーする

G-gen の藤岡です。当記事では、Google Cloud (旧称 GCP) のリソースを Terraform で作成する際に生じる "reason": "SERVICE_DISABLED" エラーへの対処として Terraform の time_sleep を紹介します。

前提知識

Google Cloud は Google Cloud APIs と呼ばれる Web API 群から成り立っています。そのため、Google Cloud ではサービス利用時に対象の API を有効化する必要があります。

例えば、VPC や GCE のリソースを作成するには compute.googleapis.com の API を有効化します。この API 有効化のステップは Amazon Web Services (AWS) にはなく、Google Cloud 特有のものです。

Google Cloud APIs についての詳細は以下の記事をご参照ください。 blog.g-gen.co.jp

Terraform で API を有効にする際は google_project_service を使います。Terraform の基本操作については以下の記事をご参照ください。 blog.g-gen.co.jp

エラー文

例として、Terraform で VPC リソースを作成しようとすると以下のエラーが発生する場合があります。

このエラーメッセージは、「Compute Engine API が有効化されていない」旨を示しています。しかし、実際には Terraform のコード内で google_project_service リソースが定義されており、これによって Compute Engine API が有効化されているはずです(Terraform 実行後にコンソールから確認したところ、問題なく有効になっていました)。

fujioka@cloudshell:~/terraform (xxx)$ terraform apply
~
│ Error: Error creating Network: googleapi: Error 403: Compute Engine API has not been used in project xxxx before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/compute.googleapis.com/overview?project=xxxx then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.Details:
│ [{
│     "@type": "type.googleapis.com/google.rpc.Help",
│     "links": [{
│         "description": "Google developers console API activation",
│         "url": "https://console.developers.google.com/apis/api/compute.googleapis.com/overview?project=xxxx"}]},
│   {
│     "@type": "type.googleapis.com/google.rpc.ErrorInfo",
│     "domain": "googleapis.com",
│     "metadatas": {
│       "consumer": "projects/xxxx",
│       "service": "compute.googleapis.com"
│     },
│     "reason": "SERVICE_DISABLED"
│   }]
│ , accessNotConfigured
│ 
~
fujioka@cloudshell:~/terraform (xxxx)$ 

原因

API の有効化が完了するまでは時間がかかります。これは、コンソールから有効化する 場合も同様です。

そのため、Terraform の depends_on で実行順序を制御しても API の有効化完了が間に合わないと上記のようなエラーとなります。

この場合、API の有効化が間に合っていないだけのため、時間を置いてから Terraform を再実行することでエラーは解消されます。しかし、根本的な解決方法は、API の有効化が完了するまである程度待機してから、後続のアクションを実行することです。

対処法

Terraform の time_sleep を使うことで、後続の実行までにスリープ時間を作ることができます。

create_duration の部分でスリープ時間を調整できます。この場合、API の有効化(google_project_service)の後にスリープ時間を作るよう depends_on で実行順序を制御します。

resource "google_project_service" "enabled_apis" {
  service = "compute.googleapis.com"
}
  
resource "time_sleep" "wait_30_seconds" {
  depends_on      = [google_project_service.enabled_apis]
  create_duration = "30s"
}

ここでは sleep を入れることで解決しましたが、API を有効化後に無効にするケースは少ないことや、有効化する API が多ければその分 tfstate ファイルが肥大化してしまうことを考えると、API の有効化は Terraform でなくシェルスクリプト等で管理する選択肢も検討できます。

藤岡 里美 (記事一覧)

クラウドソリューション部

数年前までチキン売ったりドレスショップで働いてました!2022年9月 G-gen にジョイン。ハイキューの映画を4回は見に行きたい。

Google Cloud All Certifications Engineer / Google Cloud Partner Top Engineer 2024