TerraformでService Quotasを管理すると良さそう
はじめに
皆様こんにちは、あかいけです。
最近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"
}
]
なお各クォータに関する公式ドキュメントは以下です。
2.基本的な書き方
以下はConcurrent executions(Lambda関数の同時実行数)を1100に上げる例です。
resource "aws_servicequotas_service_quota" "lambda_concurrent_executions" {
quota_code = "L-B99A9384"
service_code = "lambda"
value = 1100
}
ただ個人的には quota_code にコードを直書きしてしまうと何のクォータなのか分かりづらいので、
以下のように dataリソース 経由で quota_code を参照してあげると後々見た人が判断しやすくていいと思います。
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.モジュールでの実装例
実際の運用では、複数のクォータをまとめて管理したいことが多いでしょう。
以下はモジュール化して複数のクォータをまとめて設定する例です、
これにより新規環境(リージョン/アカウント)の立ち上げ時に、必要なクォータをまとめて申請できます。
モジュール側の実装は以下の通りです。
variable "service_name" {
description = "AWSサービス名(例: AWS Lambda)"
type = string
}
variable "quota_name" {
description = "クォータ名(例: Concurrent executions)"
type = string
}
variable "value" {
description = "設定したいクォータの値"
type = number
}
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
}
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
}
呼び出し側では以下のように使用します。
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 を管理してみて下さい。







