毎年、lambda を使っているとランタイムのEOL 来ますよね。目的によってはLambda ではなくて、Step functions でいいものもきっとあると思うんです。ということでやってみます。今回はAmazon Q の力も借りながら効率的に進めていけるかも検証してみます。
Amazon Q についての検証は以前のブログでも書いているので、見ていただけますと励みになります。
今回はstep functions のブログになるので、宣伝はこれくらいにして、目的に戻ります。
今回の目的
step functions でEC2 の停止を自動化することです。EC2 がある前提で進めていきますので、まだ作成していない方はこの段階で作成しておいてください。Step functions のみではなく、step functions の後に、EventBridge で定期的に実行されるようにも設定していきます。Eventbridge がトリガーになって、step functions が実行される形です。
分かりやすいように、下に構成図も記しておきます!
今回の構成図
Eventbridge のcron の時刻がトリガーになって、step functions が実行されて、EC2 が停止するというイベントです。

手順
Step Functions を作成していく
ステートマシンの作成
今回は空白からの作成を選んで作っていきます。

ワークフロー初期ページ
ワークフローが表示されます。ここで色々どんな操作をするのかを記述してきます。

Amazon Q にjson 形式で処理を書いてもらう
Amazon Q に質問してみました!
workflow を組みたいので、EC2 の状態を取得してから、
running のstatus になっていたら、停止するというjson を例としてかけますか?
※「例としてかけますか」という文言を抜かしてしまうと、どうも実際のEC2 から探そうとするみたいなので、結果何もレスポンスが返ってこないか、答えることができませんというエラーが出るので、注意です。
そうすると以下のjson を記述してくれました。
{
"Comment": "A state machine that stops EC2 instances with Name tag 'stg'",
"StartAt": "Describe EC2 Instances",
"States": {
"Describe EC2 Instances": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:ec2:describeInstances",
"Parameters": {
"Filters": [
{
"Name": "tag:Name",
"Values": ["stg"]
}
]
},
"Next": "Check Instances"
},
"Check Instances": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.Reservations[0].Instances[0]",
"IsPresent": true,
"Next": "Stop Instances"
}
],
"Default": "No Instances Found"
},
"Stop Instances": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:ec2:stopInstances",
"Parameters": {
"InstanceIds.$": "$.Reservations[*].Instances[*].InstanceId"
},
"End": true
},
"No Instances Found": {
"Type": "Pass",
"Result": "No instances with tag Name:stg found",
"End": true
}
}
}
作成したworkflow
下記のworkflow が今回作成したものになります。

IAM role の設定
Step functions がEC2 にアクセスできるようなロールを作成していきます。今回は、EC2 のFull access のポリシーを設定して、Role はsts の設定をしていきます。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "states.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Eventbridge スケジューラー設定
Eventbridge スケジューラの設定は以前ブログで書いたので、詳細について知りたい場合は、こちらのブログを見てみてください。
スケジュール
スケジュールを設定します。検証なので、一回限りですが、個人で適切な設定をしてください。

step functions の設定
テンプレートされたターゲットを選択して、対象のstep functions を選択します。startExecution を選択してください。

テスト実行してみます
今回は、name tag で、stg とついているものを対象になるので、入力にはName stg に設定します。

step functions 内確認
EC2 が存在していれば、左側の条件が実行されます。EC2が存在しなければ、何も実行しないの方にフローが流れます。

まとめ
今回はStep functions を使ってみましたが、json 定義になるので更新などもなくなるので、とても簡単に更新などもできそうです。今回は、No instances Found にしてしまっていたので、起動していたらpass しますの設定にすることであったり、できていませんでした。本番運用に乗せるには、もう少し工夫する必要があります。
参考サイト

コメント