[アップデート]Amazon ECSに8つの新しいIAM条件キーが追加されました
お疲れさまです。とーちです。
Amazon ECSのIAM条件キーが追加されたというアップデートがありました。今回は新しく追加された8つの条件キーについて、実際に試してみた内容を紹介します。
とりあえずまとめ
- Amazon ECSに8つの新しいIAM条件キーが追加されました
- 追加された条件キーを使うことで、例えばECSタスク定義やサービスの作成・更新時にタスクのCPU使用量に制限をかけることができるようになります
IAM条件キーとは
IAM条件キーについてはAWS公式ドキュメントに詳しく記載されていますが、ざっくり言うとIAMを使用したリクエスト元の情報を使ってアクセス許可をより細かく制御できる機能です。IPアドレス、時間帯、タグなどの条件に基づいてリソースへのアクセスを制限できます。
IAM条件キーには以下の2種類があります
- グローバル条件キー:すべてのAWSサービスで指定できる条件キー
- サービス固有の条件キー:サービスごとに決められた条件キー
今回は、ECSのサービス固有の条件キーが8つ追加された形です。
追加された条件キー一覧
追加された条件キーは以下の通りです
- ecs:task-cpu
- ecs:task-memory
- ecs:compute-compatibility
- ecs:privileged
- ecs:auto-assign-public-ip
- ecs:subnet
- ecs:propagate-tags
- ecs:enable-ecs-managed-tags
なお、公式ドキュメント上もちゃんと新しい条件キーが反映されています。
それでは、これらの条件キーを順番に見ていきましょう。
リソース構成関連の条件キー
ecs:task-cpu
タスクCPUの数値に制限を設けます。Conditionの値としてはNumeric(数値)を指定します。1024=1vCPUです。
この条件を指定できるアクションは以下の通りで、例えばRegisterTaskDefinition
のConditionとして指定した場合、条件を満たすvCPU量のタスク定義の作成のみが許可される形です。
- RegisterTaskDefinition:ECSタスク定義の登録
- CreateService:ECSサービスの作成
- UpdateService:ECSサービスの設定の更新
ecs:task-memory
タスクメモリの数値に制限を設けます。Conditionの値としてはNumeric(数値)を指定します。単位はMiBです。
この条件を指定できるアクションは以下の通りで、例えばRegisterTaskDefinition
のConditionとして指定した場合、条件を満たすメモリ量のタスク定義の作成のみが許可される形です。
- RegisterTaskDefinition:ECSタスク定義の登録
- CreateService:ECSサービスの作成
- UpdateService:ECSサービスの設定の更新
ecs:compute-compatibility
タスク定義の compatibilities
の値を制限します。マネージメントコンソールで言うと以下の起動タイプの箇所にあたる部分ですね。
Conditionの値としてはArrayOfString(文字列配列)を指定します。
この条件を指定できるアクションは以下の通りです
- RegisterTaskDefinition:ECSタスク定義の登録
コンテナ権限関連の条件キー
ecs:privileged
タスク定義の privileged
の値を制限します。この値はコンテナにホストインスタンスのrootと同じレベルの権限を与えるかどうかを指定するパラメータです。
Conditionの値としては String(文字列)を指定します。
この条件を指定できるアクションは以下の通りです
- RegisterTaskDefinition:ECSタスク定義の登録
ネットワーク構成関連の条件キー
ecs:auto-assign-public-ip
ネットワークモードとしてawsvpc
を指定している場合に、ECSサービス設定ではタスクのENIに対してパブリックIPを割当てるかどうかを指定できますが、その設定を制限するconditionになっています。
Conditionの値としては Bool(true or false)を指定します。
この条件を指定できるアクションは以下の通りです
- CreateService:ECSサービスの作成
- UpdateService:ECSサービスの設定の更新
ecs:subnet
ネットワークモードとしてawsvpc
を指定している場合に、ECSサービス設定でタスク(のENI)を配置するサブネットを指定できますが、その設定を制限するconditionになっています。
Conditionの値としては ArrayOfString(文字列配列)を指定します。
この条件を指定できるアクションは以下の通りです
- CreateService:ECSサービスの作成
- UpdateService:ECSサービスの設定の更新
タグ伝搬関連の条件キー
ECSサービスのタグ関連の設定を制限するためのconditionですね。マネージメントコンソールでいうと以下の箇所になります。
ecs:propagate-tags
ECSサービス設定ではサービスにより生成されるECSタスクに付与するタグをECSサービスやタスク定義につけたタグから伝搬させることができます。その設定を制限するconditionになっています。
Conditionの値としては String(文字列)を指定します。
この条件を指定できるアクションは以下の通りです
- CreateService:ECSサービスの作成
- UpdateService:ECSサービスの設定の更新
ecs:enable-ecs-managed-tags
ECSサービスの設定でECSマネージドタグを有効にするとクラスターとサービス名に対応する2つのタグを使用して、サービスにより生成されるECSタスクに自動的にタグを付けることが可能なのですが、その設定を制限するconditionになっています。
Conditionの値としては Bool(true or false)を指定します。
この条件を指定できるアクションは以下の通りです
- CreateService:ECSサービスの作成
- UpdateService:ECSサービスの設定の更新
実際に検証してみる
では、実際にecs:task-cpu
を使って作成できるECSタスクのCPU量に制限をかけてみましょう。
準備:IAMロールの作成
まず、以下のようなポリシーを持つIAMロールを作成しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"NotAction": [
"ecs:*"
],
"Resource": "*"
},
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ecs:Get*",
"ecs:List*",
"ecs:DescribeCapacityProviders",
"ecs:DescribeServiceDeployments",
"ecs:DescribeServiceRevisions",
"ecs:DescribeServices",
"ecs:DescribeTaskSets",
"ecs:DescribeContainerInstances",
"ecs:DescribeTasks",
"ecs:DescribeTaskDefinition",
"ecs:DescribeClusters"
],
"Resource": "*"
}
]
}
このポリシーでは、ECS関連の権限は読み取り関連の権限のみを付与しています。念のため、この状態でECSタスク定義が作成できないことを確認しました。
条件キーを使ったポリシーの追加
続いて、今回のアップデートで追加されたconditionを確かめるためのポリシーとして以下をIAMロールに追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ecs:CreateService",
"ecs:RegisterTaskDefinition"
],
"Resource": "*",
"Condition": {
"NumericLessThanEquals": {
"ecs:task-cpu": "1024"
}
}
}
]
}
想定通りであれば、1024以下の値(1vCPU以下)を指定した場合のみ、ECSタスク定義の登録やECSサービスの作成ができるはずです。
ちなみにIAMのポリシーエディタ上でもちゃんと今回追加された条件キーが表示されていました。
1vCPUのタスク定義の作成
まず1vCPUのタスク定義を作成してみます。
これは正常に作成できました。
2vCPUのタスク定義の作成
次に2vCPUのタスク定義を作成してみます。
想定どおりエラーになりました。
ECSサービスの作成
続いてサービス設定を試してみます。ちょうど2vCPUの設定がされたタスク定義があったので、このタスク定義を使ってECSサービスを作成してみます。
タスク定義として上記のものを指定してECSサービスを作ってみます。
すると以下のエラーが出ました。サービス作成時にもECSタスク定義のvCPU設定を見たうえで、許可・拒否を判定してくれるようですね。
おまけ
ECSサービスの作成に失敗したあと、再度同じ名前のECSサービスを作ろうとしたら、以下のエラーが出ました。ECSサービスってマネージメントコンソールから作る場合CloudFormationで作られてたんですね。いつもterraformで作ってたんで知りませんでした。
まとめ
今回は、Amazon ECSに追加された8つのIAM条件キーについて紹介しました。これらの条件キーを使うことで、以下のようなより細かい権限管理が可能になります
- タスクのCPUやメモリリソースに制限を設ける
- 特定の起動タイプのみを許可する
- 特権コンテナの使用を制限する
- ネットワーク設定(サブネットやパブリックIP割り当て)を制限する
- タグ関連の設定を制御する
これらの条件キーはもちろんSCPにも使えるので例えばSCPで開発環境で作成できるvCPUの最大値を指定したりするのは効果的かもしれないですね。
以上、とーちでした。