はじめに
AutoScalingでEC2インスタンスを立ち上げる際に、自動でインスタンス名に連番を振りたい場合があると思います。
しかし現状ではAWSの機能だけでユニークな名前をつけることはできません。
実務でどうしてもインスタンスに自動で連番を振りたいケースがあったのでやり方を考えてみました。
パッと思いつくのは
・AutoScalingの起動時にSNS経由でLambdaを呼び出して命名
・EC2起動時のユーザーデータを使って名前を更新
あたりだったので、今回は余計なリソースを作成せずに済むユーザーデータのパターンでやってみました。
◆GitHubはこちら
テンプレート
今回作成したテンプレートは上記のものになります。
このテンプレートの中で連番をつけるために特別なことをしたのは、
・ユーザーデータ内でインスタンス一覧を取得して、Nameタグを更新。(153-155行目)
・EC2一覧とタグの作成が行えるIAMロールを作成。(170-171行目)
ということくらいでしょうか。
パラメータ
InstanceName | EC2インスタンスの名前。後ろに-01などの連番が付与されます。 |
InstanceType1 | 優先的に実行するインスタンスタイプを選択します。 |
InstanceType2 | 予備のインスタンスタイプを選択します。(スポットインスタンス用の設定) |
EC2SubnetIDs | EC2インスタンスを立てるサブネットを選択します。 |
KeyName | EC2インスタンスに接続するためのキーペアを選択します。 |
ImageId | 実行するEC2のAMIのIDを入力します。 |
ECSSecurityGroups | ECSインスタンスにアタッチするセキュリティグループを選択します。 |
ScalingDesiredCapacity | EC2インスタンスの希望数です。 |
ScalingMaxSize | EC2インスタンスの最大数です。 |
ScalingMinSize | EC2インスタンスの最小数です。 |
OnDemandInstancePercentage | オンデマンドインスタンスの割合を設定します。 |
挙動について
このテンプレートを作成すると、まずは「インスタンス名-00」という名称のインスタンスが実行されます。
その後、しばらくすると各インスタンスに連番が割り当てられます。
各インスタンスが起動したときに、自分自身に対する名前の更新を行うようになっています。
そのため、新しいインスタンスが起動したことで従来のインスタンスの連番が更新されることはありません。
おわりに
ユーザーデータを使って自動的に連番を割り当てるAutoScalingを作成しました。
とりあえず動けばいいやの精神でワンライナーな更新コマンドを作っていたのでもう少し上手くやり用があったかなと思うのですが、あくまで個人ブログレベルのクオリティということはご了承ください。
もっと厳密にやるならIAMロールについても権限を絞った方が良かったり、同時実行対策をランダムSleep処理じゃなくてきちんと厳密にチェックさせたり、ミリ秒単位の差分をきちんと測ったりすべきなんですが、概ね意図した動作になるということで今の形で公開することにしました。
これをベースにより良いものを作る参考程度になれば幸いです。
コメントを残す