LoginSignup
0
0

Step FunctionでLambdaでスポットリクエストを実行し、ElasticIPを付け替える(EC2スポットインスタンス自動化5)

Last updated at Posted at 2023-09-03

背景(再掲)

個人向けに最低費用で運用するため、Ec2をスポットインスタンスで使用しているが、時々スポットリクエストが中断される。その都度、再度スポットリクエストで立ち上げなおしているが、この処理を自動化したい。

大まかな流れ(再掲)

スポットインスタンスの中断はイベント通知されるので、それをトリガとして、立ち上げ処理を行う。

全体の流れは第1回参照。本記事はスポットリクエストの中断イベントから対象の情報を取得する部分が対象。

記事の全体

  1. AWS BackupでEC2のAMIが作成されるので、その最新のAMI IDをイベントから取得してParameterStoreに登録する。
  2. AWS Lambda(python)でLINEへ通知する。
  3. AWS Lambda(python)でEC2スポットリクエストを実行する。
  4. AWS Lambda(Python,boto3)でElasticIPを付け替える。
  5. Step FunctionでLambdaでスポットリクエストを実行し、ElasticIPを付け替える。←今回の内容

調べたこと

Step Functionは初めて使用するため、まず利用料金を調べる・・・。
状態遷移の回数にて課金されるが、今回のユースケースでは無料枠に十分収まる。

Eventの取り扱いには細心の注意が必要。

パラメータ受け渡しについて。

同期 or 非同期で呼び出しが可能。今回のケースでは同期で実装する。

Step Functionsの使い方(Input/Output)
https://zenn.dev/ken_11/articles/4c61683629f45f

Step Functionsの方針

  • ループ構成にしない
    • 想定外に実行されることを避ける。
  • 極力SSMからパラメータを取ってくる

※色々やっているうちに、Step Functionを使わなくてもよさそうでしたが、勉強のためにあえて使うことにしました。

①Step Functionsの実行

EventBridgeからStepFunctionに連携します。

②StepFunctionsの流れ

  1. EventBridgeからStepFunctionsに連携し、StepFunctiosのステートマシンが起動される。
  2. スポットリクエストのLambdaへEventBridgeからのイベントを受け渡して実行する。
  3. スポットリクエストのLambdaの実行結果(Output)から、新規インスタンスIDの有無を見て起動されたかどうか判断する。起動したインスタンスがない場合は、通知用Lambdaの入力(Input)に渡して通知する。
  4. インスタンスが起動している場合は、EC2の起動時間を少々待った後にElastic IPアドレスの付け替え用Lambdaに実行結果を連携する。
  5. 4.の結果を通知用Lambdaの入力に渡して通知する。

Step Fuctionsの設定

ステートマシンを作成する。ブランクで作成。
image.png

作成画面が表示される。
image.png

ドラッグ&ドロップで必要な要素を追加する。
image.png

Lambda関数を指定。
image.png

ひとまず、状態名とLamda関数のみ指定し、全体のフローを作成。
(最初にLambda関数を指定しておくと、ステートマシン実行時のIAMロールに対象の関数に対する実行権限が追加される模様。)
image.png

結果判定部分では、出力中のインスタンスIDの有無を確認します。
image.png

スポットリクエスト実行後、EC2が起動してElastic IPが関連付けできるまで、少々時間がかかるのでWaitをいれて30秒ほど待つことにします。
image.png

Line通知用は入力をメッセージ部分のみを指定しておきます。
image.png

デバッグ時はログを取得しておいた方がよいでしょう。
image.png

右上の作成を押すと確認画面が出る。
image.png

ステートマシンが作成される。
image.png

StepFunctionの動作確認

最初のLambdaのペイロードに、イベントのサンプルを入れて動作を確認します。
(インスタンスIDのみ実際の起動中EC2インスタンスIDに合わせておきます。)
image.png

(サンプルイベント).json
{
    "version": "0",
    "id": "12345678-1234-1234-1234-123456789012",
    "detail-type": "EC2 Spot Instance Interruption Warning",
    "source": "aws.ec2",
    "account": "123456789012",
    "time": "yyyy-mm-ddThh:mm:ssZ",
    "region": "us-east-2",
    "resources": ["arn:aws:ec2:us-east-2:123456789012:instance/i-1234567890abcdef0"],
    "detail": {
        "instance-id": "インスタンスID",
        "instance-action": "action"
    }
}

実行を押して、以下の確認画面はそのままで実行します。
image.png

実行結果を確認します。
image.png

EventBridgeの設定

StepFunctionの入力のペイロードはテスト用のイベントを消しておきます。
image.png

EventBridgeでは、スポットインスタンスの中断イベントを契機に、StepFunctionで作成したステートマシンへ連携します。

対象のイベントパターンは以下の通り。
image.png
ターゲットの指定。
image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0