SMARTCAMP Engineer Blog

スマートキャンプ株式会社(SMARTCAMP Co., Ltd.)のエンジニアブログです。業務で取り入れた新しい技術や試行錯誤を知見として共有していきます。

待望!Amazon ECSのコンテナにログインできるAmazon ECS Execを試してみた

スマートキャンプ、エンジニアの入山です。

前回のブログにも書きましたが、弊社では昨年末から既存のEC2からECS/Fargateへのインフラ移行作業を実施しています。 EC2からECSへ移行する上では、特に運用面が大きく変わります。利便性やメンバーへの教育コストを考慮すると、今までEC2でやっていた運用をECSでどう上手く代替するかが力の入れ所だと思います。

一ヶ月前に弊社インターンの関口が書いた以下の記事も、既存運用の置き換えやデバッグ時の利便性向上を目的とした手段の1つで、この記事を執筆した時点ではECS/Fargate上のコンテナに対するAWS公式のログイン手段はありませんでした。

tech.smartcamp.co.jp

弊社のECS移行も稼働直前の佳境を迎えている最中ですが、この度Amazon ECS Execがリリースされ、待ち望んでいたECS/Fargate上のコンテナに対するAWS公式のログイン手段がついに実現したので、早速試してみたいと思います!

概要

Amazon ECS Execは、Amazon ECSで稼働するコンテナへのログインを実現する機能です。

これまでECS上で稼働するコンテナへログインする手段として以下の方法がありましたが、公式に直接コンテナへログインができるようになります。

  • ECS on EC2
    • EC2インスタンスにSSH or SSMでログインしてdockerコマンドで直接ログイン
  • ECS on Fargate
    • 手段なし
    • (セッションマネージャーを用いることでログインできるが非公式)

ECS Execは、AWS Systems Managerのセッションマネージャーを利用して、SSMエージェント経由でクライアントからコンテナへのアクセスを実現しています。

コンテナの中にSSMエージェントが動作している必要はありますが、エージェント経由のためSSHのポート開放などは必要なく、シンプルかつ安全にコンテナへログインすることが可能です。

詳細については、以下の記事を参照してください。今回の記事の内容も以下の情報を元に実施しました。

NEW – Using Amazon ECS Exec to access your containers on AWS Fargate and Amazon EC2 | Containers

Using Amazon ECS Exec for debugging - Amazon Elastic Container Service

前提条件

Amazon ECS Execを利用するためには、対応したバージョンのECS基盤・AWS CLIを利用する必要があります。

  • ECS on EC2
    • コンテナエージェントバージョン: 1.50.2以降
  • ECS on Fargte
    • プラットフォームバージョン: 1.4.0以降
  • AWS CLI
    • AWS CLI v1: 1.19.28以降
    • AWS CLI v2: 未対応(2021/3/16時点、今後数週間でリリース予定)

AWS CLIは現時点でv1にしか対応していないので、注意が必要です。(私も普段はv2を使っていますが、今回利用するために追加でv1をインストールしました。)

また、AWS CLIのSession Managerプラグインもインストールが必要です。以下の手順に従って、インストールしておきます。

(オプション) AWS CLI 用の Session Manager plugin をインストールする - AWS Systems Manager

Amazon ECS Execの利用手順

ECSタスクロールの作成

ECS ExecではSSMの機能を利用するため、ECSタスクロールにSSMに関連する権限を付与する必要があります。

ECSタスクロールを作成し、以下のIAMポリシーをアタッチします。既存のタスクロールへのアタッチでも大丈夫です。

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

作成したECSタスクロールを設定したECSタスク定義の作成

ECSタスク定義のタスクロールに前項で作成したECSタスクロールを設定します。ECSタスク定義の作成手順については割愛します。

f:id:mt_iri:20210317142158p:plain

enableExecuteCommandオプションを有効化したタスクの起動

ECS Execの機能は、サービスやタスク単位での有効化が必要で、enableExecuteCommandオプションで設定します。

2021/3/16時点では、AWSマネジメントコンソールから設定や確認を行う方法は提供されておらず、以下のAWS CLIコマンドでのみ利用可能なようです。

  • create-service
  • update-service
  • start-task
  • run-task

なお、enableExecuteCommandオプションが有効化された状態で起動したタスクでのみ利用可能であり、既存のタスクには適用できないため注意が必要です。(update-serviceの場合は、タスクの再デプロイが必要)

今回は、run-taskコマンドによるFargateのタスク起動にenableExecuteCommandオプションを追加して試してみます。

$ aws ecs run-task \
    --cluster test-cluster \
    --task-definition test-task \
    --count 1 \
    --enable-execute-command \
    --launch-type FARGATE \
    --network-configuration 'awsvpcConfiguration={subnets=["subnet-xxxxxxxxxxxx"],securityGroups=["sg-xxxxxxxxxxxx"],assignPublicIp="DISABLED"}'

タスク起動に成功すると以下のようなレスポンスが返ってきます。enableExecuteCommandtrueとなっていれば成功です。

{
    "tasks": [
        {
            "platformVersion": "1.4.0",
            "taskArn": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxx:task/test-cluster/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "launchType": "FARGATE",
                     :
                     :
            "enableExecuteCommand": true,
        }
    ]
}

ECS Execでコンテナへログイン

コンテナへのログインには、aws ecs execute-commandコマンドを利用します。

SSMセッションマネージャーはAWSマネジメントコンソールからブラウザ上での操作も可能ですが、現時点でECS Execは未対応でAWS CLIからのみの操作となります。

コマンド実行の対象とするタスクやコンテナの情報を指定した上で、--commandに実行したいコマンドを記述します。今回はコンテナにログインして操作することを目標としているため、/bin/shを指定します。

なお、--interactiveオプションは必須となっています。

$ aws ecs execute-command \
    --cluster test-cluster \
    --task xxxxxxxxxxxxxxxxxxxxxxx \
    --container app \
    --interactive \
    --command "/bin/sh"

コマンドを実行するとセッションが開始され、コンテナにログインされた状態となります。exitコマンドでシェルとセッションが終了されます。

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

Starting session with SessionId: ecs-execute-command-xxxxxxxxxxx
#
# whoami
root
#
# exit

Exiting session with sessionId: ecs-execute-command-xxxxxxxxxxx.

せっかくなのでログインユーザーも確認してみた所、rootユーザーとなっていました。

冒頭で紹介した前回記事の方法だと、ssm-agentユーザーでのログインだったため権限に一手間かかっていたのですが、デフォルトがrootとなっているのでそういった手間も不要そうです。

おわりに

今回は、Amazon ECSのコンテナにログインが可能となるAmazon ECS Execをご紹介しました!

以前からECSコンテナにログインする手段をリリースする旨の発言はあったものの、いつ出るんだろう?と首を長くして待っていた方も多いと思います。

ECSやFargateへの移行におけるハードルや不安要素の1つとなっていたコンテナへのログインが正式にサポートされたことで、世の中のコンテナ化がまた一歩進みそうな気がします。リリース当初の現時点では制約や未対応の部分も多いですが、監査ログやアクセス制御などにも対応しており、今後のアップデートに期待大です!

なお、以前紹介したAWS CopilotもECS Execに対応しているようです。こちらもぜひ試してみてください!

tech.smartcamp.co.jp