Auto Scalingで起動テンプレートに更新をかけずにAMIを更新する方法

AWS

2024.12.20

Topics

この記事は NHN テコラス Advent Calendar 2024 の 20 日目の記事です。

概要

ALB + Auto Scaling + EC2 の構成はよく利用されるかと思います。
その中で、ゴールデンイメージ用のEC2を変更してAMIを更新する際、起動テンプレートのバージョンを変更といった手順をとることがあると思いますが、起動テンプレートの設定は複雑で、変更時に注意が必要です。

今回はAMI更新時に「起動テンプレートの更新」を省ける方法をご紹介いたします。(起動テンプレート自体の設定を変える場合は触る必要があります。)

その方法は、起動テンプレートでAMI IDを直接指定するのではなく、AWS Systems Manager パラメータを使用することで可能です。
AMI ID が変更された場合は、Systems Manager パラメータストアの Systems Manager パラメータを更新することで、AMI ID を更新できます。

AMI ID のかわりに Systems Manager パラメータを使用する

前提

  • AWS アカウントを持っていること
  • AWS マネジメントコンソールにアクセスできること
  • 必要な権限があること

事前準備済みリソース

・起動テンプレートに登録するEC2(httpdインストール、自動起動設定済み)
・ALB
・ターゲットグループ
・セキュリティグループやロール

手順

ステップ 1: Systems Manager パラメータストアに AMI ID を保存する

EC2コンソール画面にて対象EC2を選択し、「アクション」→ 「イメージとテンプレート」 → 「イメージを作成」より対象EC2のAMIを作成します。

今回は「spam-ec2-pub」というEC2のAMIを作成します。
このEC2にはhttpdがインストールされており、ブラウザからアクセスすると『spam AMI v1』と表示されます。

作成したAMIが以下となります。
AMI名は適宜設定してください。今回は「spam-ec2-ami-pub-v1」という名前で作成しました。

次にSystems Manager コンソールに移動後、左側のナビゲーションペインで「パラメータストア」より「パラメータの作成」を選択します。
先ほど作成したAMIのIDをSystems Manager パラメータストアへ登録します。

タイプは「文字列」、データ型を「aws:ec2:image」、値に作成したAMI「spam-ec2-ami-pub-v1」のIDを設定します。
その他の設定は画像と同様で問題ないです。

最後に「パラメータを作成」をクリックしてパラメータを保存します。
「/spam/parameter/ami-id」というパラメータが作成完了しました。

以上でステップ1は完了です。

ステップ 2:起動テンプレート を作成する

EC2 コンソールに移動し、左側のナビゲーションペインで「起動テンプレート」を選択後、「起動テンプレートを作成」をクリックします。

起動テンプレート名を名前は適宜設定してください。今回は「spam-ec2-temp-pub」という名前で作成しました。

AMIを選択します。ここから通常と少し異なります

今回指定するAMIはSSMから参照するため、「その他のAMIを閲覧する」を開きます。

その後、検索欄右側の「▼」よりタブを開き「カスタム値/Systems Manager パラメータを設定」を選択します。

すると以下のようなウィンドウが開くので、先ほど作成したパラメータ名を「resolve:ssm:/spam/parameter/ami-id」のように入力します。
「resolve:ssm:」は、パラメータストアの値を動的参照するための入力方法となります。

Systems Manager Parameter Store からプレーンテキスト値を取得する

完了したら以下のように先ほど入力した値がそのまま表示されます。(ここで正しく登録されているか確認する方法は雑記に記載します。)

起動テンプレートの他設定はEC2と同様の設定で問題ないです。
特にインスタンスタイプについては設定しておくと、後程詰まることがなくなるかと思います。

以上で、ステップ2は完了となります。

ステップ 3: Auto Scalingを設定する

EC2 コンソールに移動し、左側のナビゲーションペインで「Auto Scaling グループ」を選択し、「Auto Scaling グループを作成する」を選択します。

Auto Scaling名を入力し、起動テンプレートに先ほど作成した起動テンプレートを選択します。
今回については最新バージョンの「Latest」を設定しています。

VPCやサブネットを設定し、事前に作成しているALB及びターゲットグループに紐づけました。
その他の設定についてはデフォルトで進めています。

設定が完了しました!

実際にブラウザから接続して表示内容を確認します。
想定通り表示されました!

ステップ 4: ページを更新してみる

AMIのもととなるEC2「spam-ec2-pub」のindex.htmlファイルを更新します。

# cat index.html
spam AMI v2
#

新しいAMIを作成します。

パラメータストアで「/spam/parameter/ami-id」の値を新しいAMI IDに更新します。

Auto Scalingで起動している既存のEC2を落として、新しく起動させた後、ブラウザから接続し確認すると、ページが更新されています!

以上で全ステップ完了です。お疲れ様でした。

躓いた点

Systems Manager パラメータストアを利用して起動テンプレートを作成した場合、Auto Scaling グループの設定では「属性ベース」の選択はできません。(コンソール画面上では「インスタンス属性」と表記される部分です)

EC2 フリートまたはスポットフリートのインスタンスタイプを選択するための属性を指定する

どのような状態の時?

起動テンプレートの設定時にインスタンスタイプを「起動テンプレートの設定に含まない」で進めると、以下のように「インスタンスタイプの要件」が選択可能となります。

ここで、「インスタンス属性を指定する」を選択して進めてしまうと、以下のようなエラーが出ます。

Invalid id: "resolve:ssm:/spam/parameter/ami-id" (expecting "ami-...")

こちらについては公式の制約事項によるものですのでインスタンスタイプはご指定ください。(結構悩みました)
また、起動テンプレート側でインスタンスタイプを選択していれば、問題なく設定可能です。
引用元「制約」セクションに他制約事項もあるのでご確認く頂ければ幸いです。

EC2 フリートで属性ベースのインスタンスの選択を使用した場合は、AMI ID の代わりに Systems Manager パラメータを指定できません。属性ベースのインスタンスの選択を使用する場合は、AMI ID を指定する必要があります。
AMI ID のかわりに Systems Manager パラメータを使用する

雑記

AWS Systems Manager パラメータストアを使用することで、AMI ID の更新が容易になり、すべての関連する起動テンプレートに影響を与えることができます。
これにより、運用の効率化が図れます。特に、複数の環境で同じ AMI を使用する場合や、頻繁に AMI を更新する必要がある場合に便利です。ぜひこの方法を試してみてください。

AMIの更新自体を自動化したい!といった場合はさらにいろいろと準備が必要となります。その方法についても記事を書けたらと思います。

・「カスタム値/Systems Manager パラメータを設定」で設定した、動的参照が正しく動作しているかの確認方法
EC2コンソール画面より「AMIカタログ」より「▼」から確認可能です。
対象のSystems Manager パラメータを選択すると「現在、以下に解決されています」と表示され、値に入力している文字列が表示されます。
これが登録しているAMI IDであれば正しく動的参照が行われています。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら