TerraformでService Quotasを管理すると良さそう

TerraformでService Quotasを管理すると良さそう

2025.11.16

はじめに

皆様こんにちは、あかいけです。

最近AWSの Service Quotas の上限緩和申請をする機会がありました。

従来はマネジメントコンソールから手動で申請していたのですが、
Terraformで管理できることを知り、実際に試してみたところ良さそうだったので記事にしました。

モチベーション

AWSを使っているとサービスの利用量が増えてきた際に、
「あれ、Lambda同時実行数の上限に引っかかった…」「VPCの作成上限に引っかかった…」といった場面に遭遇することがあります。

そんなときに必要になるのが Service Quotas での上限緩和申請です。
ただ、従来の方法だと以下のような手間がありました。

  • 手動作業が必要
    • AWSコンソールにログインして、 Service Quotas の画面から1つずつ申請する必要がある
  • 環境ごとに繰り返し
    • 複数アカウント、また複数リージョン利用する場合に同じ作業を繰り返す必要がある

しかしTerraformでService Quotasを管理することで、これらの問題を解消できます。
具体的には以下のようなメリットを享受できます。

  • コードとして管理できる

    • 変更履歴の追跡: コードで管理すれば、どのクォータを変更したか明確
    • レビュープロセス: Pull Requestでチームメンバーにレビューしてもらえる
    • ドキュメント化: コメントで変更理由を残せる
  • 効率化なデプロイ

    • 一括管理: 複数のクォータをまとめて管理・申請できる
    • 再現性の確保: 同じ設定を複数環境に簡単に展開できる

Terraformでの管理方法

1.必要な情報の確認

まずは、管理したいクォータの情報を確認します。
マネジメントコンソールから確認するか、以下のようにAWS CLIで確認します。

必要となるのは以下二つの情報です。

  • service_code: AWSサービスのサービスコード
  • quota_code: 各クォータのコード

サービスコード一覧の取得

aws service-quotas list-services --query Services
出力例
[
  {
    "ServiceCode": "AWSCloudMap",
    "ServiceName": "AWS Cloud Map"
  },
  {
    "ServiceCode": "access-analyzer",
    "ServiceName": "Access Analyzer"
  },
  {
    "ServiceCode": "acm",
    "ServiceName": "AWS Certificate Manager (ACM)"
  }
]

特定サービスのクォータ一覧を取得(例: Lambda)

aws service-quotas list-service-quotas --service-code lambda --query Quotas
出力例
[
    {
        "ServiceCode": "lambda",
        "ServiceName": "AWS Lambda",
        "QuotaArn": "arn:aws:servicequotas:ap-northeast-1:XXXXXXXXXXXX:lambda/L-77C8EE9D",
        "QuotaCode": "L-77C8EE9D",
        "QuotaName": "Processes and threads",
        "Value": 1024.0,
        "Unit": "None",
        "Adjustable": false,
        "GlobalQuota": false,
        "QuotaAppliedAtLevel": "ACCOUNT"
    },
    {
        "ServiceCode": "lambda",
        "ServiceName": "AWS Lambda",
        "QuotaArn": "arn:aws:servicequotas:ap-northeast-1:XXXXXXXXXXXX:lambda/L-B99A9384",
        "QuotaCode": "L-B99A9384",
        "QuotaName": "Concurrent executions",
        "Value": 400.0,
        "Unit": "Count",
        "Adjustable": true,
        "GlobalQuota": false,
        "UsageMetric": {
            "MetricNamespace": "AWS/Lambda",
            "MetricName": "ConcurrentExecutions",
            "MetricDimensions": {},
            "MetricStatisticRecommendation": "Maximum"
        },
        "QuotaAppliedAtLevel": "ACCOUNT"
    }
]

なお各クォータに関する公式ドキュメントは以下です。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-service-information.html

2.基本的な書き方

以下はConcurrent executions(Lambda関数の同時実行数)を1100に上げる例です。

main.tf
resource "aws_servicequotas_service_quota" "lambda_concurrent_executions" {
  quota_code   = "L-B99A9384"
  service_code = "lambda"
  value        = 1100
}

ただ個人的には quota_code にコードを直書きしてしまうと何のクォータなのか分かりづらいので、
以下のように dataリソース 経由で quota_code を参照してあげると後々見た人が判断しやすくていいと思います。

