はじめに
RailsアプリをEC2からECS/fargateに移行するに当たり、
なかなかタスクが起動できませんでした。
その大きな要因は
**タスクが終了してしまうエラー原因
**を
**AWSコンソール画面やCLIでどうやって確認するか
**が
分からなかった為でした。
という訳で、自己整理用に
**ECS/fargateはどうデバッグしていけば良いか
**をまとめています。
使用技術
- AWS(ECS/Fargate)
- Rails6(Ruby2.7)
- MySQL8
エラー確認方法
- マネジメントコンソールのECS画面を確認する
- マネジメントコンソールのCloudWatch画面を確認する
- コンテナに接続後、Railsの本番用ログを確認する
1. マネジメントコンソールのECS画面を確認する
AWSマネジメントコンソールのESC画面に表示されるエラー文から
タスクが停止してしまった原因を確認する方法です。
では、以降はコンソール画面を参照しながら説明します。
対象サービスに関連するイベントを確認すると、大まかなエラー要因が確認できます。
(私の場合、ELBヘルスチェックに原因があった為、このエラー文が表示されています。)
これだけでも思い当たる節があれば、デバッグできますね!!
2. マネジメントコンソールのCloudWatch画面を確認する
次はマネジメントコンソールのCloudWatch画面からエラー文を確認する方法です。
タスク定義内のコンテナ設定画面でCloudWatchLogsでログ収集する設定を行なっていれば、
アプリケーション側で発生しているログを確認できます。
では、同様にマネジメントコンソール画面を参照しながら説明します。
コピーしたタスクIDを貼り付けて対象タスクのみ表示されたら、同タスクをクリックします。
対象タスクの画面にページ遷移したら、
下にスクロールして、
コンテナ名の横にある▼ボタン
をクリックして詳細を広げて、
CloudWatchのログを表示
をクリックします。
すると、CloudWatchの画面にページ遷移します。
ここからアプリ側で発生しているログが確認できます。
(私の場合、ヘルスチェックの猶予時間が切れて強制的にサーバーが落ちています。)
3. コンテナに接続後、本番用のログを確認する
最後に、ECS Execを用いて、ローカルPCからコンテナに接続して
直接デバッグする方法を紹介します。
前提としてタスクのステータスが「RUNNING」でないと
コンテナにはアクセスできません。
では、先に準備として以下5つの作業を行います。
⑴SessionManagerのインストール
⑵IAMでポリシーのアタッチ
⑶ターミナルでコマンド実行(対象サービスに操作許可を設定)
⑷サービス更新
⑸ターミナルでコマンド実行(コンテナに接続)
⑴SessionManagerのインストール
まずAWS公式ページをもとに任意ディレクトリでSessionManagerをインストールします。
# 任意のディレクトリでインストーラーをダウンロード
% 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
⑵IAMでポリシーのアタッチ
次にマネジメントコンソールのIAMからタスク実行ロールにポリシーを追加します。
ロールのタブを選択して、ecs実行ロール(ecsTaskExecutionRole)をクリックします。
専用ポリシーを作成後に同ロールにアタッチする為、
ポリシーをアタッチします
をクリックします。
先に専用ポリシーを作成する為、
ポリシーの作成
を押して、ポリシー作成画面に遷移します。
AWS公式ページを参考に専用ポリシーをコピーして、JSONタブを選択後に同ポリシーを貼り付けます。
その後に次のステップ
をクリックします。
最後にecsTaskExecutionRoleの画面に戻り、先ほど作成した専用ポリシーをアタッチします。
⑶ターミナルのコマンド実行(対象サービスの接続許可)
続いて、ローカルPCのターミナルでコマンドを実行しておきます。
下記コマンドは、操作対象のサービスだけexecute-commandを有効化させるものです。
(マネジメントコンソールからリージョン名・クラスター名・サービス名は事前にメモしておいてください。)
# 対象サービスに関するexecuteコマンドを有効化する
% aws ecs update-service --region リージョン名 --cluster クラスター名 --service サービス名 --enable-execute-command
# 「Shift + G」で一番下までスクロールしてenable-execute-commandを確認する
# 確認できたら、qを押して元のプロンプトに戻す
⑷サービス更新
次の作業は対象サービスの更新です。
理由はIAMで作成したecs実行ロールを更新させる為です。
忘れずに新しいデプロイの強制
にチェックします。
それ以外は編集せずにサービス更新を完了させてください。
⑸ターミナルでコマンド実行(コンテナに接続)
最後にコンテナに接続します。
まずコマンドに必要な[クラスター名、タスクID、コンテナ名]
を確認します。
あとはターミナルでコマンドを実行して接続します。
# 対象コンテナにexecuteコマンドでインタラクティブモードで接続する
% aws ecs execute-command --region リージョン名 --cluster クラスター名 --task タスクID --container コンテナ名 --interactive --command "/bin/sh"
###(参考まで:Rails)
# 本番環境で吐かれたログを表示する
/app # cat log/production.log
# 本番環境で設定できている
/app # echo $RAILS_ENV
production
# MySQLへの接続
/app # mysql -h RDSのエンドポイント -u RDSのユーザー名 -p
Enter password: パスワードを入力
# データベースが作成されているか
MySQL [(none)]> show databases
# app_dbというデータベースを選択する
MySQL [(none)]> use app_db
# テーブルが作成されているか
MySQL [(app_db)]> show tables
ECS/Fargate構成のインフラ構築について
ここで、EC2からECS/Fargate構築に移行する手順をまとめています。
■第一部(ECS準備編)
■第二部(ECS起動編)
■第三部(HTTPS/固定ドメイン編)
■第四部(CircleCI連携編)
終わりに
AWSマネジメントコンソールを使いこなすのムズイなぁ…と感じております。
ECS/fargate上にアプリをホストできたら、その手順をQiitaに投稿できたらなーと思っています。
→ ホスト完了したので、上記記事でまとめています。
最後までお読みいただき、ありがとうございました!