Synapse AnalyticsでiPhoneヘルスケア（歩数、消費カロリー）を分析する Part1

## はじめに

iPhoneやApple WatchなどのApple製品のヘルスケア情報（活動量情報）をクラウドに連携して活用できないかということで、Synapse Analytics , EventHubsを使って実現してみようと思います。

## アーキテクチャ

今回は赤枠部分を作ります。

![2022-10-14-12-57-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8d4e9e9b-d14d-a475-9233-8d9f78e66a06.png)

## Event Hubへの送信について

個人的にはAzureに連携さえできれば特に懸念はないと思うので、ここが一番の壁です。


有償アプリの[Health Auto Export](https://www.healthyapps.dev/)ではじめは試していたのですが、

[Microsoft のKohei Ogawa さん | Twitter](https://twitter.com/shisyu_gaku) から  [iOS ショートカットと Power AutomateでヘルスケアデータをSharePointに保存する](https://qiita.com/h-nagao/items/37dc9e9e964458f0980d)を教えてもらい、無料でできる方法なのでiPhoneのオートメーションを利用することにしました。

※オートメーションの時間起動は「実行時に尋ねる」のOn Offに関わらずタップが必要らしく完全なオートメーションかというとちょっと悩ましいところです。

## 手順

### Synapse Analyticsの作成

1.Synapse ワークスペースの作成

[クイック スタート:Synapse ワークスペースを作成する](https://learn.microsoft.com/ja-jp/azure/synapse-analytics/quickstart-create-workspace)を参考にリソースを作成します。

Synapseの既定のコンテナは **workspace** という名称で作成しました。

![2022-10-14-11-20-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/969647cb-147e-137d-8e6f-43d7e1e7f6d3.png)


2.コンテナの追加

今回はLanding,Raw,Enrichなどのコンテナを追加して、データが置かれる場所を準備度合に応じて整理します。

参考：[DataLakeのベストプラクティス](https://speakerdeck.com/ryomaru0825/whats-data-lake-azure-data-lake-best-practice)

![2022-10-14-11-21-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/04206a0b-9c44-60aa-fab5-453476e7b6f9.png)


### Event Hubs 側の構成

1.EventHubs 名前空間（リソース）の作成

[クイック スタート:Azure portal を使用したイベント ハブの作成](https://learn.microsoft.com/ja-jp/azure/event-hubs/event-hubs-create)を参考にリソースを作成します。

ストレージへのイベントのキャプチャを利用したいのでStandardプランで作成しています。

2.Event Hubの作成

続けてAPI送信先となるEvent Hubを作成します。※手順は1の記事内に


![2022-10-14-10-08-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f1d93d84-c9b3-65d2-5355-0ec1214a0f08.png)



3.キャプチャの構成

[Azure Event Hubs で Azure Blob Storage または Azure Data Lake Storage にイベントをキャプチャする](https://learn.microsoft.com/ja-jp/azure/event-hubs/event-hubs-capture-overview) を利用してEvent Hubからデータレイクにデータを書き込みます。

avro形式で出力ができます。時間ウィンドウを1分にしてすぐ出力されるようにしておきつつ、出力先の指定します。


![2022-10-14-12-46-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a2693045-3348-9407-cc33-c94592fd58a0.png)



4.ポリシーの作成

作成したEvent Hubに移動して、SASポリシーを作成します。送信のためのポリシーなのでそのように構成します。（別のサービスからEvent Hubに送信されたイベントを読取りたい場合などはリッスンなどを使います。）

![2022-10-14-10-09-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b9d91618-0545-20c5-3071-61a00019fa75.png)

![2022-10-14-10-10-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f9e6e97d-7b99-c7e1-ab25-7d50b4ee1801.png)


作成したSASポリシーをクリックすると以下のように接続文字列などの情報が取得できます。

![2022-10-14-10-11-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e7fafbb6-0e23-b588-9836-a9104f453100.png)


6.SASトークンの生成

REST APIでの送信ではSASトークンをあらかじめ生成しておく必要があるのでSASポリシーの情報を使って生成します。

[SAS トークンの生成](https://learn.microsoft.com/ja-jp/rest/api/eventhub/generate-sas-token#python)を参考に、pythonで生成してみました。VSCodeでDevContainerでPython環境をセットアップしたら%% でノートブックっぽく実行できるのでおすすめ

expiryNumは有効期間(秒)ですが、iPhoneのオートメーションから自動的にトークンをリフレッシュする仕組みはさすがに面倒なので3年間有効にしてます

```python:python

#%%

import time
import urllib
import hmac
import hashlib
import base64

def get_auth_token(sb_name, eh_name, sas_name, sas_value):
    """
    Returns an authorization token dictionary 
    for making calls to Event Hubs REST API.
    """
    uri = urllib.parse.quote_plus("https://{}.servicebus.windows.net/{}" \
                                  .format(sb_name, eh_name))
    sas = sas_value.encode('utf-8')
    expiryNum = 60*60*24*365*3
    expiry = str(int(time.time() + expiryNum))
    string_to_sign = (uri + '\n' + expiry).encode('utf-8')
    signed_hmac_sha256 = hmac.HMAC(sas, string_to_sign, hashlib.sha256)
    signature = urllib.parse.quote(base64.b64encode(signed_hmac_sha256.digest()))
    return  {"sb_name": sb_name,
             "eh_name": eh_name,
             "token":'SharedAccessSignature sr={}&sig={}&se={}&skn={}' \
                     .format(uri, signature, expiry, sas_name)
            }
# %%
get_auth_token(
    sb_name='<リソース名>',
    eh_name='<Event Hub名>',
    sas_name='SASポリシー名',
    sas_value='<SASポリシーの主キーの値>'
)

```

このようにtokenが帰ってきます。

![2022-10-14-10-16-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e671f781-199d-19f6-f995-39122f3cee0b.png)


7.[イベントを送信します](https://learn.microsoft.com/ja-jp/rest/api/eventhub/send-event)
 を参考に、RESTAPIで疎通テストをします。成功しました。vscodeでは拡張機能で.httpの拡張子でREST APIの実行もテストできます。


![2022-10-14-10-20-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c0fb1532-19d3-2196-8b84-e43ce30ac6e5.png)


また、キャプチャ機能により、データレイク上にもデータ出力されます。

![2022-10-14-12-48-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/34fee762-9df7-e096-dffa-2f9c5832ef38.png)


### iPhone側の構成

1.ショートカットで歩数を取得する

冒頭で紹介した[iOS ショートカットと Power AutomateでヘルスケアデータをSharePointに保存する](https://qiita.com/h-nagao/items/37dc9e9e964458f0980d)とほぼ同じですので変更したところだけ記載します。

フォーマットの仕方でタイムゾーンまでのるようにしました。

![image1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5a6a7d13-826d-11d6-f92f-ba6527540e25.jpeg)



送信する文字列として歩数データは配列に格納して、データの種類と単位を記載するようにしました。

![image0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/370f026c-bb29-b9bd-1ea4-948bef1fb1d5.jpeg)


クイックルックで正常にjsonデータとして整形できていることがわかります

![2022-10-14-11-01-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/71356f74-b804-abb1-0464-95fc9e5dcf0d.png)


2.RESTAPIの送信

こちらも記事とほぼ同様ですが、ヘッダーなどを追加しています。

EventHubのテストをした際の情報と同じです。

![歩数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/eca89dbc-33ea-5087-e30b-fee9ee00cc8c.png)



3.歩数と同様に、アクティブ消費と安静時消費などを作成してみます。

ショートカットを複製して、ヘルスケアサンプルの種類を変更すれば他の種類のデータも取れます。

![2022-10-14-10-25-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/65105735-fe30-969e-ea55-708987540ad3.png)


計3つのショートカットを作成しました。

![](.image/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-10-14%2011.10.35.png)

4.オートメーション

あとは時間起動のオートメーションに組み込むだけです。

オートメーションの内容

![image03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/af3e439d-9f5d-db76-1728-cf9569058014.png)


オートメーションで実行されるアクションの内容

![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/74e3bbd2-8fb5-f535-4492-a3132cc45039.png)



## 次のパート

データ連携部は以上となります。
次のパートではSynapse Analyticsを利用してデータを準備して視覚化してみます。