[AWS] AWSでFARGATEにSSH接続する

2023/4/1

AWS
FARGATE

FARGATEで作成したコンテナ内で実行していたプログラムが失敗していることは分かったのですが、AWS マネジメントコンソールでは詳細なログを見ることができませんでした。
AWSの標準の機能では、コンテナの中に入ることは出来ないので、詳細なログを見るためにコンテナにSSHで接続する方法をまとめました。
備忘目的で書く記事になるため、多少の説明不足はご了承ください。

AWS FARGATE

AWS FargateはAmazon ECSで使用できるサービスの一つで、サーバーやAmazon EC2インスタンスのクラスターを管理することなくコンテナを実行できます。
Fargateを使用すると、サーバーの構築から保守までを一切意識せずにコンテナ内のサーバー上でプログラムを実行できます。

AWS CLIをインストールする

AWS CLIをインストールする方法はAWSの公式ドキュメントに記載されています。

AWS Command Line Interface

以下のコマンドを入力してAWS CLIのバージョンが表示されていればインストールが成功しています。

aws --version

001.png

IAMユーザのアクセスキーの作成

IAMユーザのアクセスキーの作成はAWSの公式ドキュメントに記載されています。

AWS Identity and Access Management

AWS CLIの認証情報の設定

以下のコマンドを入力して先ほど作成したアクセスキーを登録します。

aws configure

再度同じコマンドを入力すると登録した情報を確認することができます。

002.png

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

003.png

必要な情報の確認

下記コマンドでクラスタ-名(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

今回はここまでです。