ノンコーディングで「毎日お天気サービス☆」を作成する！ (Logic Apps で扱う JSON Schema について整理しながら)

複雑なコーディングなしで様々なアプリケーションと連携させることができる Logic Apps は非常に便利です。開発者でなくても分かりやすい UI でシステムを構築することができるので最近益々注目されてきています。Logic Apps では JSON をよく取り扱うのですが、ノンコーダーの方々からすると JSON を扱うことが意外に難しく、ちょっとした API 連携とのカスタマイズをあきらめてしまうこともあるのではないでしょうか。
今回は「Azure Maps」の新しい API である「Weather Service API」に Logic Apps から HTTP リクエストを送信し、そこから帰ってきた JSON を Perse してメールを投げるという、「毎日お天気サービス☆」を作ってみたいと思います。その中で JSON を Parse する方法についても触れていきたいと思います。

作成する手順は以下です。
- Azure リソースを作成する
- Logic Apps でフローを作成する

では、早速やってみましょう！

# Azure リソースをデプロイする
今回使用する Azure リソースは、「Azure Maps」と「Logic Apps」です。
## Azure Maps リソースの作成
まずは天気予報を取得するために Azure Maps リソースを作成します。Azure Maps は地理情報だけでなく天気予報にも対応できるようになりました。
参考情報 : [雨の日も晴れの日も Azure Maps Weather Services で分析情報を取得](https://azure.microsoft.com/ja-jp/blog/rain-or-shine-azure-maps-weather-services-will-bring-insights-to-your-enterprise/)
Accu Weather の API と同じものを使用している見たいなので精度に変わりはないと思いますが、せっかくなので Azure のリソースということで Azure Maps を使ってみます。
まず、Azure Maps のリソースを Azure ポータルから探して作成します。検索に「Maps」と入れれば予測変換で出てくると思います。ロケーションなど必要な値を入力し作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/e8ffb5a5-dcc4-0c34-b014-b20f230c4eb6.png)
参考情報 : [クイック スタート:Azure Maps を使用して対話形式の検索マップを作成する](https://docs.microsoft.com/ja-jp/azure/azure-maps/quick-demo-map-app)

#Logic App リソースを作成する
次に Logic Apps のリソースを作成します。これも Azure Maps と同様に Azure Portal からデプロイすることが可能です。ドキュメントにあるように必要な値を入力し作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/81945d5a-9a3d-f817-12a0-27aedabbd7b9.png)
参考情報 : [クイック スタート:Azure Logic Apps を使用して初めてのワークフローを作成する - Azure portal](https://docs.microsoft.com/ja-jp/azure/logic-apps/quickstart-create-first-logic-app-workflow)
この二つで今回使用する Azure リソースは準備完了です。

#Logic Apps でフローを作成する
では次に Logic Apps で フローを作成していきます。作成した Logic Apps リソースを Azure Portal 上で開き「Blank」を選択し、Logic Apps Designer を開きます。
今回作成するフローを整理すると以下のステップを踏むことになります。

- 1日ごとのインターバルをトリガーとする
- Azure Maps へ HTTP リクエストを投げる
- リクエストで返ってきた Body をセットする
- JSON を Parse する
- Parse された JSON を本文に加えてメールを送信する

## 1日ごとのインターバルをトリガーとする
まずはトリガーを作成します。今回は1日に1回このフローを起動させるとし、1日ごとの朝9時(日本時間)に設定します。これはあくまでも正確な○○時ということでなく、設定した時間台に1回、つまり9時台に1回実行するイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/58eb1c01-fbec-7e9a-e162-e58ee8b701cc.png)
## Azure Maps へ HTTP リクエストを投げる
次に Azure Maps の Weather Service へリクエストを送信します。Weather Service は以下に参考情報があります。
参考情報 : [Weather](https://docs.microsoft.com/en-us/rest/api/maps/weather)
参考情報 : [Weather services in Azure Maps](https://docs.microsoft.com/en-us/azure/azure-maps/weather-services-concepts)
このドキュメントによると、作成した Azure Maps リソースのエンドポイントに対してリクエストを送信するだけで、天気予報が JSON 形で返ってくるみたいです。

```
GET https://atlas.microsoft.com/weather/currentConditions/json?api-version=1.0&query={query}
```
このクエリの部分を品川区の緯度経度に変更することで品川区の天気を取得することが出来ます。品川駅の緯度経度を調べると、35.628471,139.73876です。サブスクリプションキーは、Azure Portal から取得できる Key を入力します。

試しにこの URL をそのままブラウザに貼り付けると、JSON が返ってくることが確認出来るかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/44222940-f7c8-a864-bdac-fa12b37e09fb.png)
確認できたら、この URL をそのまま Logic Apps に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/a8b2c112-803d-5277-99d0-f8241957d45d.png)

