本記事は 新人ブログマラソン2024 の記事です。 |
こんにちは。2024年度に入社した新人の曲渕です。
AWSの技術習得に向けて日々勉強している最中です。そんなAWSの知識があまりない私ですが、現在サーバーレスの案件に携わらせてもらっています。コンテナ周りのサービスは難しいイメージがあるので正直不安ですが、なんとかやり遂げられるよう頑張りたいです!
今回の記事ではその案件の中で AWS Systems Manager で AWS Fargate のコンテナにログインする機会があったので、その備忘録として記事にしました。
私と同じように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はタスク実行ロールで使用します。
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」を選ぶと以下の画面のようになります。コマンドを打つと応答が返ってきたことからログインが成功しているのが確認できました。
おわりに
今回はSystems ManagerでFatgateのコンテナにログインしましたが、調べてみるとECS Execというものを利用してコンテナにログインする方法もあるようです。機会があれがそちらも試してみようと思います。
最後まで読んでいただきありがとうございました!