ecspressoでデプロイ等(register/run/deploy/rollback)を行う際のIAMポリシー例

2021/06/29に公開
5

GitHub ActionsやCircle CIなどのCI/CD環境でecspressoを使ってECSにデプロイ(ecspresso register/run/deploy)を行う際のAWS IAMポリシーのサンプルです。

  • ここに記載するポリシーは、タスク実行ロールやタスクロールのポリシーではありません。
  • ecspressoの全てのコマンドをフォローしていません。例えばecspresso execは実行できません。コンテナの中に入って自由にコマンドを打てるecspresso execを実行可能な権限を、CI/CD環境に預けるユースケースを想定していないため。

環境

ecspresso 2.0.2

ポリシー例

{
  "Version" : "2012-10-17",
  "Statement" : [
    {
      "Sid" : "RegisterTaskDefinition",
      "Effect" : "Allow",
      "Action" : [
        "ecs:RegisterTaskDefinition",
        "ecs:ListTaskDefinitions",
        "ecs:DescribeTaskDefinition"
      ],
      "Resource" : "*"
    },
    {
      "Sid" : "PassRolesInTaskDefinition",
      "Effect" : "Allow",
      "Action" : [
        "iam:PassRole"
      ],
      "Resource" : [
        "arn:aws:iam::<aws_account_id>:role/<task_definition_task_role_name>",
        "arn:aws:iam::<aws_account_id>:role/<task_definition_task_execution_role_name>"
      ]
    },
    {
      "Sid" : "DeployService",
      "Effect" : "Allow",
      "Action" : [
        "ecs:UpdateService",
        "ecs:DescribeServices"
      ],
      "Resource" : [
        "arn:aws:ecs:<region>:<aws_account_id>:service/<cluster_name>/<service_name>"
      ]
    },
    {
      "Sid" : "RunAndWaitTask",
      "Effect" : "Allow",
      "Action" : [
        "ecs:RunTask",
        "ecs:DescribeTasks"
      ],
      "Condition": {
        "ArnEquals": {
          "ecs:cluster": "arn:aws:ecs:<region>:cluster:cluster/<cluster_name>"
        }
      },
      "Resource" : [
        "arn:aws:ecs:<region>:<aws_account_id>:task-definition/<task_family>:*",
        "arn:aws:ecs:<region>:<aws_account_id>:task/*"
      ]
    },
    {
      "Sid" : "HandleApplicationAutoScaling",
      "Effect" : "Allow",
      "Action" : [
        "application-autoscaling:Describe*"
      ],
      "Resource" : [
        "arn:aws:application-autoscaling:<region>:<aws_account_id>:*"
      ]
    },
    {
      "Sid" : "GetLogEvents",
      "Effect" : "Allow",
      "Action" : [
        "logs:GetLogEvents"
      ],
      "Resource" : [
        "arn:aws:logs:<region>:<aws_account_id>:<log_group_name>:*"
      ]
    },
    {
      "Sid" : "ForEcspressoRollback",
      "Effect" : "Allow",
      "Action" : [
        "ecs:DeregisterTaskDefinition"
      ],
      "Resource" : [
        "*"
      ]
    },
    {
      "Sid" : "GetTerraformTfstate",
      "Effect" : "Allow",
      "Action" : [
        "s3:GetObject"
      ],
      "Resource" : "arn:aws:s3:::<bucket_name>/<key_name>"
    },
  ]
}

解説

ecspresso deploy / register / run

    {
      "Sid" : "RegisterTaskDefinition",
      "Effect" : "Allow",
      "Action" : [
        "ecs:RegisterTaskDefinition",
        "ecs:ListTaskDefinitions",
        "ecs:DescribeTaskDefinition"
      ],
      "Resource" : "*"
    },

ecs:ListTaskDefinitionsとecs:DescribeTaskDefinitionsは、ecspresso registerやrunを行う場合は必要となってきます。ecspresso deployだけであれば不要です。

なお、Resourceが"*"となっていますが、TaskDefinition関連のIAMポリシーは、リソースレベルのアクセス権限をサポートしていないので、このようになっています。

