Azure Logic Apps の Request トリガーで受け取った HTTP ヘッダを読み出す方法

# 論よりコード (TL;DR)

Azure Logic Apps の Request トリガーで受け取った HTTP ヘッダは `triggerOutputs()['headers'][HTTP_HEADER_KEY]` で読み出せる。

例) `User-Agent` という HTTP ヘッダを読み出したければ

```
@{triggerOutputs()?['headers']?['User-Agent']}
```
と、アクションのフィールドに設定すればよい。

注) 書式としては `triggerOutpus()` だが、アクションのフィールドに指定する時は "式" として認識させるため `@{ ... }` で囲む。

### 解説

[`triggerOutputs()` 関数](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#triggerOutputs)は、トリガーで受け取ったアウトプットを構造として出力するため、`[KEY]` でオブジェクトを指定すれば値が読み出せる。

### triggerOutputs() の確認方法

Logic Apps の [概要] > [実行の履歴] で "HTTP 要求の受信時" を開いた後、 "出力" の [未加工出力の表示] が triggerOutputs() で見ることができる構造となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/09cfcff3-fbb0-6a64-1285-abc17aa8c6c2.png)

```console
curl -H "Content-Type: application/json" -H "X-Custom-1: cust-data1" -d '{"data": 3}' $URL
```

とした場合は、このような出力になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/2866accc-64d6-8a2a-9648-cf2ccf3cde39.png)

ここまで見なくとも、基本的な構造は [受信要求からコンテンツを参照する](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-http-endpoint#reference-content-from-an-incoming-request) にも書かれているように `headers` と `body` をトップとした構造となっている。

### キー参照に `?` を挟むことで、存在しないキーへの参照の InvalidTemplate を回避できる

`User-Agent` を読み出す場合は

```
triggerOutputs()['headers']['User-Agent']
```

で良いのだが、この時 `User-Agent` が存在しない場合は InvalidTemplate が発生する。

キーが存在しない場合の InvalidTemplate を無視したいときに利用できるのが `?` である。
キーが存在しない可能性がある参照の先頭に `?` を入れるだけ。

```
triggerOutputs()['headers']?['User-Agent']
```

もちろん階層で指定も可能なため、

```
triggerOutputs()?['headers']?['User-Agent']
```

と `triggerOutputs()` で `headers` が無い場合、そしてその下の参照で `user-agent` がない場合、と表現可能。

### キー名の大文字・小文字は無視される

```
triggerOutputs()['headers']['User-Agent']
```

となっていたら `user-agent` `USER-AGENT` どれでもマッチする。

## 最後に: Azure Logic Apps とは？

[Azure Logic Apps](https://azure.microsoft.com/ja-jp/services/logic-apps/)(以下、Logic Apps) は、最近流行話題となっているノーコード・ローコードを実現するサービスです。
※ ノーコード・ローコード自体については[ノーコード・ローコードのあれこれ](https://qiita.com/kento_gm/items/34c46a9bc6b3017c9345)の解説がわかりやすいかもです。

Logic Apps はトリガーによってワークフロー(アクションをつなげたロジック)を実行する仕組みとなっており、似ているものとしては Node-RED があります。

### Request トリガー

[トリガーは色々用意されてます](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-workflow-actions-triggers#trigger-types-list)が、中でもわかりやすいのは [Request トリガー](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-workflow-actions-triggers#request-trigger)です。これを設定すると URL が発行され、その URL に HTTP リクエストすることでワークフローが起動できる、いわゆる Webhook[^1] です。
[^1]: [HTTPWebhook トリガー](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-workflow-actions-triggers#httpwebhook-trigger) とは異なり、よりシンプルに実現できます。

### なんでこんなエントリーを？

SORACOM Beam では SIM に紐づいている番号 "IMSI" を X-SORACOM-IMSI として HTTP ヘッダに付けながらデータ転送できます。それが読めたら嬉しいよね！っていう理由です。

![](https://docs.google.com/drawings/d/e/2PACX-1vQSroJqf8NbIXJgBXHzePBXwgd6M-P6xcN0opVeo5jVGndvAZXB8v8jDV3LPgr96LZ5OeQpVolfqTBC/pub?w=960&h=720)

SORACOM Beam ではこんな HTTP ヘッダを付けることができます。詳しくは [SORACOM Beam の開発者向けマニュアル](https://dev.soracom.io/jp/beam/send-data-using-beam/)をご覧ください。

| header | 意味 |
|--------|------|
| X-SORACOM-IMSI | SIM の IMSI |
| X-SORACOM-IMEI | 通信したモデムの IMEI |
| X-SORACOM-OPERATOR-ID | SORACOM のアカウント(オペレーター) ID |
| X-SORACOM-TIMESTAMP | SORACOM でデータを受け取ったタイムスタンプ(エポックミリ秒) |
| X-SORACOM-SIGNATURE | [SHA256 署名](https://dev.soracom.io/jp/beam/send-data-using-beam/#signature) |
| X-SORACOM-GEO-POSITION | [簡易位置測位機能による緯度経度](https://dev.soracom.io/jp/docs/location_service/) |

# あとがき

ノーコード！ローコード！

EoT