AWS Systems Manager で AWS Fargate のコンテナにログインしたい

本記事は 新人ブログマラソン2024 の記事です

こんにちは。2024年度に入社した新人の曲渕です。

AWSの技術習得に向けて日々勉強している最中です。そんなAWSの知識があまりない私ですが、現在サーバーレスの案件に携わらせてもらっています。コンテナ周りのサービスは難しいイメージがあるので正直不安ですが、なんとかやり遂げられるよう頑張りたいです!

今回の記事ではその案件の中で AWS Systems Manager で AWS Fargate のコンテナにログインする機会があったので、その備忘録として記事にしました。

私と同じようにAWSの勉強をされている方や来年入社される方の参考になれば幸いです。

構成図

AWS構成図

今回やりたいこととしては、プライベートサブネットに配置されたECS クラスターのFargateのコンテナにSystems Managerでログインすることです。

実施手順の流れ

以下に今回行った手順の流れを記載します。

①VPC、リポジトリ、IAMロールの作成

②Dockerファイルを記述(コンテナの設計図をつくる

③リポジトリにイメージを格納(作ったコンテナの設計図を保管

④クラスターを作成(コンテナを動かすための作業場を用意

⑤タスク定義(リポジトリに保管したコンテナの設計図を引っ張り出してリソースを割り当てて使えるようにする

⑥サービスの作成(どのタスク定義を使用してコンテナを実行するか

⑦Systems ManagerのセッションマネージャーでFargateのコンテナにログイン

VPC、リポジトリ、IAMロールの作成

VPCは10.0.0.0/16のCIDRブロックのものを使用し、NAT gatewayをパブリックサブネットに一つ配置します。

リポジトリはECRから作成します。作成が完了するとURIが表示されますが、このURIは後ほど使用します。画像の赤枠の部分はリポジトリの名前を入力します。リポジトリの作成

IAMロールはSystems ManagerでFargateのコンテナにログインできるように以下のものを設定しました。画像の備考にあるecsTaskExcutionRoleのIAMポリシーは既存のもので、下のtest-magarifuchi-roleのIAMポリシーはJSONファイルから記述しています。赤文字でアカウントIDとある部分にはAWSアカウントのIDを記述します。test-magarifuchi-roleはタスクロール、ecsTaskExecutionRoleはタスク実行ロールで使用します。

IAMロールの設定

Dockerファイルを記述

Cloud9を使用して以下のコマンドを順に実行しました。赤文字の部分はそれぞれAWSアカウントのIDと作成したリポジトリのURI、使用しているリージョンを入力します。

①mkdir my-image(新しいフォルダを作成

②cd my-image(作成したフォルダに移動

③nano Dockerfile(Dockerファイルの記述

④touch entrypoint.sh(entrypointシェルスクリプトファイルを作成

⑤nano entrypoint.sh(entrypointシェルスクリプトファイルを記述

⑥docker build -t my-image:latest .(イメージをビルド

⑦docker tag my-image:latest リポジトリのURI:latest(イメージにタグ付け

⑧aws ecr get-login-password –region ap-northeast-1 | docker login –username AWS –password-stdin アカウントID.dkr.ecr.リージョン.amazonaws.com(ECRにログイン

⑨docker push リポジトリのURI:latest(イメージをリポジトリにプッシュ

以下に作成したDockerファイルを記載します。

# PHP 8.1 と Apache をベースにしたイメージ
FROM php:8.1-apache

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    unzip \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    wget \
    curl \
    jq \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql

# Apacheの設定
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html \
    && a2enmod rewrite

# ssm-agentのインストール
RUN wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb && \
    dpkg -i amazon-ssm-agent.deb && \
    rm -f amazon-ssm-agent.deb && \
    cp /etc/amazon/ssm/seelog.xml.template /etc/amazon/ssm/seelog.xml

# AWS CLIのインストール
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install && \
    rm -rf ./aws && \
    rm -f ./awscliv2.zip

# SSMエージェントとアクティベーション処理用のスクリプトを追加
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

# コンテナのポートを公開
EXPOSE 80

このDockerファイルではPHP、Apache構成のコンテナを記述しています。「#ssm-agentのインストール」ではSSMエージェントのパッケージをインストールし、設定ファイルにコピーしています。「#AWS CLIのインストール」ではコンテナ内からAWSサービスをコマンドラインから操作できるようにしています。「#SSMエージェントとアクティベーション処理用のスクリプトを追加」の部分でコンテナが起動される際に実行されるentrypoint.shを指定しています。以下のファイルがentrypoint.shの内容です。

#!/bin/bash

# SSMエージェントのアクティベーションと起動
ACTIVATE_PARAMETERS=$(aws ssm create-activation \
  --iam-role "service-role/AmazonEC2RunCommandRoleForManagedInstances" \
  --region "${AWS_REGION:-ap-northeast-1}")

export ACTIVATE_CODE=$(echo $ACTIVATE_PARAMETERS | jq -r .ActivationCode)
export ACTIVATE_ID=$(echo $ACTIVATE_PARAMETERS | jq -r .ActivationId)

# コンテナのマネージドインスタンスへの登録
amazon-ssm-agent -register -code "${ACTIVATE_CODE}" -id "${ACTIVATE_ID}" -region "${AWS_REGION:-ap-northeast-1}" -y

# ssm-userからrootユーザーにスイッチするための権限付与
echo "ssm-user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ssm-agent-users

# SSMエージェントの登録
nohup amazon-ssm-agent > /dev/null &

# Apacheをフォアグラウンドで実行
apache2-foreground

entrypoint.shでは「#コンテナのマネージドインスタンスへの登録」でSSMエージェントを使用して、FargateのコンテナをSystems Managerに登録しています。これでコンテナがSystems Managerによって管理されるようになります。

リポジトリにイメージを格納

手順⑨を実行するとリポジトリにイメージが格納されるはずです。実際にリポジトリの中身を見てみるとイメージがあることが確認できました。イメージをプッシュした後のリポジトリの中

クラスターを作成

クラスターの作成では名前は任意のものを設定し、Fargateを選択します。クラスターの設定

タスク定義

タスク定義では、先ほど格納したリポジトリのイメージURIからコンテナの詳細な設定を行います。タスク定義ファミリーは任意の名前を入力し、起動タイプはFargate、ロールは冒頭で作成したIAMロールを設定します。黒く塗りつぶしているところはアカウントIDになります。タスク定義の設定①タスクの定義②

サービスの作成

作成したクラスターに移動してサービスの作成を行います。先ほど作成したタスク定義を選択し、サービス名を任意の名前で入力します。VPCの選択では構成図に従ってプライベートサブネットを選択します。セキュリティグループは新しく作っていますが、既存のものから選択することもできます。また、オートスケーリングの設定やロードバランサーの選択などもサービスの作成で行えますが、今回は赤枠以外のところはすべてデフォルトのままです。サービスの作成の設定

クラスターの「タスク」タブのタスクを選ぶと、以下の画像のようにコンテナが実行されていることが確認できます。コンテナのステータス

Systems ManagerのセッションマネージャーでFargateのコンテナにログイン

実際にSystems Managerのセッションマネージャーに移動すると、Fargateのコンテナが表示されていることが確認できました。セッションマネージャーのターゲットインスタンスの表示

表示されたターゲットインスタンスを選択し、「Start session」を選ぶと以下の画面のようになります。コマンドを打つと応答が返ってきたことからログインが成功しているのが確認できました。fargateコンテナへのログイン確認

おわりに

今回はSystems ManagerでFatgateのコンテナにログインしましたが、調べてみるとECS Execというものを利用してコンテナにログインする方法もあるようです。機会があれがそちらも試してみようと思います。

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

参考サイト

タイトルとURLをコピーしました