Azure Logic Apps - Azure Functionsからの呼び出しとGmail送信


## 目的

`Azure Functions` から `Azure Logic Apps` を呼び出し、
`Azure Logic Apps` で `Azure Functions` から受け渡した値をGmail送信する



## 構成

[Azure Functions と Azure Service Bus を使用してロジック アプリを呼び出すか、またはトリガーする](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-scenario-function-sb-trigger) を参考に以下構成のロジックアプリを作成する

![image-20210704141924229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/ca886376-b12f-82c0-cfe0-566657b856d3.png)

Postmanから送信する要求本文は以下とし、文字列`test-name`をメール本文に挿入する

```json
{
    "name": "test-name"
}
```



## ロジックアプリの作成

### 1. トリガ（HTTP要求の受信時）作成

トリガに `HTTP要求の受信時`を選択

![image-20210704144910059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/aab5b960-ee45-4de3-4860-e6f4ce0a0426.png)

Functionsから受信する要求本文のスキーマ定義を行う
`サンプルのペイロードを使用してスキーマを生成する`を選択する

![image-20210704145409358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/6f6a3694-3dde-3f17-7a17-a98b3401798a.png)

![image-20210704150117721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/5e312d2d-120b-eab8-62ad-53f2cadc55c4.png)

サンプルのペイロードを入力することで、以下のようにスキーマが生成される

![image-20210704150151328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/0f503c90-88f2-0093-2664-047a7b2a80ad.png)

要求本文がスキーマと一致しない場合、 `HTTP 400 Bad Request` が返される

Functionsから送信するPOSTの宛先はロジックアプリを保存後に生成される

![image-20210704150541036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/89378ec1-b7e2-fc5b-4eeb-59eea8ac5d4d.png)


### 2. アクション（応答）追加

アクションの `応答` を選択する

![image-20210704151208431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/cb8e19c5-7d95-9733-3e03-a4c523f7694d.png)

以下のように `本文` → `name` を選択するとトリガで定義したスキーマの `name`を応答本文に含めることができる 

![image-20210704150917232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/5ad57627-b5bb-ab7c-8238-1c1acdfc87a3.png)


### 3. アクション（Gmail送信）追加

アクションの `メールの送信` を選択する

![image-20210704151648581.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/764dca7d-3eec-49ab-2048-848d464de471.png)

メールの送信に使用するGmailアカウントにサインインする

![image-20210704152238032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/7d3f3a34-b6f7-752d-fa16-c9fc92aa315f.png)

宛先のメールアドレスを入力し、`Add new parameter` から `ボディ` と `件名` をチェックする

![image-20210704152350762.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/4be12760-efd0-196f-5769-550a6ef9066b.png)

メールの件名、ボディを入力し、`動的なコンテンツの追加` から式で `triggerBody()?['name']` を入力し、トリガで定義したスキーマの `name`をボディに追加する

![image-20210704152707968.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/bb349852-9c57-d6cf-f48c-d165776922bf.png)


### 4. POSTの宛先を取得

![image-20210704153329737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/6af04408-cff9-b8bc-622f-2c1fba8b4c8d.png)


## HTTP Trigger 関数の作成

関数の作成方法については省略

以下、`Python` の実装コード例

```python
import logging
import json
import requests
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
  logging.info('Python HTTP trigger function processed a request.')

  # ロジックアプリから取得したHTTP POSTのURL
  uri = 'https://prod-11.japanwest.logic.azure.com:443/workflows/492c717d4.....'

  try:
    req_body = req.get_json()
    name = req_body.get('name')
  except ValueError:
    return func.HttpResponse("Bad Request", status_code=400)
  
  try:
    headers = {'Content-Type': 'application/json'}
    payload = {'name': name}

    # POST送信
    response = requests.post(uri, headers = headers, data = json.dumps(payload))
    logging.info(f'response code: {response.status_code}')
    logging.info(f'response body: {response.text}')
  except:
    return func.HttpResponse("Internal Server Error", status_code=500)

  return func.HttpResponse("OK", status_code=200)
```



## 動作確認

Functionsはローカルデバッグ実行で確認
[Azure Functions - ローカルでのテスト、デバッグ（Python）](https://qiita.com/takmot/items/90700eb0c8038d994f07)参照

### Postman

![image-20210704154629697.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/821c6b03-3ffb-5b11-bf2b-cbc1c56d5882.png)

### Funcstionsを実行しているターミナル

![image-20210704155038716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/946008ad-0e84-7418-6d7e-6e75b799fc33.png)

### Gmail

![image-20210704154704867.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/d6cc51c0-c96a-bedb-422c-74aa96fbc5d8.png)