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
Follow @fujioka57621469