SCPでECS Fargateタスク定義のCPU・メモリ上限を制限してみた

SCPでECS Fargateタスク定義のCPU・メモリ上限を制限してみた

2025年2月に追加されたAmazon ECSのIAM条件キー `ecs:task-cpu` / `ecs:task-memory` を使い、SCPでFargateタスク定義登録時のCPU・メモリ指定を制限できるか検証しました。しきい値以下・超過・境界値を含む6パターンで動作を確認しています。
2026.06.10

はじめに

2024年11月、AWS FargateのvCPUとメモリの上限が拡張され、最大16 vCPU / 120 GiBのタスクを起動できるようになりました(料金表)。

大きなスペックを利用できるようになった一方で、意図しない高スペックなタスク定義の登録は、AWS利用費の増加につながる可能性があります。必要に応じてSCPでCPU・メモリの上限を制限しておくことで、タスク定義の新規登録時点で予防的に制御できます。

2025年2月にはAmazon ECSへ8つの新しいIAM条件キーが追加されました。

https://dev.classmethod.jp/articles/amazon-ecs-iam-condition-keys-update-2025/

今回、このうち 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で実行するケースは、今回の制限対象外である点にご留意ください。

参考

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事