AWS StepFunctionsがどんなサービスか分かったので使ってみる!
StepFunctionsで実現することはこちら
おくすり登録lambda関数(引数に薬の名前・服用回数を受け取り、薬の名前と服用タイミングを返す)
リマインダーlambda関数(引数に開始時間・イベント名を受け取り、SES送信)
これだけだったら普通にlambdaの連続実行でいいんですけどね^^;
なんちゃってマイクロサービスでリマインダー機能は独立させておいて今後の(あるか分からない)機能拡張により
レッスン予定登録、資格勉強タスク登録…など他の機能からも汎用的に実行できる構成にしたということで!!
Lambda関数を作成
おくすり登録関数
引数はこんな感じ
{
"name": "ステロイド1/6錠",
"timesDaily": "2"
}
exports.handler = async(event) => {
let start;
if (event.timesDaily == 1) {
start = "15:00";
}
else if (event.timesDaily == 2) {
start = "10:00, 17:00"
}
else if (event.timesDaily == 3) {
start = "10:00, 15:00, 20:00"
} else {
return
}
const response = {
statusCode: 200,
start: start,
title: "[おくすり]" + event.name
};
return response;
};
リマインダー関数
var AWS = require('aws-sdk');
AWS.config.update({ region: 'ap-northeast-1' });
var params = {
Destination: {
CcAddresses: [],
ToAddresses: [
'メールアドレス',
]
},
Message: {
Body: {
Html: {
Charset: "UTF-8",
Data: "HTML_FORMAT_BODY"
},
Text: {
Charset: "UTF-8",
Data: "TEXT_FORMAT_BODY"
}
},
Subject: {
Charset: 'UTF-8',
Data: 'my reminder'
}
},
Source: 'メールアドレス',
ReplyToAddresses: [],
};
exports.handler = function(event, context, callback) {
params.Message.Subject.Data = "[reminder]" + event.start + event.title;
params.Message.Body.Html.Data = "本日のスケジュール<br>" + event.start + " : " + event.title;
params.Message.Body.Text.Data = "本日のスケジュール¥n" + event.start + " : " + event.title;
return new AWS.SES({ apiVersion: '2010-12-01' }).sendEmail(params).promise();
}
関数をStepFunctionsで実行
それでは作成した2つの関数をStepFunctionsから連続実行してみます!
ステートマシン(StepFunctionsで実行する処理をまとめたもの)を作成して実行すればOK
マネジメントコンソールからステートマシン作成をすると作成方法が選択できる
これまではjsonを書いて作成していたみたいだけど、このようにフロー図にドラッグ&ドロップで簡単配置★!
ステートマシンが作成できたのであとは実行するだけ って失敗してる!
because no identity-based policy allows the lambda:InvokeFunction action
いつも通り実行ロールがないエラーですね。(AWSで何か試そうとすると遭遇率100%なんだよな。。)
AWSLambdaRoleをアタッチして再度実行!今度は正常終了しました
リマインドのメールも届きました!