FARGATEで作成したコンテナ内で実行していたプログラムが失敗していることは分かったのですが、AWS マネジメントコンソールでは詳細なログを見ることができませんでした。
AWSの標準の機能では、コンテナの中に入ることは出来ないので、詳細なログを見るためにコンテナにSSHで接続する方法をまとめました。
備忘目的で書く記事になるため、多少の説明不足はご了承ください。
AWS FARGATE
AWS FargateはAmazon ECSで使用できるサービスの一つで、サーバーやAmazon EC2インスタンスのクラスターを管理することなくコンテナを実行できます。
Fargateを使用すると、サーバーの構築から保守までを一切意識せずにコンテナ内のサーバー上でプログラムを実行できます。
AWS CLIをインストールする
AWS CLIをインストールする方法はAWSの公式ドキュメントに記載されています。
以下のコマンドを入力してAWS CLIのバージョンが表示されていればインストールが成功しています。
aws --version
IAMユーザのアクセスキーの作成
IAMユーザのアクセスキーの作成はAWSの公式ドキュメントに記載されています。
AWS Identity and Access Management
AWS CLIの認証情報の設定
以下のコマンドを入力して先ほど作成したアクセスキーを登録します。
aws configure
再度同じコマンドを入力すると登録した情報を確認することができます。
SSMのインストール
本来SSHで接続できないFARGATEにSSHで接続できるようにするために必要なSSM(Session Manager)をインストールします。
以下のコマンドを入力してプラグインをダウンロードします。
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
以下のコマンドを入力してダウンロードしたプラグインを解凍します。
unzip sessionmanager-bundle.zip
以下のコマンドを入力して「The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.」と表示されていればインストールが成功しています。
session-manager-plugin
必要な情報の確認
下記コマンドでクラスタ-名(ARN)を確認します。
aws ecs list-clusters
{
"clusterArns": [
"クラスタ-名(ARN)"
]
}
下記コマンドでサービス名(ARN)を確認します。
aws ecs list-services \
--cluster クラスタ-名(ARN)
{
"serviceArns": [
"サービス名(ARN)"
]
}
下記コマンドでタスク名を確認します。
aws ecs list-tasks \
--cluster クラスタ-名(ARN)
{
"taskArns": [
"タスク名(ARN)"
]
}
ECSExecの有効化
まずは下記コマンドでECSExecが有効化されているかを確認します。
aws ecs describe-tasks \
--cluster クラスタ-名(ARN) \
--task タスク名(ARN) \
--query 'tasks[0].enableExecuteCommand'
true or false
恐らくECSExecが無効化(false)になっているはずです。
下記ファイルを実行することでECSExecを有効化にしつつFARGATEにSSHでログインできます。
#!/bin/bash
# クラスタ-名
CLUSTER_NAME="クラスタ-名(ARN)"
# サブネットID(ECSサービスのクラスター項目のサービスから検索)
SUBNET_ID="subnet-xxxxxxxxxxxxxxxxx"
# タスク定義名
TASK_NAME="タスク名(ARN)"
# セキュリティグループID(EC2サービスのセキュリティグループ項目から検索)
SG_ID="sg-xxxxxxxxxxxxxxxxx"
# パブリックIP割当て(ENABLED もしくは DISABLED)
PUBLIC_IP_ASSIGN="ENABLED"
# タスク定義 ARN
TASK_DEF_ARN=$(aws ecs list-task-definitions \
--family-prefix "${TASK_NAME}" \
--query "reverse(taskDefinitionArns)[0]" \
--output text) \
&& echo "${TASK_DEF_ARN}"
# ネットワーク
NETWORK_CONFIG="awsvpcConfiguration={subnets=[${SUBNET_ID}],securityGroups=[${SG_ID}],assignPublicIp=${PUBLIC_IP_ASSIGN}}"
# タスク実行
aws ecs run-task \
--cluster "${CLUSTER_NAME}" \
--task-definition "${TASK_DEF_ARN}" \
--network-configuration "${NETWORK_CONFIG}" \
--enable-execute-command \
--launch-type FARGATE
今回はここまでです。