エラーの概要

HTTP 429 エラーは「Too Many Requests」を意味し、Terraform の実行時にクラウドプロバイダーの API レート制限に達したことを示します。AWS・Google Cloud・Azure など複数のプロバイダーが API 呼び出しの頻度を制限しており、Terraform がこの上限を超えたときに発生します。特に大規模なインフラストラクチャをコード化する際に、並列処理による過度な API 呼び出しが原因となることが多くあります。

実際のエラーメッセージ例

Terraform 実行時に以下のようなエラーが出力されます。

{
  "error": "error creating Security Group: RequestLimitExceeded: Request limit exceeded",
  "status_code": 429
}

また、Terraform の標準出力では以下のように表示されることもあります。

Error: Error creating load balancer: InvalidParameterValue
  on main.tf line 42, in resource "aws_lb" "example":
  42: resource "aws_lb" "example" {

429 Too Many Requests

よくある原因と解決手順

原因 1:Terraform の並列実行数が多すぎる

Terraform はデフォルトで 10 個のリソースを同時に作成する設定になっており、これが API レート制限に抵触します。特に AWS や Google Cloud のプロバイダーでは、単位時間あたりの API 呼び出し数に制限があり、デフォルトの並列度では超過しやすくなります。

修正前:

terraform apply -auto-approve
# デフォルトの並列度 10 で実行

修正後:

terraform apply -parallelism=5 -auto-approve
# 並列度を 5 に制限して実行

より慎重に進める場合:

terraform apply -parallelism=2 -auto-approve
# 並列度を 2 に制限(さらに安全)

原因 2:複数の Terraform プロセスが同時に実行されている

CI/CD パイプラインやスケジュール実行を複数設定している場合、同じプロバイダーに対して複数の Terraform プロセスが同時にアクセスし、API レート制限に達します。

修正前:

# .gitlab-ci.yml の例
stages:
  - deploy

deploy_env1:
  script:
    - terraform apply -auto-approve

deploy_env2:
  script:
    - terraform apply -auto-approve

この設定では deploy_env1deploy_env2 が並列実行され、同一プロバイダーへの API 呼び出しが競合します。

修正後:

# .gitlab-ci.yml の例
stages:
  - deploy_env1
  - deploy_env2

deploy_env1:
  stage: deploy_env1
  script:
    - terraform apply -auto-approve

deploy_env2:
  stage: deploy_env2
  script:
    - terraform apply -auto-approve

ステージを分離して順序を制御し、同時実行を防ぎます。

原因 3:プロバイダー設定にリトライロジックがない

一時的な API 制限エラーに対して自動的に再試行する機構がない場合、すぐにエラーで終了してしまいます。プロバイダー設定にリトライパラメーターを追加することで、指数バックオフを用いた自動再試行が可能になります。

修正前:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

修正後:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

# 環境変数で制御する場合
# export AWS_MAX_ATTEMPTS=5
# export AWS_RETRY_MODE=adaptive

AWS プロバイダーの場合、環境変数 AWS_MAX_ATTEMPTS で最大試行回数を指定できます。

ツール固有の注意点

AWS プロバイダーでの対応

AWS には複数のレート制限があり、IAM API・EC2 API・CloudFormation API などサービスごとに異なります。Terraform が CloudFormation を背後で使用している場合、CloudFormation のスタック作成数制限(デフォルトでは 200 スタック)に達することもあります。

# AWS リクエストスロットリング対策
export AWS_MAX_ATTEMPTS=10
export AWS_RETRY_MODE=adaptive
terraform apply -parallelism=3

Google Cloud プロバイダーでの対応

Google Cloud は API ごとに異なるクォータを設定しており、Compute Engine API はデフォルトで 1 分間に 240 リクエストに制限されています。

provider "google" {
  project = "<your-project-id>"
  region  = "asia-northeast1"

  # Google Cloud 側でのスロットリング対応
  # Terraform 側では parallelism で調整する
}

Terraform Cloud・Terraform Enterprise での実行

Terraform Cloud を通じて実行する場合、ワークスペースの実行キューがバックプレッシャー(負荷圧力)となり、複数の実行が積み重なると API レート制限に達しやすくなります。その場合は実行中の Terraform を明示的にキャンセルするか、ワークスペース単位で apply タイミングをずらします。

それでも解決しない場合

確認すべきログ

Terraform は詳細ログを以下の環境変数で有効化できます。

export TF_LOG=DEBUG
export TF_LOG_PATH=terraform.log
terraform apply -parallelism=3

生成される terraform.log には API レスポンスの詳細(HTTP ステータスコードリトライ回数)が記録されており、どのリソース作成時に 429 エラーが発生したかを特定できます。

リソース分割による段階的デプロイ

規模が大きい場合は、Terraform コード自体をモジュール単位で分割し、段階的に apply することも有効です。

# ステップ 1:ネットワーク系
terraform apply -target=module.network

# ステップ 2:セキュリティグループ
terraform apply -target=module.security_groups

# ステップ 3:コンピュートリソース
terraform apply -target=module.compute

プロバイダーのクォータ増申請

クライアント側での調整でも追いつかない場合、クラウドプロバイダーのコンソール画面でクォータ増申請を行います。AWS の場合は Service Quotas コンソール、Google Cloud の場合は Quotas ページから申請可能です。申請から承認まで数時間~数日要することがあるため、並列数削減は並行して行うべきです。


免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。