Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?
@w2or3w

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

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

はじめに

浜松市 新型コロナウィルス感染症対策サイトのお手伝いをしています。
お手伝いをしています、というか、楽しく参加させてもらってます。
東京都のオープンソースを活用した新型コロナウイルス感染症対策サイトの派生サイトの1つです。
Code for Japanによる支援活動の1つだそうで、すばらしいですね。

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

概要

こんな感じです。
Screenshot 2020-04-12 at 09.44.24.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頃、患者の属性から生成するよう変更したため破棄)
- 新型コロナウイルスに関する検査陽性患者の属性
- 新型コロナウイルスに関する陽性患者数 (4/25頃、患者の属性から生成するよう変更したため破棄)
- 新型コロナウイルスに関するPCR検査実施人数
- 新型コロナウイルス感染症に関する相談件数

Screenshot 2020-04-11 at 20.06.04.png
こんな感じのページで、CSVやエクセルファイルをダウンロードできます。

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

WebAPIについての詳細はこちらに書いてある通りです。
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が取りまとめている形式に従ってます。
これから上げる場合も是非これに従ってください。

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

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

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を取り出してログイン!

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

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

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

16
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
w2or3w
2or3(ツカサ)です。 静岡県浜松市在住。 地方中小IT企業に勤めるアプリケーションエンジニア。 最近サーバーレスWebアプリにお熱です。 各種SNSフォロー歓迎です〜 https://www.w2or3w.com/

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
16
Help us understand the problem. What is going on with this article?