3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS ECS Exec と Exec Checker を使ってみた

Last updated at Posted at 2021-08-01

Exec Checker で Exec 環境をチェックする

jq コマンドをインストールしておきます。実行方法は、以下の通りです。

sh check-ecs-exec.sh <container name> <task id>

リポジトリは以下になります。

こちらのチェッカーはユーザーガイドに記載されています。

Amazon ECS Exec Checker を使用した確認

Amazon ECS Exec Checker スクリプトにより、Amazon ECS クラスターとタスクが ECS Exec 機能を使用するための前提条件を満たしていることを確認および検証できます。このツールを使用するには、AWS CLI の最新バージョンが必要であり、jq が使用可能であることが必要です。詳細については、GitHub の Amazon ECS Exec Checker を参照してください。

  • AWS CLI のバージョンが古い場合

ECS Exec requires the AWS CLI v1.19.28/v2.1.30 or later. と表示されています。

$ sh check-ecs-exec.sh exec-demo 9ef2e3c658e84a65a5c71c1d06b0a892
-------------------------------------------------------------
Prerequisites for check-ecs-exec.sh v0.6
-------------------------------------------------------------
  jq      | OK (/usr/bin/jq)
  AWS CLI | OK (/usr/bin/aws)

-------------------------------------------------------------
Prerequisites for the AWS CLI to use ECS Exec
-------------------------------------------------------------
Pre-flight check failed: ECS Exec requires the AWS CLI v1.19.28/v2.1.30 or later.
Please update the AWS CLI and try again?
  For v2: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
  For v1: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html
  • Session Manager Plugin がインストールされていない場合

Session Manager Plugin | Missing と表示されています。

$ sh check-ecs-exec.sh exec-demo 9ef2e3c658e84a65a5c71c1d06b0a892
-------------------------------------------------------------
Prerequisites for check-ecs-exec.sh v0.6
-------------------------------------------------------------
  jq      | OK (/usr/bin/jq)
  AWS CLI | OK (/usr/bin/aws)

-------------------------------------------------------------
Prerequisites for the AWS CLI to use ECS Exec
-------------------------------------------------------------
  AWS CLI Version        | OK (aws-cli/2.2.25 Python/3.8.8 Linux/4.14.238-182.422.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off)
  Session Manager Plugin | Missing
  • "enableExecuteCommand": false の場合

Exec Enabled for Task | NO と表示されています。CLI 実行時に --enable-execute-command が必要です。

sh check-ecs-exec.sh exec-demo addfe8f3365c4782879da1bc34864799
-------------------------------------------------------------
Prerequisites for check-ecs-exec.sh v0.6
-------------------------------------------------------------
  jq      | OK (/usr/bin/jq)
  AWS CLI | OK (/usr/bin/aws)

-------------------------------------------------------------
Prerequisites for the AWS CLI to use ECS Exec
-------------------------------------------------------------
  AWS CLI Version        | OK (aws-cli/2.2.25 Python/3.8.8 Linux/4.14.238-182.422.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off)
  Session Manager Plugin | OK (1.2.234.0)

-------------------------------------------------------------
Checks on ECS task and other resources
-------------------------------------------------------------
Region : ap-northeast-1
Cluster: exec-demo
Task   : addfe8f3365c4782879da1bc34864799
-------------------------------------------------------------
  Cluster Configuration  | Audit Logging Not Configured
  Can I ExecuteCommand?  | arn:aws:iam::123456789012:role/EC2Role
     ecs:ExecuteCommand: allowed
     ssm:StartSession denied?: implicitDeny
  Task Status            | RUNNING
  Launch Type            | Fargate
  Platform Version       | 1.4.0
  Exec Enabled for Task  | NO

以下は出力の一部を取り出したものですが、Exec に必要な権限がタスクロールに割り当てられているかどうかを検証し、その結果を出力しています。

  Task Role Permissions  | arn:aws:iam::123456789012:role/ExecRole
     ssmmessages:CreateControlChannel: allowed
     ssmmessages:CreateDataChannel: allowed
     ssmmessages:OpenControlChannel: allowed
     ssmmessages:OpenDataChannel: implicitDeny

