LoginSignup
2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-30

はじめに

我が社の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のページに入って関数の作成を押す。

スクリーンショット 2021-03-30 10.01.43.png

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

スクリーンショット 2021-03-30 10.15.51.png

コードソース(エディタ上)に書いた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つを受け取り、
スクリーンショット 2021-03-30 14.32.42.png
slack apiで作成したIncoming Webhooksのアプリ設定をしたトーク部屋に通知した後、dataをフロント側にJSONで返す
といったものすごくシンプルなやつです。

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

Slack Api Incoming WebHooksの作成

slack apiに行ってCreate New App

スクリーンショット 2021-03-30 14.39.37.png

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

スクリーンショット 2021-03-30 14.41.20.png
スクリーンショット 2021-03-30 14.41.36.png

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をアップロードする。
スクリーンショット 2021-03-30 14.50.52.png
名前と説明は任意。ランタイムはLambda関数でPython3.8を選択したので、それに合わせる。

生成物はこんな感じ

※ランタイム設定を忘れたから、一度削除して、同じ名前で作成し直したら、version2になっちゃいました、、悔やまれるw
スクリーンショット 2021-03-30 12.03.27.png

Lambda関数にLayerの登録

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

スクリーンショット 2021-03-30 12.00.20.png
スクリーンショット 2021-03-30 12.00.48.png

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

version2となってしまったのが悔やまれる。
※ランタイムが同じじゃないと選択肢に出てこない。
スクリーンショット 2021-03-30 12.03.59.png

一旦、関数のテスト実行

成功しました◎ Lambda関数の単体的には、実行ができる状態。
スクリーンショット 2021-03-30 12.14.27.png

API GatewayでAPIの作成

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

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

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

スクリーンショット 2021-03-30 12.28.17.png

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

JSONのdataの中身が返ってきましたな。
スクリーンショット 2021-03-30 12.27.59.png

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

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

実践と結果まとめ

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

ボタンを一つだけ用意したフロント側から
(アプリクソしょぼいorz Google並のシンプルさw Qiitaのh1タグにしか見えないセンスオワタ\(^O^)/)
スクリーンショット 2021-03-30 12.35.30.png
Notifyボタンをポチっとな、と。

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

スクリーンショット 2021-03-30 12.15.20.png

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

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

スクリーンショット 2021-03-30 12.35.48.png

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

ちゃんと GET 200 で成功してますな✨
スクリーンショット 2021-03-30 12.36.23.png

まとめ

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

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

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

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

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2