この記事はSORACOM Advent Calendar 2025の9日目の記事です。
はじめに
ソラカメAIとは、SORACOMが提供するクラウドカメラサービス「ソラカメ」に、生成AIによる画像解析機能を組み合わせたオプションサービスです。今回はそれを用いて、タイトルのようなものを作ってみました。
ちなみにですが、このアプリケーションの構成は会社の先輩である@Y_uuuさんが考案されています。
解決したい課題
弊社では、Outlookのカレンダーで会議室の予約を行う仕組みなのですが、会議室が必要なくなった際に予約の取り消しが忘れられてしまうということがたまに発生します。その結果、実際には利用可能な会議室が誰にも使われないという現象が起きていました。
解決案
そこで今回は、ソラカメAIとAmazon SES・S3・Lambda、Microsoft Graph、Slack APIを用いて、予約されている会議室が使用されていない場合にSlackへ通知するアプリケーションを作ってみることにしました。
作ったもの
まず、これが会議室が予約されているけど使われていない状態(の再現)です。
Outlookのカレンダー上ではこの会議室が予約されています。
(ご紹介が遅れましたが、手前の小さいサンタはSORACOM Advent Calendar 2025仕様のATOM Cam 2さんです。)
このとき、Slackにこのような通知が届くようになります。
ソラコムAIに渡したプロンプトは以下の通りです。
構造
以下が処理の流れです。
現状はソラカメAIからの通知はメールでしか受け取れないので、Amazon SESとS3を組み合わせてLambdaへの橋渡しをしています。
1. 会議室が使用されていなかったらソラカメAIが設定されたメールアドレスへ通知する
2. ソラカメAIからのメール通知をAmazon SESが受け取りAmazon S3にメールの内容を保存する
3. S3へのオブジェクト生成をイベントにAWS Lambdaが発動する
4. Microsoft GraphにアクセスしてOutlookのカレンダー情報を取得する
5. カレンダー上に会議室の予約が設定されていたらSlack APIを呼び出して通知する
インフラ構成は下図の通りです。
ソースコードは以下のリポジトリにて公開しています。
Nekonootete / soracame_outlook_slack_sample
Microsoft Graphには読み出し、Slack APIには書き込みのみ行う形で実装しています。
実装上のポイント
ここからは、実装上のポイントとなった部分をご紹介します。
ソラカメAIのプロンプト
当初は、会議室が使用されていたら
{"using": true}
使用されていなかったら
{"using": false}
という内容をメールの本文にするよう通知を設定していました。
テストで試してみたところ、下の画像のようにうまく分析できていました。
ただ、Lambda側での処理をシンプルにするために、会議室が使われていないときだけソラカメAIから通知を行うように、開発の途中で方針を変更しました。したがって、今回は以下のようなプロンプトとなっています。
ちなみに、どうして当初のプロンプトで1行目の指示が少し変わっているかというと、無条件に通知させたかったので「必ず通知してください」と付けてみたところ、うまくいかなかったからです。「時計(などの画像に必ず写るわかりやすいもの)が写っていたら通知してください」という条件にしてみたところうまくいったので、現状はこのやり方を無条件通知の実現方法として考えています。(もっとスマートなプロンプトがあればぜひ教えていただきたいです。)
Amazon SESで受け取ったメールをS3に保存する
今回の構成では、ソラカメAIからのメール通知をトリガーとしてLambdaを起動できるように、ソラカメAIとLambdaの間にAmazon SESとS3を置いています。
(将来的にはメールの本文を使ってもっと高度なこともできるようにこの構成にしています。)
設定方法についてはこのサイトを参考にしました。
Amazon SESでのメールの受信とS3へのオブジェクト生成方法
Amazon SESで設定したメールアドレスをSORACOMコンソールで検証する
Amazon SESで設定したメールアドレスをソラカメAIの通知先として選択できるようにするには、下の画像のように検証が必要です。このとき、検証用のリンクが入力したメールアドレスへ送信されますが、そのリンクを取得するには、S3のバケットに生成されたメールオブジェクトを開き、[https://console.soracom.io/operators/add_email_token/verify?]で始まる文字列を取り出してアクセスする必要があります。
具体的な設定方法については以下を参考にされてください。
ソラカメAIの設定方法
S3をAWS Lambdaのイベントに設定する
ここからはLambdaを実装していきます。まず、以下のようにLambdaのイベントにS3バケットへのオブジェクト生成を設定します。これにより、「SESがメールを受信 → S3にオブジェクト生成 → Lambda発動」という流れが出来上がります。
Events:
S3:
Type: S3
Properties:
Bucket: !Ref MailBucket
Events: s3:ObjectCreated:*
Microsoft GraphでOutlookのカレンダー情報を取得する
次に、Outlookのカレンダーから予約状況を取得する部分を実装します。
こちらのサイトを参考に処理を記述していきます。
Outlookのカレンダーから予定を取得する方法
今回の開発でのポイントは、以下の2つです。
- ソラカメAIからの通知が来た時点で予約されているかを調べるために、req.paramsでの開始・終了時刻を現在に設定する
- 後に作成するSlack通知メソッドの実行条件として使えるように、予約の有無を真偽値で表す
Slackに通知する
最後に、前述の予約状況確認メソッドの戻り値がtrueだった場合はSlackへ通知させるよう実装します。
def post_to_slack(channel)
client = Slack::Web::Client.new
text = '予約されている会議室に人がいないようです...'
client.chat_postMessage(channel:, text:)
end
ちなみに、Slack APIの使い方については、こちらの電子書籍がとてもわかりやすいのでおすすめです。
AWSとRubyではじめるサーバーレス入門
まとめ
今回はソラカメAIからのメール本文は使いませんでしたが、メールの内容を工夫してLambdaで取り出すことで、もっと利用の幅が広がると思います。
ソラカメAIに興味を持っていただけた方はぜひお試しいただき、もしよければフィードバックをいただけますと幸いです!











