はじめに
コロナ禍ですっかり疲れ切っている方も多いと思いますが、そんな時こそ一服の清涼剤が必要...ということで、Slackのチャンネルに猫の画像が定期的に届くサーバーレスなシステムを作ってみました。
なお、今回はThe Cat APIから猫の画像を拝借しています。
1. Cat APIのAPIキーの取得
-
The Cat APIのページを開いて、
SIGNUP FOR FREE
と書かれたボタンを押します。
- 遷移先のページで、メールアドレスを記入して
SIGNUP
を押してしばらく待つと、Welcome to The Cat API!Welcome to The Cat API!
というタイトルのメールが届きます。 -
App Discription
については任意項目らしいので、拙い英語で書いても大丈夫でした(笑) - このメールの中にAPIキーが記載されているので、それをメモしておきます。
2. 猫画像配信用のチャンネルの作成
- 猫の画像がSlackのチャンネルにどんどん投稿されるため、猫画像配信用のチャンネルを作成しておきます。
3. SlackのWebhook URLの取得
- 前の工程で作成したSlackのチャンネルに入り、
アプリを追加する
をクリックします。
- 遷移先の画面で検索欄に
webhook
と入力して、Incoming Webhook
をインストールします。
- ブラウザに以下の画面が表示されたら、
Slackに追加
を押してIncoming Webhookをインストールします。
- 遷移先の画面で、前の工程で作成したSlackのチャンネルを選択して、
Incoming Webhookインテグレーションの追加
を押します。
- 次の画面で、**「Incoming Webhook ○○○さんによって ○○○○年○○月○○日に追加されました」**と表示されれば、アプリのインストールは完了です。
- このページに
Webhook URL
と書かれている欄があるので、そこに書かれているURLをメモしておきます。 - また、このページの下部に
インテグレーションの設定
という設定画面があるため、今回はこの設定画面で以下の設定を変更しました。 - 名前をカスタマイズ:「The Cat API」に変更。
- アイコンをカスタマイズする:こちらの記事で作成した猫の画像をアップロード。
4. Lambdaのコードの作成
4-1. Lambda関数の基本情報
- 以下の内容を関数の
基本的な情報
に設定しました。 - 関数名:GetCatImage
- ランタイム:Ruby2.7
- アクセス権限(実行ロール):基本的なLambdaアクセス権限で新しいロールを作成
4-2. lambda_function.rbの作成
- 幾つかのサイトを参考にして以下のコードを書いてみましたが、
slack-notifier
が存在しないためエラーになってしまいました。 - そこで、以下のサイトを参考にして「Gemfileを作成」→「bundle install」→「bundle install --deployment」→「ZIPとしてアップロード」という手順で試してみたところ、ようやく正常に動作しました。
- 【ハンズオン】Ruby support for AWS Lambdaを使ってみる
- AWS Lambda の Ruby ランタイムを試す
- AWS Lambda上でgemがつかえない
lambda_function.rb
require 'json'
require 'net/http'
require "bundler/setup"
require 'slack-notifier'
def lambda_handler(event:, context:)
# Get image url from TheCatAPI.
res = Net::HTTP.get(URI.parse('https://api.thecatapi.com/v1/images/search?api_key=xxxxxxxxxx'))
json = JSON.parse(res)
url = json[0]["url"]
# Notification to Slack channel using Incoming Webhook.
notifier = Slack::Notifier.new('https://hooks.slack.com/services/xxxxxxxxxx')
notifier.ping(url, unfurl_links: true)
end
- なお、作成したGemfileは以下の通りです。
Gemfile
source 'https://rubygems.org'
gem 'slack-notifier'
- また、Linux環境で
bundle install
を実行すると、以下のフォルダ構成となります。
>bundle-installの実行結果@Windows環境
.
│ Gemfile
│ Gemfile.lock
│ lambda_function.rb
└─vendor
└─bundle
4-3. ZIPファイルのアップロード
-
bundle install --deployment
を実行したフォルダを、丸ごとZIPで圧縮します。 - 次にLambdaの関数(GetCatImage)の画面に入り、関数コードの[コードエントリ]を
.zipファイルをアップロード
として、ZIPファイルをアップロードします。 - アップロードファイルを選んだあと、画面右上の[保存]を押すとAWS側にアップロードされるようです。
- ここまで出来上がったら、[テスト]を実行して、Slackに通知が飛ぶかを確認します。
5. CloudWatchのイベントの作成
- Lambdaの関数のページの上部で[設定]タブを選び、[Designer]の領域で
トリガーを追加
を押します。 -
トリガーを追加
画面で、以下の内容を記入して[追加]を押します。 - トリガーの種類:CloudWatch Events/EventBridge
- ルールタイプ:スケジュール式
- スケジュール式:rate(1 hour)
- トリガーの有効化:チェックあり
- 上記のように、今回は「毎時1回猫の画像(のURL)を取得して、Slackに通知する」という形になります。
6. 完成形
- 以下のように、指定されたチャンネルに毎時猫の画像が投稿されます。
- 疲れた時は、このチャンネルを見てちょっとだけリフレッシュしましょう!
参考URL
AWS CLI
Lambda
- 【ハンズオン】Ruby support for AWS Lambdaを使ってみる
- AWS Lambda の Ruby ランタイムを試す
- AWS Lambda上でgemがつかえない
- 【AWS】lambdaファンクションを定期的に実行する