SCPでECS Fargateタスク定義のCPU・メモリ上限を制限してみた
はじめに
2024年11月、AWS FargateのvCPUとメモリの上限が拡張され、最大16 vCPU / 120 GiBのタスクを起動できるようになりました(料金表)。
大きなスペックを利用できるようになった一方で、意図しない高スペックなタスク定義の登録は、AWS利用費の増加につながる可能性があります。必要に応じてSCPでCPU・メモリの上限を制限しておくことで、タスク定義の新規登録時点で予防的に制御できます。
2025年2月にはAmazon ECSへ8つの新しいIAM条件キーが追加されました。
今回、このうち ecs:task-cpu/ecs:task-memory を使い、SCPで高スペックなFargateタスク定義の登録を制限できるか検証しました。
やりたいこと
Organizations環境のメンバーアカウントで、以下の条件を超えるFargateタスク定義の登録をDenyするSCPを作成し、動作を確認します。
- CPU: 4096(4 vCPU)超 → Deny
- Memory: 8192(8 GiB)超 → Deny
※しきい値は検証用です。
SCPポリシー設計
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyLargeFargateCPU",
"Effect": "Deny",
"Action": "ecs:RegisterTaskDefinition",
"Resource": "*",
"Condition": {
"NumericGreaterThan": {
"ecs:task-cpu": "4096"
}
}
},
{
"Sid": "DenyLargeFargateMemory",
"Effect": "Deny",
"Action": "ecs:RegisterTaskDefinition",
"Resource": "*",
"Condition": {
"NumericGreaterThan": {
"ecs:task-memory": "8192"
}
}
}
]
}
設計上のポイント
- 対象アクションをRegisterTaskDefinitionに限定: ECSのタスク定義はイミュータブルであり、登録後にcpu/memoryを変更できません。変更には新リビジョンの登録が必要なため、このアクションの制限で高スペック構成の新規登録を抑制できます
- Fargateではタスクレベルのcpu/memoryが必須: RegisterTaskDefinition時に条件キーが必ず評価されるため、値未指定による回避は想定しにくい構造です
NumericGreaterThan: しきい値と一致する値は許可、超過のみDeny。リクエストコンテキストに条件キーが存在しない場合はマッチせず、このDeny文は作用しません- CPU/Memoryを独立したStatement: どちらか一方の超過でDeny
条件キーの仕様
| 条件キー | 型 | 単位 |
|---|---|---|
ecs:task-cpu |
Numeric | CPU units(1024 = 1 vCPU) |
ecs:task-memory |
Numeric | MiB(8192 = 8 GiB) |
検証環境
| 項目 | 値 |
|---|---|
| サービス | Amazon ECS (Fargate) |
| リージョン | ap-northeast-1 |
| 実行環境 | メンバーアカウント |
| SCPアタッチ先 | メンバーアカウントを含むOU |
検証結果
結果一覧
| テスト | cpu | memory | 結果 |
|---|---|---|---|
| ベースライン(SCP未適用) | 8192 | 16384 | ✅ 成功 |
| しきい値以下 | 1024 | 2048 | ✅ 許可 |
| CPU超過 | 8192 | 2048 | ❌ Deny |
| メモリ超過 | 1024 | 16384 | ❌ Deny |
| 両方超過 | 16384 | 32768 | ❌ Deny |
| 境界値 | 4096 | 8192 | ✅ 許可 |
SCPによる許可・Denyの観点では、すべて期待通りの結果になりました。なお、CPU超過・メモリ超過のテストケースはFargateとして有効なcpu/memoryの組み合わせではありません。SCPの条件評価がECSのパラメータ検証より先に行われ、Denyが返ることを確認する目的で実行しています。
ベースライン:SCP適用前
SCP適用前に、しきい値を超えるタスク定義が登録できることを確認しました。
aws ecs register-task-definition \
--family test-scp-over-threshold \
--network-mode awsvpc \
--requires-compatibilities FARGATE \
--cpu "8192" \
--memory "16384" \
--container-definitions '[{"name":"test","image":"nginx:latest","essential":true}]'
結果: 成功
SCP適用後
SCPをOUにアタッチした後、各パターンでRegisterTaskDefinitionを実行しました。以降のコマンドはベースラインと同じ形式で、--cpu と --memory のみ変更しています。
テスト1: しきい値以下(cpu:1024, memory:2048)→ ✅ 許可
aws ecs register-task-definition \
--family test-scp-small \
--network-mode awsvpc \
--requires-compatibilities FARGATE \
--cpu "1024" --memory "2048" \
--container-definitions '[{"name":"test","image":"nginx:latest","essential":true}]'
テスト2: CPU超過(cpu:8192, memory:2048)→ ❌ Deny
aws ecs register-task-definition \
--family test-scp-cpu-over \
--network-mode awsvpc \
--requires-compatibilities FARGATE \
--cpu "8192" --memory "2048" \
--container-definitions '[{"name":"test","image":"nginx:latest","essential":true}]'
AccessDeniedExceptionが返り、エラーメッセージからSCPの明示的Denyによる拒否であることと、対象のSCPポリシーARNを確認できました。
An error occurred (AccessDeniedException) when calling the RegisterTaskDefinition operation:
User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/ROLE_NAME/SESSION_NAME is not authorized to perform:
ecs:RegisterTaskDefinition on resource: arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task-definition/FAMILY_NAME:*
with an explicit deny in a service control policy:
arn:aws:organizations::XXXXXXXXXXXX:policy/o-XXXXXXXXXX/service_control_policy/p-XXXXXXXX
テスト3: メモリ超過(cpu:1024, memory:16384)→ ❌ Deny
CPU/Memoryは独立したStatementのため、メモリのみの超過でもDenyされました。
テスト4: 両方超過(cpu:16384, memory:32768)→ ❌ Deny
テスト5: 境界値(cpu:4096, memory:8192)→ ✅ 許可
しきい値と一致する値は NumericGreaterThan の条件を満たさないため、許可されました。
制限事項・注意点
RunTaskは制限されない
公式ドキュメントのActionsテーブルによると、RunTaskアクションで使用できる条件キーは以下の通りです。
- aws:RequestTag/${TagKey}
- aws:ResourceTag/${TagKey}
- aws:TagKeys
- ecs:capacity-provider
- ecs:cluster
- ecs:enable-ebs-volumes
- ecs:enable-execute-command
ecs:task-cpu/ecs:task-memory は含まれていないため、これらの条件キーによるSCPではRunTaskを制限できません。
まとめ
SCPで ecs:task-cpu/ecs:task-memory 条件キーを使い、高スペックなFargateタスク定義の登録を制限できることを確認しました。タスク定義登録時点で予防的に制限するアプローチとして活用できます。
一方で、ecs:task-cpu / ecs:task-memory 条件キーはRunTaskには対応していません。そのため、既存のタスク定義をRunTaskで実行するケースは、今回の制限対象外である点にご留意ください。





