gokigenmaruのブログ

40から始めるクラウドエンジニア

オートスケーリンググループで起動・停止したEC2をEventBridgeを使って捕捉する

前回お話したIPv6の話の続きです。
(C) 2台の NLB でターゲットグループのタイプを「IPアドレス」にし ASG でノード入れ替えを検出する仕組みを実装
この仕組みを実装するためには、オートスケーリンググループでEC2が起動・停止した際に、起動・停止したEC2のIPv6アドレス情報を取得しターゲットグループに設定をしなければいけません。
仕組みとしては、以下2つに分かれます。
・EC2の起動・停止を捕捉する仕組みを作る
・捕捉したEC2のIPv6アドレスをターゲットグループで設定する

今回は「EC2の起動・停止を捕捉する仕組みを作る」のお話となります。

EC2の起動・停止を捕捉する

EC2の起動・停止を捕捉する仕組みを作りにあたり、AWSで何かいいマネージドサービスはないかと探したところ、おあつらえ向きなサービスがありました。
aws.amazon.com

EventBridge
簡単に言うとAWS上で発生するイベント(イベントは、AWS 環境の変化)を検知してターゲット(Lambdaとか)に情報を送るものです。
これが結構便利で、今回は特定のオートスケーリンググループのEC2の起動・停止を検知してLambdaに送るようにしましたが、それ以外にもいろいろと使えそうな感じでした。

EventBridgeを設定する

設定方針は、「特定のオートスケーリンググループのEC2の起動・停止を検知」となります。

設定はとても簡単でした。
まず、マネージドコンソールからAmazon EventBridgeに移動し、ルールを選択。

EB設定1

ルールを作成

EB設定2

ルールの詳細を定義画面で名前を入れる

EB設定3

イベントパターン構築画面でイベントソースとして「AWS イベントまたは EventBridge パートナーイベント」を選択

EB設定4

イベントパターン構築画面の下にあるイベントパターンで
イベントソース:AWSのサービス
AWSのサービス:Auto Scaling
イベントタイプ:Instance Launch nand Terminate
特定のインスタンスイベント:「EC2 Instance Launch Successfull」と「EC2 Instance-terminate Lifecycle Action」
※「EC2 Instance Terminate Successfull」ではなく「EC2 Instance-terminate Lifecycle Action」としている理由は後述します。
特定のグループ名:設定したいオートスケーリンググループの名前

EB設定5

ターゲットを選択画面で、いったんSNSトピックとかを選択しておきます。

EB設定6

タグは任意で設定して

EB設定7

これで作成をすればEventBridgeの設定は完了です。

なぜ特定のインスタンスイベントで「EC2 Instance-terminate Lifecycle Action」にするのか

なぜ特定のインスタンスイベントで「EC2 Instance-terminate Lifecycle Action」を設定したのか、その理由を説明します。
今回のEventBridgeの目的は「起動・停止したEC2のIPv6アドレス情報を取得する」となります。
そのためにLambdaの作成をしますが、この時に「EC2 Instance Terminate Successfull」だと1つ問題が発生しました。
Lambdaですが、EventBridgeで取得したEC2のIDを元にインスタンスを特定し、そのインスタンスで利用しているIPv6アドレスを取得する仕組みにしています。
「EC2 Instance Terminate Successfull」とした場合、何が問題になるかというと、Terminateが完了している状態はNICをEC2が手放してしまっている状態のため、インスタンスが持っていたIPv6アドレスを取得できなくなってしまうということでした。
当初、この問題を解決するためにDynamoDBに起動したEC2のインスタンスIDとIPv6アドレスを格納して停止した際にはそこの情報を持ってきてやろうかなと思ったのですが、なんかいけてないと考え、Terminate中のEC2を捕捉できないかと考えました。
そこで探して見つけたのが、こちら。
docs.aws.amazon.com
オートスケーリンググループのこの機能を使うと、ライフサイクルイベントが発生したときにカスタムアクションを実行できることとなります。
つまり、EC2のTerminate中にEventBridgeで検知してLambdaを動かせる!
この機能をEventBridgeで使うために「EC2 Instance Terminate Successfull」ではなく、「EC2 Instance-terminate Lifecycle Action」にしています。