Amazon ECSでデータプレーン(Dockerコンテナを稼働させるための環境)にFargateを使う場合に、ECS Execを使ってコンテナにアクセスする方法をまとめます。
例えばLaravelで開発したアプリケーションをECS+Fargateにデプロイした場合にマイグレーションやシーダーを実行する場合に、ECS Execコマンドでコンテナにアクセスし、php artisan migrate
やphp 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をインストールします。
以下リンク先に記載されている手順でインストールしていきます。
以下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
コマンドを実行すると、サービスの仕様(serviceArn
、serviceName
等)が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
コマンド等のコマンドが実行できるようになります。
ECSコンテナから出る
ここもローカルと同じく、exit
を実行すればコンテナから出ることができます。
最後に
ECS Execの使い方で調べると色々ヒットするのですが、個人的には「これ見たら絶対できるじゃん」というのがなかったので自分で書きました。
AWSの学習は以下の書籍や講座がオススメです。
コメント