これで Azure Maps に Logic Apps からリクエストを投げる設定が完了です。

## リクエストで返ってきた Body をセットする
このままでもデータは扱えなくはないのですが、なんとなく値がセットされていないと気持ち悪いので、`Initialize variable` を使って、JSON の値を格納します。先ほどリクエストで返ってくる値は `BODY` として選択できるようになっているかと思います。名前は任意ですが、ここでは `JSONObject` とし、Type は `Object` を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/10909c33-c33b-0628-ff16-7984631d07db.png)
## JSON を Parse する
次にリクエストから返ってきた JSON を Parse します。ここが今回の肝です。Parse するには Schema で取得する JSON の値を検証していきます。この JSON Schema とは JSON のもともとの型を意味しています。少し JSON Schema について整理します。
参考情報 : [Azure Logic Apps でデータの操作を実行する](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-perform-data-operations)



### JSON Schema とは
JSON Schema は Wikipedia には以下の様に定義されています。
>JSON Schema（JSONスキーマ）は、Json Schema organization によって開発・保守されているスキーマ言語で、JSONデータの構造をJSONそのもので定義するためのもの

参考情報 : [JSON Schema](https://ja.wikipedia.org/wiki/JSON_Schema) 
これだけ読むとちょっとわかりにくいかもしれませんが、「JSONデータの構造を定義したもの」と理解すると良いかと思います。たとえば、先程　Azure Maps にリクエストを送信し返ってきた JSON は以下の様な形です。

```json
{
    "summary": {
        "startDate": "2020-03-27T16:00:00+00:00",
        "endDate": "2020-03-29T10:00:00+00:00",
        "severity": 3,
        "phrase": "Expect rainy weather late Friday night through Sunday afternoon",
        "category": "rain"
    },
    "forecasts": [
        {
            "date": "2020-03-24T22:00:00+00:00",
            "temperature": {
                "minimum": {
                    "value": 5,
                    "unit": "C",
                    "unitType": 17
                },
                "maximum": {
                    "value": 13.9,
                    "unit": "C",
                    "unitType": 17
                }
            },
            
        ///中略
        }
    ]
}
```

この JSON にはそれぞれの型にそれぞれの値が入っているのが分かります。このデータ構造のそもそもを定義するのが JSON Schema です。上の例だと JSON Schema は以下の様な形になります。

```JSON
{
    "type" : "object",
    "properties": {
        "summary": {
            "type": "object",
            "properties" : {
                "category": {
                    "description" : "天気のカテゴリ",
                    "type": "string"
                },
                "phrase": {
                    "description" : "天気概要",
                    "type": "string"
                }
            }
        },
        "forecasts": {
            "type": "array",
            "items":{
                "type" : "object",
                "properties":{
                    "date":{
                        "type" : "string",
                        "description":"予報日時"
                    },
                    ///中略
            }
        }
    }
}
```
この例をみると分かるように、それぞれ値に対して `type` で型を指定しています。この様にして Properties を設定することで、リクエストを送付した際の返ってきた JSON の値から、`必要なものだけ取り出したり`、`必要なデータを変換したり` することが可能となるわけです。

JSON Schema については以下の記事が非常に分かりやすかったので参考に載せて置きます。
参考情報 : [JSON Schemaと友達になる為の記事](https://qiita.com/arumi8go/items/a9530cbd39ff545a7bbb)

### 今回の JSON Schema を作成する
さて、実際に今回の Azure Maps から返ってきた JSON を Parse する JSON Schema を作成してみましょう。
実は JSON データから JSON Schema を作成する Web App は様々なものが既に準備されているので、こういったものを上手く活用しながら、必要なデータだけに絞る、といった方法が良いかもしれません。

参考情報 : [JSON Schema Tool](https://jsonschema.net/home)

Descripion に説明を入れてあげると、あとで Logic Apps からデータを抜き取るときに分かりやすくて便利です。

```json
{
    "type" : "object",
    "properties": {
        "summary": {
            "type": "object",
            "properties" : {
                "category": {
                    "description" : "天気のカテゴリ",
                    "type": "string"
                },
                "phrase": {
                    "description" : "天気概要",
                    "type": "string"
                }
            }
        },
        "forecasts": {
            "type": "array",
            "items":{
                "type" : "object",
                "properties":{
                    "date":{
                        "type" : "string",
                        "description":"予報日時"
                    },
                    "temperature" : {
                        "type" : "object",
                        "properties" : {
                            "minimum" :{
                                "type" : "object",
                                "properties" : {
                                    "value" :{
                                        "description" : "今日の最低気温",
                                        "type" : "number"
                                    }
                                }
                            },
                            "maximum" : {
                                "type" : "object",
                                "properties" : {
                                    "value" : {
                                        "description" : "今日の最高気温",
                                        "type" : "number"
                                    }
                                }
                            }
                        }                 
                    },
                    "day":{
                        "type":"object",
                        "properties":{
                            "shortPhrase":{
                                "type":"string",
                                "description":"今日の日中の天気(ショートフレーズ)"
                            },
                            "longPhrase":{
                                "type":"string",
                                "description":"今日の日中の天気(ロングフレーズ)"
                            }
                        }
                    },
                    "night":{
                        "type":"object",
                        "properties":{
                            "shortPhrase":{
                                "type":"string",
                                "description":"今日の夜の天気(ショートフレーズ)"
                            },
                            "longPhrase":{
                                "type":"string",
                                "description":"今日の夜の天気(ロングフレーズ)"
                            }
                        }
                    }
                }
            }
        }
    }
}
```

この JSON Schema を Logic Apps に入力してあげることで、JSON データを次のフローで使用する準備が出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/372cec85-3feb-a290-f7bf-8176db69301b.png)
## Parse された JSON を本文に加えてメールを送信する
最後に Logic Apps の O365 コネクタを利用し、メールを送付するフローを作成します。先程 Parse したデータが、メール本文で選択出来ようになっています。Description に設定した値が Dynamic Contents で見える様になっているので、JSON Schema を作成する際にはしっかり定義しておきましょう。今回はこんな感じで設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/ce3d3e49-c6a7-9c7d-d12a-da81352e8796.png)
ここまで完成したら、Logic Apps Designer から `Save` をし、`Run` をクリックします。これでトリガーが実行され、設定したメールアドレスにメールが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/16431723-cbdb-db50-92f1-2d00fdb193e5.png)


このフローを `Enable` にしておくことで毎朝 9 時に品川区の天気予報がメールで届きます。今回 JSON Schema で定義したプロパティはごくわずかですが、湿度や風速など様々な値が返ってきているので、追加で設定することでより詳細な天気予報サービスを作成することが可能です。

#まとめ
今回は Logic Apps と Azure Maps を連携させてみました。Logic Apps では JSON Schema を使用して JSON データを Parse するのは結構使用頻度が高いです。他の Cognitive Service との連携する際にも返ってくる値は JSON なので、これを気に JSON Schema がすらすら書けるようになっておくと良いかもしれないですね。