【AWS】ECS ExecでFargateコンテナにアクセスする方法

Amazon ECSでデータプレーン(Dockerコンテナを稼働させるための環境)にFargateを使う場合に、ECS Execを使ってコンテナにアクセスする方法をまとめます。

例えばLaravelで開発したアプリケーションをECS+Fargateにデプロイした場合にマイグレーションやシーダーを実行する場合に、ECS Execコマンドでコンテナにアクセスし、php artisan migratephp artisan db:seedなどのコマンドを実行します。

目次

前提

AWS CLI(AWS コマンドラインインターフェース)がインストールされていることが必要です。

以下のコマンドを実行してインストール済みか確認ください。

which aws

# インストール済みの場合の出力結果
/usr/local/bin/aws

aws --version

# インストール済みの場合の出力結果(バージョンは違っていても問題ないです)
aws-cli/2.4.10 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off

未インストールの場合は、以下リンクから各OSのGUI Installerタブの内容を見ながらインストールしてください。

インストールが終わったら再度コマンドを実行して確認してください。

Session Manager プラグインのインストール

ECS ExecはAWS Systems Manager (SSM) の中のSession Manager(セッションマネージャー)の仕組みを使うことで、クライアントからECSコンテナにアクセスすることを実現している(とのことな)ので、Session Managerをインストールします。

Macの方向けの手順ですのでLinux、Windowsの方は適宜調べてインストールしてください。

以下リンク先に記載されている手順でインストールしていきます。

以下3つのコマンドを順番に実行します。

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

終わったら以下のコマンドでインストールできているかどうか確認します。

session-manager-plugin

# 以下の出力になればOK
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

ECSサービスのECS Exec有効化

以下のコマンドで特定のサービスでECS Execを使えるようにします。

aws ecs update-service --region ap-northeast-1 --cluster {クラスター名} --service {サービス名} --enable-execute-command

コマンドを実行すると、サービスの仕様(serviceArnserviceName等)がJSON形式?で出力されます。

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

aws ecs describe-services --cluster {クラスター名} --services {サービス名} | grep enableExecuteCommand

# 以下の出力になればOK
"enableExecuteCommand": true

ここまでできたらサービスの更新を行う必要がありますので、マネジメントコンソールで以下2つのどちらかを行います。

  • サービス更新画面で「新しいデプロイの強制」にチェックを入れて更新
  • タスク定義のリビジョンアップ → サービスを更新

起動中のタスクがECS Execが有効か確認

まず、特定サービスにタスク一覧表示します。

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

実行すると以下のような表示になるので、{ここにランダムの文字列のタスク名が表示される}のところに表示されるタスク名をコピーしておきます。

{
    "taskArns": [
        "arn:aws:ecs:ap-northeast-1:********:task/********/{ここにランダムの文字列のタスク名が表示される}"
    ]
}

次にECS Execが有効になっているかどうかを確認します。

aws ecs describe-tasks --cluster {クラスター名} --tasks {コピーしたタスク名} | grep enableExecuteCommand

# 以下の出力になればOK
"enableExecuteCommand": true

これでECS Execを使う準備は完了です。

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

以下コマンドでECSコンテナにアクセスします。

aws ecs execute-command --cluster {クラスター名} --task {コピーしたタスク名}  --container {コンテナ名} --interactive --command "/bin/bash"

# 以下の出力になればOK
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

Starting session with SessionId: ecs-execute-command-{ランダムな文字列}
root@ef13155aad7f4a729c7c052ce7ffcb04-1165615347:/app#
  • コンテナ名はタスク定義の更新画面から確認できます(以下画面のオレンジ矢印)。
  • アクセス時のコマンドは"/bin/bash"としていますがDocker imageのベースイメージのOSによって適宜変更してください。
  • 出力結果の最後のapp#はコンテナ内のプロジェクトルートをappディレクトリにしている場合なので、ご自身の設定によって異なります(何でも良いです)。

この状態でphp artisanコマンド等のコマンドが実行できるようになります。

ローカルでdocker-compose execなどでコンテナにアクセスした時を同じです。

ECSコンテナから出る

ここもローカルと同じく、exitを実行すればコンテナから出ることができます。

control + cでは出ることができません。

最後に

ECS Execの使い方で調べると色々ヒットするのですが、個人的には「これ見たら絶対できるじゃん」というのがなかったので自分で書きました。

AWSの学習は以下の書籍や講座がオススメです。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

この記事を書いた人

大学院(機械工学)→重工業→エンジニア→プロダクトマネージャー(PdM)兼エンジニア

神戸で「つながる勉強会」を運営↓
https://tsunagaru-kobe.connpass.com/

神戸グルメのインスタアカウントを運用しています。

目次
閉じる