y-ohgi's blog

TODO: ここになにかかく

ECS Fargate でshell を起動する

TL;DR

やる

チュートリアルのとおりにやる。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html

タスク用IAMロール作成

SSM 経由でECS へコマンドを実行するため、その権限用のIAM ロールを作成。
名前は ecsTaskRole にし、Principalは "Service": "ecs-tasks.amazonaws.com"
インラインポリシーで以下を定義。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        }
    ]
}

タスク定義

タスク定義は既存のものをそのまま使用できる。
先程作成した ecsTaskRole を使用してnginx を起動するタスク定義のJSON を作成。
あと、 initProcessEnabled を有効化すると、コマンド実行後にプロセスがゾンビ化することを防ぐためにクリーンアップをしてくれる。

{
  "containerDefinitions": [
    {
      "image": "nginx",
      "name": "nginx",
      "essential": true,
      "portMappings": [
        {
          "hostPort": 80,
          "protocol": "tcp",
          "containerPort": 80
        }
      ],
      "linuxParameters": {
        "initProcessEnabled": true
      }
    }
  ],
  "memory": "512",
  "taskRoleArn": "arn:aws:iam::<YOUR ACCOUNT ID>:role/ecsTaskRole",
  "executionRoleArn": "arn:aws:iam::<YOUR ACCOUNT ID>:role/ecsTaskExecutionRole",
  "family": "tmp",
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "networkMode": "awsvpc",
  "cpu": "256"
}

aws コマンドからタスク定義を作成。

$ aws ecs register-task-definition --cli-input-json file://`pwd`/fargate-task.json

ECSサービスの作成

--enable-execute-command でコマンドが実行可能なタスクを作成できる。
ネットワークの設定はデフォルトVPCを使用。

$ aws ecs create-service \
  --cluster tmp \
  --service-name tmp \
  --task-definition tmp \
  --desired-count 1 \
  --launch-type "FARGATE" \
  --enable-execute-command \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxxx],securityGroups=[sg-xxxxxx],assignPublicIp=ENABLED}"

コマンドの実行

起動したタスクを指定して、 /bin/sh を実行。

$ aws ecs execute-command \
  --cluster tmp \
  --task 25e421430b30476aa64a1f73630e6c94 \
  --container nginx \
  --interactive \
  --command "/bin/sh"

gyazo.com

おわり