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

4 min read 5

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

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

環境

ecspresso 1.5.3

ポリシー例

{
  "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" : "GetLogEvents",
      "Effect" : "Allow",
      "Action" : [
        "logs:GetLogEvents"
      ],
      "Resource" : [
        "arn:aws:logs:<region>:<aws_account_id>:<log_group_name>:*"
      ]
    },
    {
      "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)を表示したい場合は必要です。表示不要であれば、指定しなくても構いません。

tfstate

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

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

ecspressoを使ったCDパイプラインでは同時にECR等へのイメージのpushも行うかと思いますが、上記のポリシーにはその権限は含まれていません。権限緩めのAWS管理ポリシーでも構わなければ、上記のポリシーの他にAmazonEC2ContainerRegistryPowerUserなどをロールに追加でアタッチしてください。

参考

Discussion

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

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

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

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

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

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

ログインするとコメントできます