ecspresso run

    {
      "Sid" : "RunAndWaitTask",
      "Effect" : "Allow",
      "Action" : [
        "ecs:RunTask",
        "ecs:DescribeTasks"
      ],
      "Condition": {
        "ArnEquals": {
          "ecs:cluster": "arn:aws:ecs:<region>:cluster:cluster/<cluster_name>"
        }
      },
      "Resource" : [
        "arn:aws:ecs:<region>:<aws_account_id>:task-definition/<task_family>:*",
        "arn:aws:ecs:<region>:<aws_account_id>:task/*"
      ]
    },

ecs:RunTaskは、ecspresso runを行う場合は必要です。

ecs:DescribeTasksは、ecspresso runでタスクの終了を待つ(--no-waitオプションを付けない)場合は必要です。

Conditionを使っていますが、 ecspresso runで起動するタスクのクラスターを限定したい場合はこのように記述できます。

    {
      "Sid" : "GetLogEvents",
      "Effect" : "Allow",
      "Action" : [
        "logs:GetLogEvents"
      ],
      "Resource" : [
        "arn:aws:logs:<region>:<aws_account_id>:<log_group_name>:*"
      ]
    },

ecspresso runで、--watch-containerオプションに指定したコンテナのログ(CloudWatch Logs)を表示したい場合は必要です。表示不要であれば、指定しなくても構いません。

Auto Scaling関連

    {
      "Sid" : "HandleApplicationAutoScaling",
      "Effect" : "Allow",
      "Action" : [
        "application-autoscaling:Describe*"
      ],
      "Resource" : [
        "arn:aws:application-autoscaling:<region>:<aws_account_id>:*"
      ]
    },

ecspressoは実行ログに以下のようなAuto Scaling関連の情報を出力しようとするのですが、それを行うためにはapplication-autoscaling:Describe*が必要です。

AutoScaling:
  Capacity min:2 max:5
  Suspended in:false out:false scheduled:false
  Policy name:example-target-tracking-cpu type:TargetTrackingScaling

このポリシーが無いと以下のようなWARNINGが出ます。

[WARNING] failed to describe scalable targets: operation error Application Auto Scaling: DescribeScalableTargets

ecspresso rollback

    {
      "Sid" : "ForEcspressoRollback",
      "Effect" : "Allow",
      "Action" : [
        "ecs:DeregisterTaskDefinition"
      ],
      "Resource" : [
        "*"
      ]
    },

ecspresso rollbackでは最新のタスク定義のリビジョンが登録解除されるので、ecs:DeregisterTaskDefinitionが必要です。

Resourceが"*"となっていますが、TaskDefinition関連のIAMポリシーは、リソースレベルのアクセス権限をサポートしていないので、このようになっています。

tfstate

    {
      "Sid" : "GetTerraformTfstate",
      "Effect" : "Allow",
      "Action" : [
        "s3:GetObject"
      ],
      "Resource" : "arn:aws:s3:::<bucket_name>/<key_name>"
    },

ecspressoで、Terraformのtfstate(S3管理)を参照する場合は必要です。

参考

スマートラウンド テックブログ

Discussion

sogaohsogaoh

Fargateにデプロイするには足りない気がしました。ecspresso exec ができないような。
( https://twitter.com/sogaoh/status/1412229792640868352 )

Takashi YamaharaTakashi Yamahara

この記事ではGitHub ActionsなどのCI/CD環境でecspresso register/run/deployを行うためのポリシーとして記載しました!

ecspresso execは人間がローカル等で実行するものかなと思うので、そのための権限はこの記事では取り扱ってません。

(なお、ecs/ecspresso execにあたり、ECS側のタスクロールにssm関連の権限が必要なことは認識してます)

sogaohsogaoh

なるほど。deploy時に secret を利用する場合には ssm 周りの権限が必要そうな気はしますが記事の意図としては承知しました。

Takashi YamaharaTakashi Yamahara

その場合はecspresso側ではなく、ECS側のタスク実行ロールに権限が必要だと思います。