みなさんどうもこんにちは。 エンジニアのゆい(@fyui_001)です。
前回に引き続きEB(Elastic Beanstalk)からECSに移行したプロジェクトでの取り組みを紹介します。
今回はECSのコンテナにアクセスするためのECS ExecというAWSのサービスを使ってECS上で動いているコンテナに入る方法についてお話しようと思います。
前回の記事はこちら!
Laravel on ECSで動かすQueueとScheduleワーカー
背景
弊社ではデプロイ時にデータ投入のための一度限りのバッチ実行をEBにSSHで入り行っていたのですが、ECSに移行し、どうやってサービスの実行環境に入りリリース作業を行うかと言う課題がありました。
Dockerコンテナにsshエージェントを入れるのはイケてないなと言う判断があり、なにか手段がないか調べいていたところECS Execにたどり着きました。
AWSにはデバッグ用にECS Execと言うサービスが用意されており、ECS Execを使うことでコンテナのポートを開けてsshしたりsshキーの管理をすることなく直接ECS環境のコンテナで作業することができます。
公式ドキュメントはこちら
ECS ExecでECS環境に入る
前提条件
以下がマシンにインストールされている必要があります。
※session managerが入ってないと使えないのでちゃんとインストールして設定が必要です。
またSSMサービスに必要なアクセス許可をコンテナに付与するために、タスクIAMロールを設定する必要があります。
Fargateのコンテナにアクセス
入りたいコンテナのタスクIDを調べる
ecs execにはtask-idを指定しないと行けないですが、コンソールで見つけられなかったので以下がCLIで覗く方法です。
下記コマンドでクラスター名とサービス名を指定するとタスクのリストを出してくれるので見てます。
# 環境毎にクラスタ名とサービス名は違うので適宜いい感じに書き換えてください。 aws ecs list-tasks --cluster {cluster-name} --service-name {service-name}
こんな感じに出てきます。 クラスター名から先の文字列がタスクIDなのでちょっとメモっておく。
コンテナの中に飛び込む
次のコマンドを実行してコンテナに入ります。 taskオプションにさっき調べたタスクIDを渡して、containerオプションでコンテナ名を指定します。 詳しくは公式ドキュメントを参照。
aws ecs execute-command --cluster {cluster-name} \ --task {task-id} \ --container {container-name} \ --interactive \ --command "/bin/sh"
実際に入ってみる
※ タスクIDはちゃんとAWS CLIで確認して実行しましょう。(下記コマンドをコピペするべからず
aws ecs execute-command --cluster ecs-cluster \ --task ************************* \ --container app \ --interactive \ --command "/bin/sh"
こんな感じになっていれば成功!
コンテナに飛び込んだときのお作法
ECS Execで飛び込むとルートでログインさせられるので下記コマンドで適宜ユーザーを切り替えるべし。
実際に動いてるコンテナで実行ユーザーを変えている場合、ルートユーザのまま実行すると内部のパーミッションと所有権が狂ってしまうことがあるので、適宜ユーザに切り替えて実行するしたほうが安全です。(時と場合によりけり)。
su app
ちゃんと動くか
ちゃんとtinkerも動くので問題なさそうです。
最後に
今回はECS環境のコンテナに入れるECS Execについて紹介させていただきました。 ECSを使っている場合で直接環境に入るいい感じの方法を探してる方の参考になれば幸いです。
M&Aクラウドでは現在エンジニアやPdMなど幅広く募集中です!!もし興味を持ってくださった方はお気軽にお声がけください!