buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

Step FunctionsでLambdaを連続実行してみる

AWS StepFunctionsがどんなサービスか分かったので使ってみる!

StepFunctionsで実現することはこちら

  1. おくすり登録lambda関数(引数に薬の名前・服用回数を受け取り、薬の名前と服用タイミングを返す)

  2. リマインダー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;
};

リマインダー関数

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({ region: 'ap-northeast-1' });

// Create sendEmail params 
var params = {
    Destination: { /* required */
        CcAddresses: [],
        ToAddresses: [
            'メールアドレス',
        ]
    },
    Message: { /* required */
        Body: { /* required */
            Html: {
                Charset: "UTF-8",
                Data: "HTML_FORMAT_BODY"
            },
            Text: {
                Charset: "UTF-8",
                Data: "TEXT_FORMAT_BODY"
            }
        },
        Subject: {
            Charset: 'UTF-8',
            Data: 'my reminder'
        }
    },
    Source: 'メールアドレス',
    /* required */
    ReplyToAddresses: [],
};

// Handle promise's fulfilled/rejected states
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を書いて作成していたみたいだけど、このようにフロー図にドラッグ&ドロップで簡単配置★!

f:id:butorisa:20211218111404p:plain

ステートマシンが作成できたのであとは実行するだけ って失敗してる!

f:id:butorisa:20211218111855p:plain

because no identity-based policy allows the lambda:InvokeFunction action

いつも通り実行ロールがないエラーですね。(AWSで何か試そうとすると遭遇率100%なんだよな。。)

AWSLambdaRoleをアタッチして再度実行!今度は正常終了しました

f:id:butorisa:20211218113130p:plain

リマインドのメールも届きました!

f:id:butorisa:20211218113447p:plain