【ECS】Fargateで起動するECSコンテナに接続してみる

どもども、引越し先が決まりそうで安堵している僕です。


みなさん、ECS使っていますでしょうか。特にFargateを使用したコンテナ運用はサーバの管理を気にする必要がなく、アプリ開発に集中できるので魅力的ですね!


そんな便利サービスFargateですが、これまでその欠点として諦められることが多かった点としてコンテナに直接することができないという側面がありました。これはインフラ部分をマネージドに管理してもらうためのトレードオフとも言えそうです。


そんなFargateで稼働するコンテナですが、なんとECS Execという機能を利用して直接接続できるようになったというではありませんか!


これはなかなか革命的です!早速試してみましょう!


接続するECSコンテナは皆様それぞれで用意していただいてもいいですし、ECRを使用することなくパブリックリポジトリのイメージから起動する記事も作成していますので、検証環境の作成にご活用ください!

※ECS Execを使用するにはFargateのプラットフォームバージョン「1.4.0」以降でなければなりません。既存のものを使用する場合はプラットフォームバージョンのアップデートかECSサービスの更新が必要な点にご注意ください。

【ECS&Fargate】AWSでさくっとコンテナ体験!


また、コンテナへの接続はAWS CLIを使用しますので、インストールと初期設定を済ませておいてください!(この記事ではこちらの手順は省略させていただきます)


また、本記事はクラスメソッドさんの下記記事を参考に作成しております。ぜひこちらも参照していただくことをお勧めします。

[アップデート] 実行中のコンテナに乗り込んでコマンドを実行できる「ECS Exec」が公開されました

下準備

タスク定義、クラスター、サービス、タスク等必要な物が揃っている前提で残りの準備を説明していきます。


まずはタスクロールとして指定されているIAMロールに以下の権限を持つポリシーを付与します。コンテナへの接続はSSMセッションマネージャーを使用するため、必要な権限を付与しています。

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

ポリシーを作成したら該当IAMロールにアタッチしておいてください。


次に、ECSサービス、タスクにおいてenableExecuteCommandを有効にします。ECSサービス単位の設定になる点にご注意ください。


また、こちらの有効化は現在AWS CLIでしか行うことができないのでここからはターミナル等での作業となります。


まずは対象サービスのenableExecuteCommandが有効化されているかどうかを確認してみます。

aws ecs describe-services \
    --cluster クラスター名 \
    --services サービス名 | grep 'Exec'

"enableExecuteCommand": false

デフォルトでは無効化されていることがわかります。


ここで期待した結果が返ってこない場合はAWS CLIのバージョンが古いことが原因と考えられます。アップデートしてみてください。

sudo pip install --upgrade awscli
ターミナルを開き直す

上記はMac OSの場合です。


次にenableExecuteCommandを有効化します。

aws ecs update-service \
    --cluster クラスター名 \
    --service サービス名 \
    --enable-execute-command

同じように確認すると値がfalseからtrueに変化していることがわかりますね!


それではタスクの方もenableExecuteCommandも有効化されているか確認してみましょう。

aws ecs describe-tasks \
    --cluster クラスター名 \
    --tasks タスク名 | grep 'Exec'

"enableExecuteCommand": false,

おっとfalseですね!というのもサービスのenableExecuteCommandが有効化された後に作成されたタスクしか有効化されないためです。


このままでは接続することができないのでサービスを"強制的にタスクの起動"にチェックを入れた上で更新してみましょう。新しく作成されたタスクを対象に確認してみると値がtrueになっていることが確認できるかと思います。


これで一通りの準備が完了しました!

接続してみる

それでは実際に接続してみましょう。下記コマンドを実行してみてください。

aws ecs execute-command \
    --cluster クラスター名 \
    --task タスク名 \
    --container コンテナ名 \
    --interactive 

これまでの設定が正しく行われていれば、コンテナ内部に接続できるはずです!!


プロンプトの表示が変わったら、lsなどコマンドを入力してみましょう。Fargateで起動されるコンテナの内部を覗くことができてとても新鮮な気持ちになります。

まとめ

本日はFargateで起動しているコンテナに接続してみたの回でした!


いやあ、ついにこの時がきたかとしみじみ思います。自分がFargateを触り始めた時は想像もしていませんでした。


とはいえコンテナなので内部構造の変更はイメージで行い、デバックや状況確認で使用するようにしましょう。


検証環境を作成された場合は、リソースのお片付け(削除)を忘れずに!


最後まで読んでいただきありがとうございました!


本日のお勧め

AWS,Docker

Posted by CY