[AWS] Lambda と EventBridge でリマインダー LINE Bot を作成する

[AWS] Lambda と EventBridge でリマインダー LINE Bot を作成する

こんにちは、じゅんじゅんです。突然ですが、私の住居では水曜日と日曜日がゴミを出す日です。日曜日は大丈夫なのですが、水曜日は週の真ん中ということもあり気付きにくく、ついゴミを出すのを忘れてしまいます。

ということで「水曜日と日曜日の21時になったら “ゴミを出せ!” というメッセージを送る LINE Bot」を Lambda と EventBridge を使ったサーバーレス構成で作成しましたので、作り方を紹介します。

対象読者

  • AWS 初心者でサーバーレスに興味がある方
  • LINE Bot 開発に興味がある方

1. LINE Message API の準備

LINE のメッセージを送るには LINE 公式の API である Message API を使用します。今回は任意のタイミングでユーザーにメッセージを送信する「プッシュメッセージ」という機能を使います。ちなみに Message API ではほかにもユーザーからのメッセージに応答したり、友達になってくれたユーザーにメッセージを送信したりできます。

LINE デベロッパーコンソールにログイン

LINE デベロッパーコンソール を開き、右上の「ログイン」をクリックします。

LINE デベロッパーコンソールにログイン (1)

LINE デベロッパーコンソールにログイン (1)

自身の LINE アカウントでログインします。

LINE デベロッパーコンソールにログイン (2)

LINE デベロッパーコンソールにログイン (2)

新規プロバイダーの作成

ログインできたらまずはプロバイダーを作成します。プロバイダーとは、公式で以下のように説明されています。

サービスを提供し、利用者の情報を取得する個人の開発者、企業、組織のことです。

ようするに開発ユーザーのアカウントです。プロバイダーは複数作成できます。

「プロバイダー」タブから「作成」をクリックします。

プロバイダー → 作成

プロバイダー → 作成

「プロバイダー名」に好きな名前を入力したら「作成」をクリックします。

新規プロバイダー作成

新規プロバイダー作成

チャネルの作成

次にチャネルを作成します。チャネルはプロバイダーが Messaging API を使用するための通信路のことです。

作成したプロバイダーページの「チャネル設定」タブから「新規チャネル作成」をクリックします。

チャネルの設定 → 新規チャネル作成

チャネルの設定 → 新規チャネル作成

「Message API」を選択します。

新規チャネル作成 → Message API を選択

新規チャネル作成 → Message API を選択

チャネル名、業種、メールアドレスなど必須項目を入力し、利用規約にチェックを入れたら「作成」をクリックします。

新規チャネル作成 → 各項目の入力

新規チャネル作成 → 各項目の入力

最後に表示される利用規約についての画面で「同意する」をクリックするとチャネルが作成されます。

作成されたチャネルをクリックし、「Message API設定」タブに表示されている QR コードをスマートフォンの LINE でスキャンして友達追加しておきます。

チャネルアクセストークンの発行

次にチャネルアクセストークンを発行します。チャネルアクセストークンは Messaging API で使用するアクセストークンです。

チャネルのページの「Message API設定」タブから、一番下の「チャネルアクセストークン(長期)」という欄にある「発行」ボタンをクリックします。

Message API設定 → チャネルアクセストークン → 発行

Message API設定 → チャネルアクセストークン → 発行

すぐに発行されるので控えておきます。

発行されたチャネルアクセストークン

発行されたチャネルアクセストークン

ここまで設定できれば LINE デベロッパーでの設定はいったん終了です。

2. Lambda 関数の準備

Lambda 関数を新規作成

ではいよいよ Lambda 関数を作成していきます。AWS コンソールにログインし、「サービス」から Lambda を選択したら「関数の作成」ボタンをクリックします。

Lambda → 関数の作成

Lambda → 関数の作成

「一から作成」を選択し、関数名を「notify_garbage_day」、ランタイムは「Node.js 14.x」としておきます。ほかは特に触らずに「関数の作成」ボタンをクリックします。

関数の作成 → 項目の入力

関数の作成 → 項目の入力

「notify_garbage_day」関数が作成されました。

「notify_garbage_day」関数を作成

「notify_garbage_day」関数を作成

環境変数の設定

次に、 Messaging API をたたくために必要なチャネルアクセストークンとメッセージの送信先のユーザー ID を環境変数に設定します。「notify_garbage_day」関数のページの「設定」タブから「環境変数」タブ、「編集」をクリックします。

「設定」タブ → 「環境変数」タブ → 「編集」

「設定」タブ → 「環境変数」タブ → 「編集」

「環境変数の追加」をクリックします。

「環境変数の追加」

「環境変数の追加」

キーに「ACCESS_TOKEN」、「USER_ID」と入力します。値のほうは、「ACCESS_TOKEN」については先ほど発行した「チャネルアクセストークン」を入力します。「USER_ID」は LINE デベロッパーコンソールの「チャネル基本設定」の一番下にある「あなたのユーザー ID」に記載されている文字列を入力します。

「ごみ捨てボット」 → 「チャネルの基本設定」タブ → 「あなたのユーザー ID」」

「ごみ捨てボット」 → 「チャネルの基本設定」タブ → 「あなたのユーザー ID」」

