非エンジニアのバックオフィスが頑張るシリーズです。
今回は会社に関係なく個人的なニーズでやってます。今どき個人でもLambda関数のひとつやふたつ、もっているのが常識ですよね🙃
届いたメールでLambdaが起動したらきっと便利なはず!
やりたいこと
Gmailで特定条件のメールが来たら、Lambdaを起動したい
具体的な方針
- Gmailで特定条件のフィルタを作成しラベルをつける
- GASでGmail API を叩いてラベルのついたメールがあったらAWS API Gateway を叩く
- API Gateway から Lambda を起動する
作成編
今回は既に問題なく動く Lambda関数があって、デプロイ・テスト完了しているものとします。
Gmailのフィルタ設定
まずGmailで特定のラベルをつけるフィルタを設定します。(説明割愛)
API Gateway の準備
今回は単純にAPIを叩くだけで、パラメータ等の引き渡しはしませんので、簡単に作成します。
API Gateway 作成
次の画面で REST API のところの「構築」ボタンを押下します。
「新しいAPI」を選択し、API名と説明は適当に。API エンドポイントタイプは「リージョン」、右下の「APIを作成」ボタンを押下します。
「メソッドタイプ」は「ANY」を選択、「統合タイプ」は「Lambda 関数」を選択し
その下の「Lambda 関数」の検索欄で起動したい関数を選択します。
ここまで入力できたら一番下の「メソッドを作成」を押下
メソッドができましたのでAPIをデプロイします。右上の「APIをデプロイ」を押下します。
ステージを選択する画面が出ますので、ここでは新しいステージを作成します。ステージはエンドポイントのURLの末尾に付加されます。ここではtestとしておきますが、よしなに。
ステージの詳細の部分に、「URLを呼び出す」という記述があり、このURLがエンドポイントになりますので、コピーしておきます。
これで API ⇒ Lambda の部分は作成できました。
GASの作成
GASは今回はChatGPT 4o で作成しました。
payloadは不要なのですが、何か悪さをするわけでもなさそうなのでそのままにしておきます。
その他ざっとチェックして、問題なさそうに思えましたのでデプロイしちゃいます。
(ラベルを削除するところをさりげなく付けてくれたのえらいなあ)
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分おき」のトリガーを作成して保存します。
まとめ
これで特定のメールをトリガーにしてLambda が実行できます。
Zapier ではGmailからLambdaを呼び出す場合は有料になりましたが、GASとAPI Gatewayを使うなら個人レベルではおそらく無料でできるものと思います。API GatewayとLambdaは100万コールまで無料ですので。(料金の確認などは自己責任にてお願いいたします)