main.tf
data "aws_servicequotas_service" "lambda" {
  service_name = "AWS Lambda"
}

data "aws_servicequotas_service_quota" "lambda_concurrent_executions" {
  quota_name   = "Concurrent executions"
  service_code = data.aws_servicequotas_service.this.service_code
}

resource "aws_servicequotas_service_quota" "lambda_concurrent_executions" {
  quota_code   = data.aws_servicequotas_service_quota.this.quota_code
  service_code = data.aws_servicequotas_service.this.service_code
  value        = 1100
}

3.モジュールでの実装例

実際の運用では、複数のクォータをまとめて管理したいことが多いでしょう。

以下はモジュール化して複数のクォータをまとめて設定する例です、
これにより新規環境(リージョン/アカウント)の立ち上げ時に、必要なクォータをまとめて申請できます。

モジュール側の実装は以下の通りです。

modules/service_quota/variables.tf
variable "service_name" {
  description = "AWSサービス名(例: AWS Lambda)"
  type        = string
}

variable "quota_name" {
  description = "クォータ名(例: Concurrent executions)"
  type        = string
}

variable "value" {
  description = "設定したいクォータの値"
  type        = number
}
modules/service_quota/main.tf
data "aws_servicequotas_service" "this" {
  service_name = var.service_name
}

data "aws_servicequotas_service_quota" "this" {
  quota_name   = var.quota_name
  service_code = data.aws_servicequotas_service.this.service_code
}

resource "aws_servicequotas_service_quota" "this" {
  quota_code   = data.aws_servicequotas_service_quota.this.quota_code
  service_code = data.aws_servicequotas_service.this.service_code
  value        = var.value
}
modules/service_quota/outputs.tf
output "quota_arn" {
  description = "クォータのARN"
  value       = aws_servicequotas_service_quota.this.arn
}

output "quota_name" {
  description = "クォータ名"
  value       = aws_servicequotas_service_quota.this.quota_name
}

output "current_value" {
  description = "現在のクォータ値"
  value       = aws_servicequotas_service_quota.this.value
}

呼び出し側では以下のように使用します。

environments/dev/main.tf
locals {
  service_quotas = {
    lambda_concurrent_executions = {
      service_name = "AWS Lambda"
      quota_name   = "Concurrent executions"
      value        = 1100
    }
    vpcs_per_region = {
      service_name = "Amazon Virtual Private Cloud (Amazon VPC)"
      quota_name   = "VPCs per Region"
      value        = 10
    }
    rds_db_instances = {
      service_name = "Amazon Relational Database Service (Amazon RDS)"
      quota_name   = "DB instances"
      value        = 50
    }
  }
}

module "service_quotas" {
  for_each = local.service_quotas
  source   = "../../modules/service_quota"

  service_name = each.value.service_name
  quota_name   = each.value.quota_name
  value        = each.value.value
}

注意点

1. 承認までの時間

クォータの増加申請は、クォータの種類によって反映されるタイミングがまちまちです。
即時反映されるようなものもあれば、AWS側での承認プロセスがある場合、数時間~数日かかるものもあります。

また個別にサポートケースが自動生成されるものもあるので、そういったものは申請後に確認してみて下さい。

2. 調整不可能なクォータ

すべてのクォータが調整可能なわけではありません。
adjustable属性を確認してから申請することをおすすめします。

調整不可なクォータの例
{
    "ServiceCode": "lambda",
    "ServiceName": "AWS Lambda",
    "QuotaArn": "arn:aws:servicequotas:ap-northeast-1:XXXXXXXXXXXX:lambda/L-77C8EE9D",
    "QuotaCode": "L-77C8EE9D",
    "QuotaName": "Processes and threads",
    "Value": 1024.0,
    "Unit": "None",
    "Adjustable": false,
    "GlobalQuota": false,
    "QuotaAppliedAtLevel": "ACCOUNT"
}

さいごに

以上、TerraformでService Quotasを管理する方法でした。

クォータもコードで管理することで、より効率的なインフラ管理を実現できます。
特に新規環境(リージョン/アカウント)作成時など、セットアップの際に効果を実感できるかと思います。

ぜひ皆さんも Terraform で Service Quotas を管理してみて下さい。

この記事をシェアする

FacebookHatena blogX

関連記事