入力できたら「保存」をクリックします。

「環境変数の編集」

「環境変数の編集」

これで環境変数の設定ができました。

index.js の準備

いよいよコーディングをしていきます。作業用ディレクトリを作成したらそのディレクトリで以下のコマンドを実行して npm の初期化と LineBot SDK のインストールを行います。

npm init
npm i @line/bot-sdk

index.js を作成し、以下のように記載します。

index.js
const line = require("@line/bot-sdk");

const client = new line.Client({
  channelAccessToken: process.env.ACCESS_TOKEN
});

exports.handler = async event => {
  try {
    const message = {
      "type": "text",
      "text": "ゴミを出せ!"
    };
    
    await client.pushMessage(process.env.USER_ID, message);
  } catch (error) {
    console.log(error);
  }
};

pushMessage 関数の第一引数に送信先のユーザー ID 、第二引数にメッセージのオブジェクトを指定することで送信できます。

今回は「ゴミを出せ!」というテキストを送信するのでメッセージオブジェクトの typetext にしていますが、ほかにもスタンプ (sticker)、画像 (image)、動画 (video)、音声 (audio)、位置情報 (location) などが送信できます。

また、メッセージオブジェクトに sender.name プロパティー、sender.iconUrl プロパティーを指定することで、送信者の名前やアイコンの変更もできます。

メッセージオブジェクト
{
    "type": "text",
    "text": "Hello, I am Cony!!",
    "sender": {
        "name": "Cony",
        "iconUrl": "https://line.me/conyprof"
    }
}

詳しくはドキュメントを参照してください。

LINE Developers メッセージオブジェクト

記載ができたら、index.js があるディレクトリで zip -r deploy_package.zip * コマンドを実行するなどして zip 化します。

以下の記事に zip 化の際の注意点を記載していますので合わせてどうぞ。

[AWS] Lambda 実行時に発生するハンドラーやモジュールが見つからないエラーの解決法

「notify_garbage_day」関数の「コード」タブから「アップロード元」の「.zip ファイル」を選択します。

「コード」→「アップロード元」→「.zip ファイル」

「コード」→「アップロード元」→「.zip ファイル」

表示されるダイアログの「アップロード」をクリックし、作成した zip ファイルを選択し、「保存」をクリックします。

zip ファイルをダウンロード

zip ファイルをダウンロード

これで Lambda によってメッセージを送信する準備ができました。

3. EventBridge のルールを作成

最後に EventBridge で毎週水曜日と日曜日の21時に「notify_garbage_day」関数が実行されるよう設定します。

EventBridge とは、イベントを通じてさまざまなアプリケーションどうしを簡単に接続できるようにするサービスです。EventBridge は CloudWatch Events をベースに、さらに機能を発展させたサービスとなっています。

イベントは今回のようにスケジュールをトリガーにしたり、「Auto Scaring がインスタンスを増減させたら」など別の AWS リソースの状態変化をトリガーにできます。

「notify_garbage_day」関数のページ上部の「トリガーの追加」をクリックします。

「トリガーの追加」

「トリガーの追加」

「トリガーの設定」のプルダウンから「EventBridge」を選択し、「ルール」は「新規ルールの追加」を選択します。「ルール名」、「ルールの説明」はなんでもいいですが「Wednesday_and_Sunday」、「毎週水曜日と日曜日の21時に実行」としておきます。

「トリガーの設定」

「トリガーの設定」

「ルールタイプ」は「スケジュール式」を選択し、今回は cron 式でスケジュールを記載します。

cron 式は「分、時間、日、月、曜日、年」を空白で区切って指定していきます (詳しくはルールのスケジュール式 を参照) 。

毎週水曜日と日曜日の21時なら以下のようになります。

cron(0 12 ? * 1,4 *)

最初 (一番左) は「分」です。21時ちょうどに通知してほしいので「0」にします。

「時間」については、EventBridge の cron 式はタイムゾーンが UTC(協定世界時)となっているため、21時を指定する場合は9時間前の12時にする必要があります。

次に「日」です。今回は曜日を水曜日と日曜日に指定するため、特定の日に決まりません。こういう場合は「?」とします。

月と年についてはどの月、年においても適用させたいので、「すべて」を意味する「*」にします。

最後に「1,4」としている曜日です。1が日曜日、2が月曜日…と順番に数字が割り振られているため、日曜日と水曜日を表す「1,4」としています。

ではスケジュール式に「cron(0 12 ? * 1,4 *)」と入力して「追加」をクリックします。

スケジュール式を入力

スケジュール式を入力

「notify_garbage_day」 関数にトリガーを追加できました。

notify_garbage_day にトリガーを追加

notify_garbage_day にトリガーを追加

結果、ちゃんと水曜日と日曜日の21時に「ゴミを出せ!」というメッセージが通知されていました!

LINE Bot から届いたメッセージ

LINE Bot から届いたメッセージ

まとめ

今回は固定のメッセージを送信していましたが、 DynamoDB などのデータベースと合わせるとよりいろんな用途に活用できそうです。

AWS のサービスを学んでいくにつれて、組み合わせ次第でできることがどんどん増えていくので楽しいですね。

参考

junya-gera