EC2 アプリケーションサーバーを起動する

AWSBeginner
オンラインで実践に進む

はじめに

チームは小さなレポートアプリケーション用のサーバーを必要としています。このラボでは Amazon EC2 インスタンスを起動し、SSH で接続して挨拶メッセージを変更し、AWS View で応答をテストします。その後、インスタンスを終了して最終状態を確認します。

基本的なターミナルコマンドと、VPC、サブネット、セキュリティグループの役割を理解していることを前提とします。環境にはネットワーク、Ubuntu イメージ、SSH キーペア、アプリケーションが用意されています。アプリケーションのインスタンスは自分で作成して設定します。

認定試験との関連

このラボでは、AWS Certified Cloud Practitioner CLF-C02 の分野 3 の試験目標のタスク 3.1 と 3.3 に関連する、プログラムによる AWS 操作とコンピューティングサービスとしての EC2 の選択を練習します。イメージ、インスタンスタイプ、実行中のインスタンスの違いも学びます。

アプリケーションのインスタンスを起動する

このステップでは、用意されたイメージを確認し、提供されたネットワークに EC2 インスタンスを 1 台起動します。

EC2 インスタンスは仮想サーバーです。Amazon Machine Image(AMI)は OS と初期ソフトウェアを提供します。インスタンスタイプはコンピューティング能力とメモリ容量の組み合わせを指定します。この入門アプリケーションには、小型の汎用インスタンスタイプである t3.micro を選択します。

プロジェクトディレクトリから始めます。

cd /home/labex/project

launch.env には、用意されたイメージ、サブネット、セキュリティグループの識別子があります。使用するリソースを確認します。

cat launch.env

値はリソース ID であり、環境ごとに異なります。ファイル内の変数代入を読み込む source を使い、現在のシェルに読み込みます。

source launch.env

AMI を確認します。--image-ids はイメージを選択し、--query は表示するフィールドを限定します。

aws ec2 \
  describe-images \
  --image-ids "$AMI_ID" \
  --query 'Images[].{Image:ImageId,Name:Name,Architecture:Architecture}'

イメージ名 report-server-ubuntu-2204 とアーキテクチャ x86_64 を確認します。このイメージには Ubuntu とレポートアプリケーションが含まれているため、サーバーの起動と運用に集中できます。

サブネットはインスタンスのネットワーク上の場所を決めます。提供されたセキュリティグループは、ラボのアクセスネットワークからポート 22 の SSH とポート 8081 のアプリケーションへのリクエストを許可します。キーペア report-key の公開鍵がインスタンスに配置され、SSH 接続用の秘密鍵はプロジェクトディレクトリにあります。

用意されたリソースでインスタンスを 1 台起動します。--count 1 はサーバーを 1 台作成し、タグは識別しやすい名前 report-server を設定します。

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=report-server}]'

応答には新しいインスタンス ID と初期状態が含まれます。後のコマンドで使うため、ID をシェル変数に保存します。$(...) は括弧内のコマンドを実行して出力を取得し、--output text は ID をプレーンテキストで返します。

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=report-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

インスタンスの状態とアドレスを確認します。

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,PrivateIPv4:PrivateIpAddress,PublicIPv4:PublicIpAddress}'

状態が running で、プライベートとパブリックの IPv4 アドレスがあることを確認します。まだ pending の場合は、少し待って確認コマンドを繰り返します。プライベートアドレスは VPC 内のサーバーを識別します。パブリックアドレスはラボのアクセスネットワークを通じて接続する際の宛先です。

接続してアプリケーションを設定する

このステップではインスタンスに SSH 接続し、レポートアプリケーションの挨拶メッセージを変更して AWS View で応答をテストします。

インスタンスのパブリック IPv4 アドレスを取得し、別のシェル変数に保存します。

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)

SSH はサーバーとの暗号化されたターミナル接続を作成します。Ubuntu イメージのログイン名は ubuntu です。提供された ssh_config は秘密鍵とラボの接続経路を選択し、-F はその設定ファイルを読むよう SSH に指示します。

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

ターミナルは現在アプリケーションのインスタンス内にあります。ログインユーザーを確認します。

whoami

出力は ubuntu のはずです。これにより、ユーザーが labex である LabEx ターミナルとアプリケーションのインスタンスを区別できます。

提供されたアプリケーションは /etc/report-app/config.json から挨拶メッセージを読み込みます。このシステムファイルの更新には管理者権限が必要です。sudo tee は次のテキストをファイルに書き込み、2 つの JSON マーカー間のヒアドキュメントがそのテキストを提供します。

sudo tee /etc/report-app/config.json <<'JSON'
{
  "message": "Hello from EC2"
}
JSON

アプリケーションはリクエストごとに設定を読み直します。curl を使い、インスタンスのループバックアドレス経由で正常性エンドポイントにリクエストします。

curl -sS http://127.0.0.1:8081/health

JSON 応答にはサービス名 Report server と "message": "Hello from EC2" が含まれるはずです。これにより、インスタンス内で設定どおりにアプリケーションが応答していることを確認できます。

SSH セッションから退出し、LabEx ターミナルに戻ります。

exit

AWS View を開き、Refresh resources をクリックします。インスタンス一覧で report-server を探します。running を確認し、パブリック IPv4 アドレスを CLI の結果と比較します。

Application requests で実行中のインスタンスを選択し、Check application をクリックします。Hello from EC2 を含む HTTP 200 応答を確認します。このリクエストは現在のパブリックアドレスに送られるため、サーバー内部の確認に加えてネットワーク経由でアプリケーションをテストできます。

AWS View に実行中の report-server と設定済みアプリケーションの応答が表示されている

確認例:アプリケーションは HTTP 200 と Hello from EC2 を返します。リソース ID とアドレスは異なります。

サーバーを終了する

このステップではアプリケーションのインスタンスを終了し、実行されなくなったことを確認します。

終了するとインスタンスは完全に削除されます。保存した ID を使い、自分のアプリケーションサーバーだけを選択します。

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"

応答には以前と現在の状態が表示されます。AWS CLI は、指定した状態になるまでリソースを繰り返し照会する waiter も提供します。終了が完了するまで待ちます。

aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

条件が満たされると waiter は出力なしで終了します。最終状態を確認します。

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

terminated を確認します。終了後もインスタンスの記録が表示されることがありますが、サーバーが実行中であることを意味しません。

AWS View で Refresh resources をクリックします。インスタンスは terminated と表示され、実行中のアプリケーションのリクエスト先として利用できなくなるはずです。用意されたネットワークとキーペアは保持します。

まとめ

AMI、インスタンスタイプ、ネットワークリソース、SSH キーペアを使って EC2 インスタンスを起動しました。サーバーに接続してレポートアプリケーションを設定し、AWS View で応答を確認しました。最後にインスタンスを終了して最終状態を確認しました。