1
0

GmailトリガーでAWSのLambdaを起動する

Last updated at Posted at 2024-07-23

非エンジニアのバックオフィスが頑張るシリーズです。

今回は会社に関係なく個人的なニーズでやってます。今どき個人でもLambda関数のひとつやふたつ、もっているのが常識ですよね🙃
届いたメールでLambdaが起動したらきっと便利なはず!

やりたいこと

Gmailで特定条件のメールが来たら、Lambdaを起動したい

具体的な方針

  1. Gmailで特定条件のフィルタを作成しラベルをつける
  2. GASでGmail API を叩いてラベルのついたメールがあったらAWS API Gateway を叩く
  3. API Gateway から Lambda を起動する

作成編

今回は既に問題なく動く Lambda関数があって、デプロイ・テスト完了しているものとします。

Gmailのフィルタ設定

まずGmailで特定のラベルをつけるフィルタを設定します。(説明割愛)

API Gateway の準備

今回は単純にAPIを叩くだけで、パラメータ等の引き渡しはしませんので、簡単に作成します。

API Gateway 作成

「APIを作成」ボタンを押下します。
image.png

次の画面で REST API のところの「構築」ボタンを押下します。
image.png

「新しいAPI」を選択し、API名と説明は適当に。API エンドポイントタイプは「リージョン」、右下の「APIを作成」ボタンを押下します。
image.png

「メソッドを作成」ボタンを押下しメソッドの詳細画面へ。
image.png

「メソッドタイプ」は「ANY」を選択、「統合タイプ」は「Lambda 関数」を選択し
その下の「Lambda 関数」の検索欄で起動したい関数を選択します。
image.png
ここまで入力できたら一番下の「メソッドを作成」を押下
image.png

メソッドができましたのでAPIをデプロイします。右上の「APIをデプロイ」を押下します。

ステージを選択する画面が出ますので、ここでは新しいステージを作成します。ステージはエンドポイントのURLの末尾に付加されます。ここではtestとしておきますが、よしなに。
image.png

ステージの詳細の部分に、「URLを呼び出す」という記述があり、このURLがエンドポイントになりますので、コピーしておきます。

image.png

これで API ⇒ Lambda の部分は作成できました。

GASの作成

GASは今回はChatGPT 4o で作成しました。
payloadは不要なのですが、何か悪さをするわけでもなさそうなのでそのままにしておきます。
その他ざっとチェックして、問題なさそうに思えましたのでデプロイしちゃいます。
(ラベルを削除するところをさりげなく付けてくれたのえらいなあ)

Gmail2api.gs
function checkEmails() {
  var label = GmailApp.getUserLabelByName("YourLabelName");
  var threads = label.getThreads();
  for (var i = 0; i < threads.length; i++) {
    var thread = threads[i];
    var messages = thread.getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      // Webhook URLを設定
      var url = "https://your-api-gateway-url.amazonaws.com/your-endpoint";
      var payload = {
        "subject": message.getSubject(),
        "from": message.getFrom(),
        "body": message.getPlainBody()
      };
      var options = {
        "method": "post",
        "contentType": "application/json",
        "payload": JSON.stringify(payload)
      };
      UrlFetchApp.fetch(url, options);
    }
    // ラベルを削除して、同じメールが再度処理されないようにする
    thread.removeLabel(label);
  }
}

"YourLabelName" にラベル名
"https://your-api-gateway-url.amazonaws.com/your-endpoint"に先ほどのエンドポイントURLを設定します。

テスト

これで準備が整いましたので、実際に動くか試します。
トリガーはGmailでラベルのついたメールが存在したときなので、何でもよいので1通のメールにラベルをつけます。
GASのエディタの実行ボタンを押下して実行します。
GASの実行ログで実行完了が確認できたら、Lambdaの実行ログをCloudWatchで確認してLambdaが実行できていることを確認します。

定期実行

うまくいったならば、メールのラベルを定期的にチェックするようにGASのトリガーを設定します。GASのエディタの左側メニューにある「トリガー」を選択し、トリガー画面になったら右下の「トリガーを追加」から「分ベースのタイマー」で「1分おき」のトリガーを作成して保存します。
image.png

まとめ

これで特定のメールをトリガーにしてLambda が実行できます。
Zapier ではGmailからLambdaを呼び出す場合は有料になりましたが、GASとAPI Gatewayを使うなら個人レベルではおそらく無料でできるものと思います。API GatewayとLambdaは100万コールまで無料ですので。(料金の確認などは自己責任にてお願いいたします)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0