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

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

今回は会社に関係なく個人的なニーズでやってます。今どき個人でもLambda関数のひとつやふたつ、もっているのが常識ですよね🙃
届いたメールでLambdaが起動したらきっと便利なはず！
# やりたいこと
Gmailで特定条件のメールが来たら、Lambdaを起動したい
# 具体的な方針
1. Gmailで特定条件のフィルタを作成しラベルをつける
1. GASでGmail API を叩いてラベルのついたメールがあったらAWS API Gateway を叩く
1. API Gateway から Lambda を起動する
# 作成編
今回は既に問題なく動く Lambda関数があって、デプロイ・テスト完了しているものとします。
## Gmailのフィルタ設定
まずGmailで特定のラベルをつけるフィルタを設定します。（説明割愛）
## API Gateway の準備
今回は単純にAPIを叩くだけで、パラメータ等の引き渡しはしませんので、簡単に作成します。
## API Gateway 作成
「APIを作成」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/f8484b5e-5348-38b1-5c4d-7f8e1afceb8a.png)

次の画面で REST API のところの「構築」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/ec8a2c41-38db-84d7-d302-23e9080e3bc7.png)

「新しいAPI」を選択し、API名と説明は適当に。API エンドポイントタイプは「リージョン」、右下の「APIを作成」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/5a736a19-029d-7bc1-9214-962be6af0b1e.png)

「メソッドを作成」ボタンを押下しメソッドの詳細画面へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/c6330a70-d6fc-ffac-1d48-dc5cfd8e2256.png)

「メソッドタイプ」は「ANY」を選択、「統合タイプ」は「Lambda 関数」を選択し
その下の「Lambda 関数」の検索欄で起動したい関数を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/ca495cd3-9f5b-83fc-ec0d-22df6dd83d9a.png)
ここまで入力できたら一番下の「メソッドを作成」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/01ba1029-da38-29c9-3b36-c2aec89f7ab7.png)

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

ステージを選択する画面が出ますので、ここでは新しいステージを作成します。ステージはエンドポイントのURLの末尾に付加されます。ここではtestとしておきますが、よしなに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/5dbd0bf5-40e2-5986-018d-109beb43b9be.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/9598be50-c92a-071a-6025-25eeedf0de12.png)

これで API ⇒ Lambda の部分は作成できました。
## GASの作成
GASは今回はChatGPT 4o で作成しました。
payloadは不要なのですが、何か悪さをするわけでもなさそうなのでそのままにしておきます。
その他ざっとチェックして、問題なさそうに思えましたのでデプロイしちゃいます。
（ラベルを削除するところをさりげなく付けてくれたのえらいなあ）
```javascript: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840360/2837fee2-bc94-46e2-ff97-59719f72ff19.png)
# まとめ
これで特定のメールをトリガーにしてLambda が実行できます。
Zapier ではGmailからLambdaを呼び出す場合は有料になりましたが、GASとAPI Gatewayを使うなら個人レベルではおそらく無料でできるものと思います。API GatewayとLambdaは100万コールまで無料ですので。（料金の確認などは自己責任にてお願いいたします）