インスタンスのライフサイクルとアドレスを管理する

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

はじめに

チームは、メンテナンス中にレポートサーバーを停止し、予測できるパブリックアドレスで復帰させたいと考えています。EC2 インスタンスを操作して停止状態と実行状態を比較し、Elastic IP を関連付けて、さらに停止と起動を行った後でアプリケーションを確認します。

EC2 の起動、SSH、User Data は学習済みであることを前提とします。この新しい環境には独自のイメージ、ネットワーク、キーペア、起動スクリプトが用意されています。サーバーは自分で起動して操作します。

認定試験との関連

インスタンス操作とパブリックアドレス管理は、AWS Certified Cloud Practitioner CLF-C02 の分野 3 の試験目標のタスク 3.3 と 3.5 に関連するコンピューティングとネットワークの概念を学ぶ助けになります。

メンテナンス用サーバーを起動する

このステップではアプリケーションサーバーを起動し、初期状態とアドレスを確認します。

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

cd /home/labex/project

提供されたイメージ、サブネット、セキュリティグループの ID を読み込みます。

source launch.env

提供された起動スクリプトはレポートアプリケーションの挨拶メッセージを設定します。使う前に確認します。

cat lifecycle-user-data.sh

Lifecycle server を探します。前のラボと同様に、--user-data file://... は Bash スクリプトを読み込み、インスタンスの起動時に渡します。lifecycle-server というサーバーを 1 台作成します。

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 \
  --user-data file://lifecycle-user-data.sh \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=lifecycle-server}]'

名前タグで照会してインスタンス ID を保存し、以後の操作に使います。

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=lifecycle-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 を確認します。まだ pending の場合は、少し待って照会を繰り返します。出力のプライベートとパブリックの IPv4 アドレスを覚えておきます。メンテナンス後に比較します。

AWS View を開き、Refresh resources をクリックします。Application requests で lifecycle-server を選択し、Check application をクリックします。インスタンスの状態を変える前に HTTP 200 と Lifecycle server を確認します。

メンテナンスのためにサーバーを停止する

このステップではインスタンスを停止し、アプリケーションのリクエストに応答できなくなることを確認します。

stopped のインスタンスは電源が切れており、再起動できます。terminated のインスタンスは完全に削除されています。EBS をルートストレージとするインスタンスでは、停止してもルートボリュームは保持されます。停止中はアプリケーションを利用できません。インスタンスライフサイクルの公式ガイドに、これらの状態の違いが説明されています。

アプリケーションのインスタンスを停止します。

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

stopped になるまで待ちます。waiter は状態を繰り返し照会し、条件を満たすと出力なしで終了します。

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

状態とアドレスを再確認します。

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

stopped を確認します。プライベート IPv4 アドレスは保持されますが、自動割り当てのパブリック IPv4 アドレスは解放されます。再起動後は、その時点のパブリックアドレスが必要です。

AWS View を更新します。stopped を確認し、実行中のアプリケーションの選択肢にこのインスタンスがないことを確認します。インスタンスの記録とルートストレージは残っていますが、メンテナンス中はサーバーを利用できません。

Elastic IP でパブリックアドレスを保持する

このステップではサーバーを起動し、Elastic IP を関連付け、さらに停止と起動を行ってもパブリックエンドポイントの関連付けが維持されることを確認します。

既存のインスタンスを起動します。

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

running になるまで待ちます。

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

アドレスを確認します。

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

インスタンス ID とプライベート IPv4 アドレスは変わりません。自動割り当てのパブリックアドレスは停止と起動の後で変わります。AWS View を更新してアプリケーションを再確認します。引き続き Lifecycle server が返るはずです。

Elastic IP は、解放するまでアカウントに割り当てられるパブリック IPv4 アドレスです。割り当てはアドレスを確保し、関連付けはインスタンスやネットワークインターフェイスと結び付けます。Elastic IP の公式ガイドにあるように、停止と起動を行っても安定したアドレスを提供できます。

VPC で使う Elastic IP を 1 つ割り当て、割り当て ID を保存します。

ALLOCATION_ID=$(aws ec2 \
  allocate-address \
  --domain vpc \
  --query 'AllocationId' \
  --output text)

その割り当てをインスタンスに関連付けます。削除時に使うため、返された関連付け ID を保存します。

ASSOCIATION_ID=$(aws ec2 \
  associate-address \
  --allocation-id "$ALLOCATION_ID" \
  --instance-id "$INSTANCE_ID" \
  --query 'AssociationId' \
  --output text)

アドレスと関連付け先のインスタンスを確認します。

aws ec2 \
  describe-addresses \
  --allocation-ids "$ALLOCATION_ID" \
  --query 'Addresses[].{PublicIPv4:PublicIp,Allocation:AllocationId,Instance:InstanceId}'

Elastic IP を覚えておきます。これは自動割り当てのパブリック IPv4 アドレスに置き換わります。AWS View を更新してアプリケーションを確認し、新しいアドレスが同じサーバーに到達することを確認します。

さらにもう一度メンテナンスの停止・起動を行います。

aws ec2 \
  stop-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-stopped \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  start-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-running \
  --instance-ids "$INSTANCE_ID"

インスタンスを再確認します。

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

パブリックアドレスが先ほどの Elastic IP のままであることを確認します。AWS View を更新して Check application をクリックします。HTTP 200 と Lifecycle server により、メンテナンス後に保持したアドレス経由で応答していることを確認できます。

アドレスを解放してサーバーを終了する

このステップでは割り当てられたアドレスを解放し、アプリケーションのインスタンスを完全に削除します。

関連付け解除はインスタンスとの接続を取り除きますが、アカウントからアドレスを解放する操作ではありません。まず保存した関連付けを解除します。

aws ec2 \
  disassociate-address \
  --association-id "$ASSOCIATION_ID"

次に割り当てを解放します。

aws ec2 \
  release-address \
  --allocation-id "$ALLOCATION_ID"

AWS では、インスタンスが停止中でも、割り当てられたパブリック IPv4 アドレスは課金対象です。不要になったアドレスを解放することもリソース削除の一部です。

サーバーを終了します。

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

終了が完了するまで待ちます。

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

インスタンスの最終状態を確認します。

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

terminated を確認します。残っている Elastic IP の割り当てを一覧表示します。

aws ec2 \
  describe-addresses \
  --query 'Addresses[].{Allocation:AllocationId,PublicIPv4:PublicIp}'

結果は空のリスト [] のはずです。AWS View を更新し、サーバーが実行中のリクエスト先ではなくなったことを確認します。用意されたネットワークとキーペアは保持します。

まとめ

EC2 アプリケーションサーバーを停止して起動し、アドレスの変化を観察して Elastic IP を関連付けました。もう一度メンテナンスを行った後、保持したアドレスでアプリケーションにアクセスできることを確認しました。最後に割り当てを解放してサーバーを終了し、両方のリソースが削除されたことを確認しました。