LambdaからTeamsへ通知するAPIを作る方法

# はじめに
今回はAWSのサービスの1つである、LambdaでAPIを作って実行したときにTeamsへ通知がくるようにします。

## 開発環境
+ OS Windows 10(NVIDIA GTX 1650Ti,16GB RAM, i5-10300H CPU)
+ Visual Studio Code 1.73.1
+ Python 3.9

## 実際にAPIを作ります！
### TeamsでWebhookを使ってURLを作成
作成したURL用いることでTeamsに情報を送信できるようになります。
[公式](https://learn.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook)に載っているやり方でURLを作成します。

1. 通知を出すチャネルから「・・・（その他のオプション）」をクリック
1. 「コネクタ」を選択したらWebhookを検索し、**追加**をする
1. 「構成」を選択
![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/7d0fd975-6f13-f0aa-d266-e4a26a18e2b9.png)
1. 名前を入力後、「作成」を行う
![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/3694cfcc-c263-2aa7-97da-2200b1cf7127.png)
1. 作成したURLはコピーして保存をする
![MicrosoftTeams-image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/23c425e7-2f9e-9c22-acc8-2458e04a40f2.png)

先ほどWebhookで作成したURLをPythonから叩いてみましょう！
Teamsにメッセージを送る際のタイトルと入力されたメッセージを`data`に格納します。そして`data`をJSON形式でPOSTします。

```Python
import requests
import json

url = "https://XXX/XXX"

data = {
    "text": "aaa",
    "title":"test"
    }
li = json.dumps(data)
responce = requests.post(url, li)
print(responce.json())
```

これを実行するとTeamsに通知が来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/881e0fa7-d310-9c64-4a25-f931f852bd00.png)

### Lambda関数の作成

この通知する機能を外部から叩くためにLambda関数を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/0c0b51a6-007d-be2f-b9f4-d9a0944089e5.png)

GETメソッドでクエリパラメータのkey1の中身をTeamsに送るようにコードを編集します。

```Python
import json
import requests

def lambda_handler(event, context):

    url = "https://XXX/XXX" #コピーしたURLをここに貼り付ける
    data = {
        "title": "test",
        "text": event["queryStringParameters"]["key1"] #value1がテキストでくるようにする
    }
    data_json = json.dumps(data)
    response = requests.post(url, data_json)
    
    return {
        "statusCode": 200,
        "body": json.dumps({
            "result": "Success"
        })
    }
```

リクエストが成功したら`statusCode`を200で返し、JSONデータで
```python
{
    "result": "Success"
}
```
を返します。

### 実行

コードをDeployして、テストイベントのJSONデータを次のようにしてTestを押して実行します。

```Python
{
  "queryStringParameters": {
    "key1": "value1"
  }
}
```

実行後、Teamsを開いたら・・・
![teams-lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/befe7b0f-b21c-54e0-298e-e3c29417d0f7.png)

タイトル「test」で、メッセージには先ほど入力したvalue1が送られてきました！

### Lambdaの関数URLを発行する方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/7570738e-0bf4-4be9-57bf-7ceaa9e9221a.png)

Lambda関数の設定から関数URLを発行することでPythonからたたけるようになります。

```lambda-test.py
import requests

url ="https://XXX.lambda-url.ap-northeast-1.on.aws/?key1=aaa" 
response = requests.get(url)
print(response.json())

```

### API Gatewayを用いる方法
今度はAPI GatwayでLambdaで作成したAPIと結びつけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/b3f43231-5116-c959-eb80-ca4267307b47.png)

API Gatewayを起動したら、「APIを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/4c12d7f0-fd42-438c-2205-aae843cf3742.png)


APIタイプを選択できますが、今回はREST APIを選択し、「構築」をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/fcab54c2-cacd-cb7a-ad01-d406e318a673.png)

プロトコル選択では「REST」を選択し「新しいAPI」を作成します。
そしてAPI名を入力後、「APIの作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/91e2eeea-065a-129b-aeca-a12c690dd2d1.png)
次に「アクション」から「リソッドの作成」を選択し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/9c9ec11f-5f7d-50d1-6a10-15143a6f05f8.png)
このような画面になるので、リソース名（今回の場合は『notification』）を入力して「リソースの作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/522487fd-4e3e-a630-5440-e601bd1cc931.png)
リソースを作成後、再び「アクション」から今度は「メソッドの作成」を選択し、「GET」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/c301d5c9-759c-2803-f61a-e1a66eb3f052.png)
統合タイプには「Lambda関数」を選択し、「Lambdaプロキシ統合の使用」にチェックを入れます。
最後に「Lambda関数」の欄には先ほどLambdaで作成したAPIの名前を入力し、「保存」をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/6f776ad7-8cc0-5a90-2539-ca9db960f9d4.png)
APIのデプロイされるステージは「新しいステージ」とし、ステージ名を今回は「api」と入力しこのままデプロイします。

![lambda-api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/a59dd06d-dc77-2399-0dca-6bc7e1d13b5c.png)

#### PythonからAPIを叩いてみる
```lambda-test2.py
import requests

url ="https://XXX/XXX/XXX/api/notification?key1=aaa" #API Gatewayで作ったURLを張り付ける
response = requests.get(url)
print(response.json())

```
GETメソッドを用いてコードを書きます。貼り付けたURLにはクエリを入力。
最後にコマンドプロンプトで実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/278391e0-92eb-59e8-da70-8c72406f41a3.png)

今度はテキストにaaaと書かれた通知が届きました！

## まとめ
+ LambdaでTeamsにメッセージを送るAPIを作成した
+ Webhookで通知を受け取れるようURLを作成した