👾

ECS Execを使用してFargateコンテナにアクセスする方法

2023/09/27に公開

参考にさせていただきました🙇
https://yutaro-blog.net/2022/03/25/aws-ecs-exec/

IAMロールとポリシーの設定

AmazonECSTaskExecutionRolePolicyAmazonSSMManagedInstanceCoreのポリシーを使用しているロールにアタッチしてください。

AmazonSSMManagedInstanceCoreは、アクセス許可が対象の範囲が広いので、必要なアクセス権限のみの以下のポリシーを独自に作成してアタッチする方が望ましいです。

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

ECSサービスでECS Execを有効化する

下記コマンドを実行するとECSサービスでECS Execを有効化され、同時にECSサービスでECS Execを有効化されたサービスの仕様がJSON形式で出力されます。

aws ecs update-service --region <リージョン名> --cluster <クラスター名> --service <サービス名> --enable-execute-command

次に以下コマンドでサービスがECS Execが有効になっているかどうかを確認してください。

先ほどの出力されたJSONから探しても良いのですが、見づらいので、grepを使用して、enableExecuteCommandという文字列がコマンドの出力に含まれている行を検索します。

aws ecs describe-services --cluster <クラスター名> --service <サービス名> | grep enableExecuteCommand

以下が出力されれば、ECS Execを有効化されています。

"enableExecuteCommand": true

サービスの再起動

サービスの再起動により、新しい設定や構成が適用された新しいタスクが起動されます。これにより、ECS Execの有効化に関連する変更が新しいタスクに反映されます。

サービスを選択し、右上の更新を選択してください。

新しいデプロイの強制にチェックを入れて更新してください。

タスク名の確認

再起動後、ECSのコンソールからクラスター>タスクへと進み、タスクARNからタスク名を確認してください。
arn:aws:ecs:<リージョン名>:<アカウントID>:task/<クラスター名>/<タスク名>

以下のコマンドからタスク名を確認する方法。指定したサービスのタスク一覧を表示します。

aws ecs list-tasks --cluster <クラスター名> --service-name <サービス名>

以下のように表示されます。

{
    "taskArns": [
        "arn:aws:ecs:<リージョン名>:<アカウントID>:task/<クラスター名>/<タスク名>"
    ]
}

新しいタスクでECS Execが有効になっているかどうかを確認します。

aws ecs describe-tasks --cluster <クラスター名>  --tasks <タスク名> | grep enableExecuteCommand

以下が出力されれば、ECS Execを有効化されています。

"enableExecuteCommand": true

ECSコンテナにアクセスする

以下コマンドでECSコンテナにアクセスしてください。

aws ecs execute-command --cluster <クラスター名> --task <タスク名>  --container <コンテナ名> --interactive --command "/bin/bash"

アクセスに成功すると、以下のような表示がされます。

Starting session with SessionId: ecs-execute-command-{ランダムなセッションID}

rootは、ユーザー名になります。このプロンプトでは、現在のユーザーがrootユーザーであることを示しています。rootは通常、システム内で最高権限を持つユーザーです。

黒塗りの部分は、一意の識別子またはコンテナID。Dockerコンテナは一意のIDを持ち、このIDはコンテナを識別するために使用されます。他のコンテナと区別するためにランダムに生成された文字列です。

:/application#は、現在のディレクトリとシェルのプロンプト文字。この部分は、ユーザーがコマンドを入力する場所を示し、:/application は現在のディレクトリを示しています。

#は通常、rootユーザーが表示されることが多いプロンプト文字です。一般のユーザーの場合は$ がプロンプト文字として表示されることが一般的です。

プロンプトとは、シェル画面上でシステムが入力待ちの状態にあることを示すために表示される文字列のことです。

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion