静岡県オープンデータカタログ(csv)からCOVID-19対策サイトのデータ(json)に変換して取得するAPI

# 静岡県オープンデータカタログ(csv)からCOVID-19対策サイトのデータ(json)に変換して取得するAPI

## はじめに
[浜松市 新型コロナウィルス感染症対策サイト](https://stopcovid19.code4hamamatsu.org/)のお手伝いをしています。
お手伝いをしています、というか、楽しく参加させてもらってます。
[東京都のオープンソースを活用した新型コロナウイルス感染症対策サイトの派生サイト](https://cio.go.jp/node/2581)の1つです。
Code for Japanによる[支援活動の1つ](https://www.code4japan.org/activity/stopcovid19)だそうで、すばらしいですね。

その活動の中で、タイトルのAPIを作って利用しましたので共有のため記事にします。

## 概要
こんな感じです。
![Screenshot 2020-04-12 at 09.44.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/69f0e49b-4aa1-9514-029a-90402f6d44c5.png)
① 静岡県オープンデータカタログのcsvをJSONにするLambda
② そのLambdaを呼び出すAPI Gateway
③ そのAPIを呼び出してdata.jsonを生成、commit&pushするGitHub Actionsで利用

API Gatewayは以下のようなクエリパラメータでJSONがGETできるようにしました。
> ?type=main_summary:5ab47071-3651-457c-ae2b-bfb8fdbe1af1,patients:5ab47071-3651-457c-ae2b-bfb8fdbe1af1,patients_summary:5ab47071-3651-457c-ae2b-bfb8fdbe1af1,inspection_persons:d4827176-d887-412a-9344-f84f161786a2,contacts:1b57f2c0-081e-4664-ba28-9cce56d0b314

COVID-19サイト側のデータタイプのKEY(main_summaryなど)と、静岡県オープンデータカタログのID(5ab47071-3651-457c-ae2b-bfb8fdbe1af1など)の組み合わせを、カンマ区切りで複数渡せます。

今サポートしているデータタイプKEYと浜松市用のオープンデータカタログIDをまとめると以下の表の通りです。

| 名称 | COVID-19サイトのデータタイプKEY | オープンデータカタログID(浜松市用) |
| --- | --- | --- |
| 検査陽性者の状況 | patients_summary | 5ab47071-3651-457c-ae2b-bfb8fdbe1af1 |
| 陽性患者の属性 | patients | 5ab47071-3651-457c-ae2b-bfb8fdbe1af1 |
| 陽性患者数 | patients_summary | 5ab47071-3651-457c-ae2b-bfb8fdbe1af1 |
| 検査実施人数 | inspection_persons| d4827176-d887-412a-9344-f84f161786a2 |
| 新型コロナウイルス感染症に関する相談件数| contacts | 1b57f2c0-081e-4664-ba28-9cce56d0b314 |

この記事を書いてる2020/4/11現在、静岡県オープンデータカタログへ新型コロナウィルスに関する情報を上げているのは浜松市だけのようなのですが、近い将来、他の市町村や県の情報が加わったあかつきにはそのまま利用してもらえると思います。


## 静岡県オープンデータカタログのcsvをJSONにするLambda
### 静岡県オープンデータカタログとは？

> ふじのくにオープンデータカタログサイトは、静岡県が保有するデジタルデータを自由に利活用できるオープンデータの取組を推進し、利活用促進による新たな価値の創出及び地域の課題解決を図るために、設置したサイトです。

だそうです。
https://opendata.pref.shizuoka.jp/

浜松市の新型コロナウィルスの各種情報も以下のように公開されています。
- ~~新型コロナウイルスに関する検査陽性者の状況~~ (4/25頃、患者の属性から生成するよう変更したため破棄)
- [新型コロナウイルスに関する検査陽性患者の属性](https://opendata.pref.shizuoka.jp/dataset/8113.html)
- ~~新型コロナウイルスに関する陽性患者数~~ (4/25頃、患者の属性から生成するよう変更したため破棄)
- [新型コロナウイルスに関するPCR検査実施人数](https://opendata.pref.shizuoka.jp/dataset/8109.html)
- [新型コロナウイルス感染症に関する相談件数](https://opendata.pref.shizuoka.jp/dataset/8108.html)

![Screenshot 2020-04-11 at 20.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/52f961e5-0d1d-79f0-ad39-2fd6cf4f01ab.png)
こんな感じのページで、CSVやエクセルファイルをダウンロードできます。

CSVファイルへアクセスするにあたり、ファイルパス(URL)はWebAPIから取得することになります。ファイルの直リンクを覚えておいても情報更新時にファイル名が変わってしまうため、WebAPIから取得する必要があります。

WebAPIについての詳細は[こちら](https://opendata.pref.shizuoka.jp/webapi.html)に書いてある通りです。
https://opendata.pref.shizuoka.jp/api/package_show
ここに対してデータカタログごとに割り当てられているIDをクエリパラメータで渡します。
https://opendata.pref.shizuoka.jp/api/package_show?id=a3122ca8-a30b-4f64-ab17-a6fe95d46fba
こんな感じ。
IDは先ほどのページに書いてあります。WEBAPIボタン押下でも確認できます。

CSVの項目は[Code for Japanが取りまとめている形式](https://www.code4japan.org/activity/stopcovid19#doc)に従ってます。
これから上げる場合も是非これに従ってください。

### csv2json
静岡県オープンデータカタログから目的のCSVを取得して、COVID-19対策サイトで利用されるdata.jsonの形式に変換するためのPythonは、こちらのGitHubで公開しています。
https://github.com/code-for-hamamatsu/covid19_shizuoka-opendata_csv2json

API Gatewayから呼ばれるLambdaで実行することを想定したプロジェクトです。
Pythonあまり慣れていないので至らぬコードかと思いますがご容赦ください。
IssueやPull Request歓迎でございます。

## Lambdaを呼び出すAPI Gateway
AWSコンソール > API Gateway > [APIを作成]ボタン押下から、以下の手順ですすめてゆきます。

**APIを構築する**
REST APIの[構築]ボタンを押下。
　プロトコル : REST
　新しいAPIの作成 : 新しいAPI
　名前と説明 : 名前と説明は任意。エンドポイントタイプはリージョンのまま。
[APIの作成]ボタンを押下。

**リソースを作成する**
リソースの[アクション]ドロップダウンメニューから[リソースの作成]を選択。
リソース名に任意の名前を設定して[リソースの作成]ボタン押下。

**メソッドを追加する**
作成したリソースに対してメソッドを追加する。
リソースの[アクション]ドロップダウンメニューから[メソッドの作成]を選択。
現れたコンボボックスからGETを選択して(✓)を押下。

リソース - GET - セットアップにて
　統合タイプ : Lambda関数を選択
　Lambda プロキシ統合の使用 :  チェックON
　Lambdaリージョン : ap-northeast-1のまま
　Lambda関数 : csv2jsonが実行されるLambdaを選択
　デフォルトタイムアウトの使用 : チェックONのまま
[保存]ボタンを押下。

[Lambda 関数に権限を追加する]ポップアップメッセージが表示されるので[OK]ボタン押下。

**メソッドリクエストのURLクエリ文字列パラメータの設定**
リソース - GET - メソッドの実行にてメソッドリクエストを選択。
[URLクエリ文字列パラメータ]を展開し、[クエリ文字列の追加]を選択。
名前に`type`と入力して(✓)を押下。

**APIをデプロイする**
リソースの[アクション]ドロップダウンメニューから[APIのデプロイ]を選択。
APIのデプロイポップアップウィンドウにて、以下を設定。
　デプロイされるステージ : [新しいステージ]
　ステージ名 : 任意
[デプロイ]ボタン押下。

**動作確認する**
URLの呼び出しにかかれているアドレス/リソース名 にアクセスすると、Lambdaの実行結果(JSON)がBODYに表示されます。
また、?type=main_summary:5ab47071-3651-457c-ae2b-bfb8fdbe1af1のようなクエリパラメータを渡すと、指定したデータタイプKEYのJSONのみ取得できます。
![Screenshot 2020-04-12 at 00.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/3d74b356-15a0-793c-ad43-e95ad20a500f.png)

> 2020/4/15
後日、APIキー認証を効かせまして、それについては別記事へ書きました。
[API GatewayのAPIキーにスロットリングを効かせたりGitHubのSecretsに登録してActionsから利用したりする](https://qiita.com/w2or3w/items/fd1ecb116116aae051cc)

## APIを呼び出してdata.jsonを生成、commit&pushするGitHub Actions
csv2jsonを呼び出すAPIができましたので、それをCOVID-19対策サイト側で利用します。

浜松版のCOVID-19対策サイトのリポジトリはこちら。
https://github.com/code-for-hamamatsu/covid19

csv2jsonのAPIを呼び出してJSONを取得するPythonをここに配置。
https://github.com/code-for-hamamatsu/covid19/blob/dev-hamamatsu/tool/create_data_json.py

GitHub ActionsのWorkflowはこちら。
https://github.com/code-for-hamamatsu/covid19/blob/dev-hamamatsu/.github/workflows/create_data_json.yml
dev-hamamatsuブランチへのpushをトリガーに、上のPythonを実行して取得したJSONでdata.jsonを上書きし、commit&pushします。

正直、GitHub Actionsのymlの記述については完全に理解しておらず、やりたいことは実現できているものの、多くを語ることはできません(^_^;)

> 2020/4/14
pushをトリガーにしていたのを、cronによる定期処理へ変更しました。

## あとがき
冒頭にも書きましたが、楽しく参加させてもらっています。
主な活動時間は21時〜25時くらい。家族が寝静まってからおもむろにChromebookを取り出してログイン！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">大学の頃ハンゲームをはじめとしたネトゲにうつつを抜かしていた時期があったのですが、最近のコレってソレに似てるなぁなどと。</p>&mdash; 2or3 (@w2or3w) <a href="https://twitter.com/w2or3w/status/1247730929449103361?ref_src=twsrc%5Etfw">April 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

エンジョイ・オンライン！って感じですね😇

勉強にもなってます。
活きたOJTって感じで、既存のコードや参加しているみなさんから多く学ばせてもらっています。
このcsv2jsonやGitHub Actionsも、何名かの方が関わりフォロー頂きました。

引き続き、自分ができることを探しつつ絡ませていただきますので、よろしくおねがいします〜😀