【AWS Lambda+API Gateway】Pythonでslack通知アプリ作ってみた


はじめに

我が社のCTOが、「エンジニアはみんなLambdaくらい使えるようになっていてほしいね〜」
とのありがたいお言葉から、

「自分もエンジニアになったからには、LambdaでAPI作ってみよう!」と、
一念発起して、挑戦してみますた(⌒▽⌒)

LT;DR

  • Lambda関数の作成
  • Slack Api Incoming WebHooksの作成
  • Layerの作成 & 登録
  • API GatewayでAPIの作成
  • 実践と結果まとめ

Lambda関数の作成

Lambdaとは

AWS Lambda は、サーバーのプロビジョニングや管理の必要なしにコードを実行できるコンピューティングサービスです。
Amazon API Gateway を使用すると HTTP リクエストに応答してコードを実行できます。
参照元:AWS Lambda とは

ほうほう、AWSに管理系は丸投げできるんですな。
今回は、HTTPリクエストを投げるので、やりがいありそう。

Lambda関数を作ってみる。

AWSアカウントのLambdaのページに入って関数の作成を押す。

関数名:myLambdaFunc、ランタイム:Python 3.8で作成。

コードソース(エディタ上)に書いたPythonコード

lambda_function.py
import json
import os
import requests

def lambda_handler(event, context):

    WEBHOOK_URL = os.environ['WEBHOOK_URL']
    WEBHOOK_NAME = os.environ['WEBHOOK_NAME']
    CHANNEL_NAME = os.environ['CHANNEL_NAME']

    data = {
            'username': WEBHOOK_NAME,
            'channel': CHANNEL_NAME,
            'attachments': [{
                'title': 'myLambdaFunc',
                "color": 'danger',
                'text': 'myLambdaFunc API was successful!!'
            }]
    }
    requests.post(WEBHOOK_URL, json.dumps(data))

    return {
        'statusCode': 200,
        'body': json.dumps(data)
    }

<解説>

環境変数から下記3つを受け取り、

slack apiで作成したIncoming Webhooksのアプリ設定をしたトーク部屋に通知した後、dataをフロント側にJSONで返す
といったものすごくシンプルなやつです。

※コードを編集したらDeployを押さないとダメ
import requestsレイヤーが必要なので、後述

Slack Api Incoming WebHooksの作成

slack apiに行ってCreate New App

Incoming Webhooksを新規追加して、環境変数登録用のURLを取得しておく。


Layerの作成&登録

自分の場合、上記関数をテストした時に、requestsライブラリのimportで失敗したので、
layerとしてライブラリを取り込んでから実行する。

Layerとは

レイヤーは、ライブラリ、カスタムランタイム、その他の依存関係を含む .zip ファイルアーカイブです。レイヤーを使用することで、関数のライブラリを使用することができます。
参照元:Lambda レイヤー

つまり、Lambdaでサードパーティ製のライブラリやモジュールを使用する時に、Layerに格納して各Lambda関数から呼び出して使用できるようになる仕組み。

Layer Zipの作成

自分はローカルでZipファイルを作成しました。

$ mkdir ./python
$ cd python
$ pip install requests -t . 
$ cd ../ && zip -r Layer.zip python/

任意のフォルダを作って、そこにrequestsライブラリをインストールして、Layer.zipという名前でZip化
ちなみに、
pipコマンドのインストール方法はこちら

Layerの追加&アップロード

サイドメニューのレイヤーを選択し、レイヤーの作成をする。

先ほど作成したLayer.zipをアップロードする。

名前と説明は任意。ランタイムはLambda関数でPython3.8を選択したので、それに合わせる。

生成物はこんな感じ

※ランタイム設定を忘れたから、一度削除して、同じ名前で作成し直したら、version2になっちゃいました、、悔やまれるw

Lambda関数にLayerの登録

Layers (0)をおすと、下部のレイヤーに移動、レイヤーの追加をする


カスタムレイヤーを選択し、さっき登録したmyRequestLayerを登録。

version2となってしまったのが悔やまれる。
※ランタイムが同じじゃないと選択肢に出てこない。

一旦、関数のテスト実行

成功しました◎ Lambda関数の単体的には、実行ができる状態。

API GatewayでAPIの作成

Lambda関数の「トリガーを追加」から、API Gatewayを選択して、下記キャプチャのように設定

※テスト用なのでセキュリティはオープンにしてます。
※ドメインを超えてAPIを叩く予定なので、CORSにチェックしました。
HTTP APIREST APIの違いはこちら=> HTTP API と REST API 間で選択する

トリガーが作成されました!!

エンドポイントを直で叩いてみる

JSONのdataの中身が返ってきましたな。

ここまで来れば、あとは、フロント側でAPIエンドポイント目掛けて叩きまくるのみ\\\٩( 'ω' )و ////

※叩くたびに課金されてゆきます...

実践と結果まとめ

APIエンドポイントを叩いてみる。

ボタンを一つだけ用意したフロント側から
(アプリクソしょぼいorz Google並のシンプルさw Qiitaのh1タグにしか見えないセンスオワタ\(^O^)/)

Notifyボタンをポチっとな、と。

slackの[スコスコスコッ♪]という音と共に通知された。

ディベロッパーツールで確認してみる

ちゃんとJSONのdataが返ってきてますねえ〜

HTTPヘッダーもみてみよう。

ちゃんと GET 200 で成功してますな✨

まとめ

あまりハマりどころもなく、ボタンぽちぽちでほぼ行けたので、

ああ、Lambda
なんと簡単なことでしょう。

しかもサーバーレスかつ、保守管理等も気にすることがない。

簡単なアプリ作るだけだったら、料金的にも安いから、フロントだけ作って、APIサーバー抜きで、
Lambdaさんに頼っちゃっても良さそう✨

以上、ありがとうございました。