3
2

More than 1 year has passed since last update.

ECS/fargateでタスクが終了してしまう場合のデバッグ方法【Rails】

Last updated at Posted at 2021-12-06

はじめに

RailsアプリをEC2からECS/fargateに移行するに当たり、
なかなかタスクが起動できませんでした。

その大きな要因は
タスクが終了してしまうエラー原因
AWSコンソール画面やCLIでどうやって確認するか
分からなかった為でした。

という訳で、自己整理用に
ECS/fargateはどうデバッグしていけば良いかをまとめています。

使用技術

  • AWS(ECS/Fargate)
  • Rails6(Ruby2.7)
  • MySQL8

エラー確認方法

  1. マネジメントコンソールのECS画面を確認する
  2. マネジメントコンソールのCloudWatch画面を確認する
  3. コンテナに接続後、Railsの本番用ログを確認する

1. マネジメントコンソールのECS画面を確認する

AWSマネジメントコンソールのESC画面に表示されるエラー文から
タスクが停止してしまった原因を確認する方法です。

では、以降はコンソール画面を参照しながら説明します。

まず、AWSの提供サービスからECSを検索します。
スクリーンショット 2021-12-06 14.31.44.png

クラスターのタブを押して、対象クラスターをクリックします。
スクリーンショット 2021-12-06 14.33.27.png

さらに対象サービスをクリックします。
スクリーンショット 2021-12-06 14.35.04.png

対象サービスに関連するイベントを確認すると、大まかなエラー要因が確認できます。
(私の場合、ELBヘルスチェックに原因があった為、このエラー文が表示されています。)
スクリーンショット 2021-12-06 14.37.02.png

これだけでも思い当たる節があれば、デバッグできますね!!

2. マネジメントコンソールのCloudWatch画面を確認する

次はマネジメントコンソールのCloudWatch画面からエラー文を確認する方法です。

タスク定義内のコンテナ設定画面でCloudWatchLogsでログ収集する設定を行なっていれば、
アプリケーション側で発生しているログを確認できます。

■CloudWatchLogsの設定
スクリーンショット 2021-12-06 16.04.31.png

では、同様にマネジメントコンソール画面を参照しながら説明します。

まず停止したタスクのIDを確認してコピーしておきます。
スクリーンショット 2021-12-06 14.37.02.png

コピーしたタスクIDを貼り付けて対象タスクのみ表示されたら、同タスクをクリックします。
スクリーンショット 2021-12-06 14.51.29.png

対象タスクの画面にページ遷移したら、
下にスクロールして、
コンテナ名の横にある▼ボタンをクリックして詳細を広げて、
CloudWatchのログを表示をクリックします。
スクリーンショット 2021-12-06 14.59.57.png

すると、CloudWatchの画面にページ遷移します。
ここからアプリ側で発生しているログが確認できます。
(私の場合、ヘルスチェックの猶予時間が切れて強制的にサーバーが落ちています。)
スクリーンショット 2021-12-06 15.02.10.png

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からタスク実行ロールにポリシーを追加します。

AWSサービス一覧からIAMを検索して選択します。
スクリーンショット 2021-12-06 16.35.12.png

ロールのタブを選択して、ecs実行ロール(ecsTaskExecutionRole)をクリックします。
スクリーンショット 2021-12-06 16.37.00.png

専用ポリシーを作成後に同ロールにアタッチする為、
ポリシーをアタッチしますをクリックします。
スクリーンショット 2021-12-06 16.39.01.png

先に専用ポリシーを作成する為、
ポリシーの作成を押して、ポリシー作成画面に遷移します。
スクリーンショット 2021-12-06 16.40.41.png

AWS公式ページを参考に専用ポリシーをコピーして、JSONタブを選択後に同ポリシーを貼り付けます。
その後に次のステップをクリックします。

スクリーンショット 2021-12-06 16.42.47.png

ここでは何も入力せずに、そのまま次のステップを押します。
スクリーンショット 2021-12-06 16.45.06.png

ポリシーに任意の名前を付けて、ポリシーを作成します。
スクリーンショット 2021-12-06 16.47.38.png

最後にecsTaskExecutionRoleの画面に戻り、先ほど作成した専用ポリシーをアタッチします。
スクリーンショット 2021-12-06 16.50.39.png

⑶ターミナルのコマンド実行(対象サービスの接続許可)

続いて、ローカルPCのターミナルでコマンドを実行しておきます。

下記コマンドは、操作対象のサービスだけexecute-commandを有効化させるものです。
(マネジメントコンソールからリージョン名・クラスター名・サービス名は事前にメモしておいてください。)

ターミナル

# 対象サービスに関するexecuteコマンドを有効化する
% aws ecs update-service --region リージョン名 --cluster クラスター名 --service サービス名 --enable-execute-command

# 「Shift + G」で一番下までスクロールしてenable-execute-commandを確認する
# 確認できたら、qを押して元のプロンプトに戻す

⑷サービス更新

次の作業は対象サービスの更新です。

理由はIAMで作成したecs実行ロールを更新させる為です。

ECSコンソール画面から対象サービスを更新します。
スクリーンショット 2021-12-06 18.32.01.png

忘れずに新しいデプロイの強制にチェックします。
それ以外は編集せずにサービス更新を完了させてください。
スクリーンショット 2021-12-06 18.34.21.png

⑸ターミナルでコマンド実行(コンテナに接続)

最後にコンテナに接続します。

まずコマンドに必要な[クラスター名、タスクID、コンテナ名]を確認します。

■タスクの画面
スクリーンショット 2021-12-07 7.58.12.png

あとはターミナルでコマンドを実行して接続します。

ターミナル

# 対象コンテナに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に投稿できたらなーと思っています。
→ ホスト完了したので、上記記事でまとめています。

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2