背景(再掲)
個人向けに最低費用で運用するため、Ec2をスポットインスタンスで使用しているが、時々スポットリクエストが中断される。その都度、再度スポットリクエストで立ち上げなおしているが、この処理を自動化したい。
大まかな流れ(再掲)
スポットインスタンスの中断はイベント通知されるので、それをトリガとして、立ち上げ処理を行う。
全体の流れは第1回参照。本記事はスポットリクエストの中断イベントから対象の情報を取得する部分が対象。
記事の全体
- AWS BackupでEC2のAMIが作成されるので、その最新のAMI IDをイベントから取得してParameterStoreに登録する。
- AWS Lambda(python)でLINEへ通知する。←今回の内容
- AWS Lambda(python)でEC2スポットリクエストを実行する。
- AWS Lambda(Python,boto3)でElasticIPを付け替える。
- Step FunctionでLambdaでスポットリクエストを実行し、ElasticIPを付け替える。
通知用Lambda
スポットリクエストを実行した結果をLINEで受けとりたいので、通知用のLambdaを用意しておきます。
eventデータとして、LINEに通知する内容を受けることを前提にしています。
解説は色々な記事があるので割愛します。
(TOKENなどはLambdaの環境変数に設定し、コードへ記載しない形としています。)
(想定イベント).json
[
{
"type" : "text",
"text" : "test event"
},
{
"type" : "sticker",
"packageId" : 6370,
"stickerId" : 11088017
}
]
(通知用Lambda関数).py
import os
import json
import requests
line_notify_api = os.environ.get('LINE_NOTIFY_API')
line_notify_token = os.environ.get('LINE_NOTIFY_TOKEN')
user_id = os.environ.get('USER_ID')
def lambda_handler(event, context):
print('event:' + json.dumps(event))
return notifyToLine(event['messages'])
def notifyToLine(messages):
data = {
'to' : user_id,
'messages' : messages
}
headers = { 'Content-Type' : 'application/json',
'Authorization' : 'Bearer ' + line_notify_token}
r = requests.post(line_notify_api, headers=headers, data=json.dumps(data).encode())
return str(r.status_code) + r.text