AWS Lambdaで猫の画像を1時間に1回 Slackに投稿する 🐾

# AWS Lambdaで猫の画像を1時間に1回 Slackに投稿する 🐾

今まで働いてきた会社には、どの会社にも当たり前のように猫に関連するチャンネルがありました。

今回は、猫の画像で時報をお知らせするAWS Lambdaの関数を作ってみたいと思います。

## 猫の画像を準備する 🐈

画像を自分で集めたり、それをストレージに置いてインデックスするのは大変です。

今回は、Cat as a ServiceであるThe Cat APIを利用します。

[The Cat API - Cats as a Service](https://thecatapi.com/)

### 余談 🐶

犬派の人も安心してください、Dog as a ServiceであるThe Dog APIもちゃんとあります。

[The Dog API - Dogs as a Service](https://www.thedogapi.com/)

### Pricing 💰

気になるお値段ですが、今回はFreeプランで十分です。

![スクリーンショット 2021-03-11 12.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127585/247c4d41-33a6-5272-f65a-0a4527b3fedc.png)

Paidプランだと、追加機能が利用可能です。

- Curated Facts / Jokes / Quotes
- Analytics
- Higher resolution Pictures
- Premium Images
- Video
- Realtime web hooks

※ 2021年3月現在、まだPaidプランは利用できませんが順番待ちが可能です。

``` text
Thanks for showing interest in the premium version of the Cat API.
We're running a few weeks behind on launching the new subscription service. 
```

### The Cat APIのサインアップとテスト 📮

今回は、Freeプランでサインアップしてみましょう。

`SIGNUP FOR FREE` をクリックし、メールアドレスを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127585/badd0cf3-9b72-1b3a-8d77-b607b8b16465.png)

サインアップが完了すると、メールでAPIキーが届きます。

また、遷移先のページでサンプルコードを確認することもできます。

メールで届いたAPIキーと、サンプルコードを使ってテストしてみてください。

## Pythonコードを準備する ✏️

雑にベタ書きします。

AWS Lambdaで利用する為、`requests` ではなく `urllib` を利用します。

※ The Dog APIを利用する場合は、URLを差し替えて下さい

Slackに投稿する、Incoming WebhookのURLは作成しておきましょう。

``` python
# -*- coding: utf-8 -*-

import urllib.request
import json

CAT_API_URL = "https://api.thecatapi.com/v1/images/search"
CAT_API_KEY = "{API_KEY}"
SLACK_URL = "{SLACK_WEBHOOK_URL}"

def get_cat():
    headers = {'content-type': 'application/json', 'X-API-KEY': CAT_API_KEY}

    req = urllib.request.Request('{}?{}'.format(CAT_API_URL, urllib.parse.urlencode(headers)))
    with urllib.request.urlopen(req) as res:
        body = res.read().decode()

    response = json.loads(body)
    for i in response:
        return i["url"]

def lambda_handler(event, context):
    cat = get_cat()
    payload = {
        "text": cat
    }

    data = json.dumps(payload)
    headers = {
        'Content-Type': 'application/json',
    }

    req = urllib.request.Request(SLACK_URL, data.encode(), headers)
    with urllib.request.urlopen(req) as res:
        body = res.read()
```

## AWS Lambdaで動かす ⚙️

### Lambda Functionを作成 ✨

AWS Management Consoleにアクセスし、サービス `Lambda` を選択します。

`新しい関数` を作成します。

- 一から作成 を選択する
- 関数名は適当に入力
- ランタイムは `Python 3.8` を選択する
- 必要に応じて、IAMロールを選択・作成する

### コードをデプロイする 📝

画面中央部にある、コード / コードソースにPythonコードをペーストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127585/f7474a22-5fca-8239-f62d-da6adc524974.png)

ペーストしたら、 `Deploy` をクリックしてデプロイします。

### コードをテストする 👩‍💻

`Deploy` ボタンの隣りにある `Test` を選択し

空のテストを作成し、実行します。

（今回のコードには、テストイベントを渡す必要はありません）

## 1時間に1回実行する 🕒

トリガーを作成します。

トリガーの作成から、 `EventBridge (CloudWatch Events)` を検索して選択しましょう。

### Amazon Event Bridgeで、cron式のトリガーを作成する

``` text
cron(00 1-11 ? * MON-FRI *)
```

Lambdaの実行環境側はGMTの為、9時間ずらします。

👆の例だと、日本の午前10時〜20時に投稿します。

## 猫が時報をお知らせします 🐾

指定したトリガーで、猫の画像が投稿されます。

![スクリーンショット 2021-03-11 13.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127585/3d10386e-98ba-021e-786d-2eb1f2070207.png)