猫の画像が次々届くサーバーレスなシステム


はじめに

コロナ禍ですっかり疲れ切っている方も多いと思いますが、そんな時こそ一服の清涼剤が必要...ということで、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の作成

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

SlackのWebhook