このチェッカーを使用するために必要な iam:SimulatePrincipalPolicy という権限がないメッセージが表示されています。

$ sh check-ecs-exec.sh exec-demo 9ef2e3c658e84a65a5c71c1d06b0a892
-------------------------------------------------------------
Prerequisites for check-ecs-exec.sh v0.6
-------------------------------------------------------------
  jq      | OK (/usr/bin/jq)
  AWS CLI | OK (/usr/bin/aws)

-------------------------------------------------------------
Prerequisites for the AWS CLI to use ECS Exec
-------------------------------------------------------------
  AWS CLI Version        | OK (aws-cli/2.2.25 Python/3.8.8 Linux/4.14.238-182.422.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off)
  Session Manager Plugin | Missing

-------------------------------------------------------------
Checks on ECS task and other resources
-------------------------------------------------------------
Region : ap-northeast-1
Cluster: exec-demo
Task   : 9ef2e3c658e84a65a5c71c1d06b0a892
-------------------------------------------------------------
  Cluster Configuration  | Audit Logging Not Configured
  Can I ExecuteCommand?  | arn:aws:iam::123456789012:role/EC2Role

An error occurred (AccessDenied) when calling the SimulatePrincipalPolicy operation: User: arn:aws:sts::123456789012:assumed-role/EC2Role/i-0427baf184543ab0e is not authorized to perform: iam:SimulatePrincipalPolicy on resource: arn:aws:iam::123456789012:role/EC2Role

スクリプトにも記載されていますが、checker に必要な権限は以下の通りです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetInstanceProfile",
                "iam:SimulatePrincipalPolicy",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcEndpoints",
                "ecs:DescribeClusters",
                "ecs:DescribeContainerInstances",
                "ecs:DescribeTaskDefinition",
                "ecs:DescribeTasks"
            ],
            "Resource": "*"
        }
    ]
}

Exec の使用

必要なことは次の 4 点です。

  • AWS CLI v1.19.28/v2.1.30 のインストール
  • Session Manager Plugin のインストール
  • タスクロールに Exec に必要な権限を設定する
  • タスク実行時に --enable-execute-command を渡す

AWS CLI の v2 の最新版をインストールします。

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install -i /usr/local/aws-cli -b /usr/bin
aws --version

aws-cli/2.2.25v2.1.30 以降のバージョンであるメッセージを確認します。

aws-cli/2.2.25 Python/3.8.8 Linux/4.14.238-182.422.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

Session Manager Plugin をインストールします。

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
sudo yum install -y session-manager-plugin.rpm
session-manager-plugin

以下のメッセージを確認します。

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

タスクロールに以下のポリシーをアタッチします。

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

--enable-execute-command をオプションで指定してタスクを実行します。

aws ecs run-task \
  --launch-type FARGATE \
  --cluster exec-demo \
  --task-definition exec-demo \
  --network-configuration awsvpcConfiguration="{subnets=[subnet-xxxxxx],securityGroups=[sg-yyyyyy],assignPublicIp=ENABLED}" \
  --enable-execute-command

上記のコマンドを実行すると、JSON フォーマットが出力されますので、taskArn というキーを見つけます。c61f0147d08749b3842888fa40980807 が ID です。

"taskArn": "arn:aws:ecs:ap-northeast-1:123456789012:task/exec-demo/c61f0147d08749b3842888fa40980807"

以下を実行します。

aws ecs execute-command \
  --cluster exec-demo \
  --task c61f0147d08749b3842888fa40980807 \
  --container exec-demo \
  --interactive \
  --command "/bin/bash"

成功すると以下のメッセージが表示され、コンテナに入ることができます。

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-0f50e6127b6507aea

コンテナ内部でアプリケーションにアクセスしてみます。

root@ip-172-31-19-245:/usr/src/app# curl -i localhost:8080
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 11
ETag: W/"b-Ck1VqNd45QIvq3AZd8XYQLvEhtA"
Date: Sun, 01 Aug 2021 01:40:41 GMT
Connection: keep-alive
Keep-Alive: timeout=5

Hello World

参考記事

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?