【AWS】ALB に2つ目のインスタンスを追加する

Skrumエンジニアの高田です。
ロードバランサー(Application Load Balancer)のターゲットグループに 1 つだけ EC2 インスタンスを設定している状態から 2 つ目のインスタンスを追加する際に注意する点があったのでまとめます。
- AMI の作成
- IAM ロールの設定
- スティッキーセッション
- 不要なアベイラビリティゾーン(AZ)の削除
1. AMI の作成
既存のインスタンスからインスタンスを作成する場合、主に下記2つの方法があります。
1. 対象の EC2 インスタンスのイメージ(AMI)を作成して、イメージからインスタンスを起動する
2. 「同様のものを起動」からインスタンスを起動する

「同様のものを起動」からインスタンスを作れば、AMI を作成する必要が無いため簡単にインスタンスをコピーできるのかと思い、やってみました。
しかし、EC2 インスタンスに最新のソースコードをデプロイした後に「同様のものを起動」からインスタンスを作ると、最新のソースコードがデプロイされていない状態のインスタンスが生成される事象が発生しました。
AWS のドキュメントを確認してみると、下記のように記載されていました。
[Launch More Like This] (同様のインスタンスをさらに起動) オプションでは、選択されたインスタンスは複製されません。一部の設定が複製されるのみです。インスタンスのコピーを作成するには、最初にインスタンスから AMI を作成して、AMI からさらに多くのインスタンスを起動します。
または、インスタンスの起動パラメータを格納するための 起動テンプレート を作成します。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/launch-more-like-this.html
つまり、既存のインスタンスと全く同じ状態のインスタンスを作りたい場合は、AMI を作成してその AMI からインスタンスを起動する必要があります。
2. IAM ロールの設定
AMI からインスタンスを起動する際に1つ注意すべきことがあります。
起動時の設定で、IAM ロールの設定を見落として IAM ロールを設定せずに起動してしまいました。IAM ロールの設定はごく基本の設定だと思うのですが、なぜか「高度な詳細」のところに IAM ロールの設定項目があり、見落としてしまいました。AMI からインスタンスを起動する際は IAM ロールの設定に注意しましょう。

3. スティッキーセッション
既存インスタンスと同様のインスタンスを起動したら、ロードバランサーのターゲットグループに入れるのですが1つ追加設定が必要です。
セッションを利用しているアプリケーションでは、セッションをサーバローカルでファイル管理している場合、この時必ずスティッキーセッションを有効にする必要があります。
ターゲットグループに 1 つのインスタンスしか存在しない状態で運用している場合は、スティッキーセッションを無効にしていても、必ず同じインスタンスにリクエストが行くので問題は発生しません。
しかし、ターゲットグループに 2 つ以上のインスタンスを指定する場合、毎回のリクエストを特定のインスタンスに固定しないとセッションが機能しなくなります。
スティッキーセッションを有効にするには、ターゲットグループの設定を変更します。

「維持設定」がスティッキーセッションのことです。

簡易に設定する場合は「ロードバランサーが Cookie を生成しました」を選択すれば問題ありません。

4. 不要なアベイラビリティゾーン(AZ)の削除
2 つ目のインスタンスは既存インスタンスとは別の AZ に配置しました。
ap-northeast-1a(既存インスタンス)
ap-northeast-1d(新規インスタンス)
ALB では最大 3 つの AZ を指定できるのですが、インスタンスが存在しない AZ を ALB の振り分け対象に指定してしまうと、その AZ にトラフィックが振り分けられてしまうことがあり「504 Gateway Timeout」が発生する可能性があります。
「ロードバランサー」の「サブネットの編集」からインスタンスが存在しない AZ のチェックを外します。(今回は ap-northeast-1c )


ターゲットグループへのインスタンス追加は基本は難しい作業ではないのですが、意外と注意する点が多かったです。