ようへいの日々精進XP

よかろうもん

奥さんがフェイスエステしている間に日本の祝日や休日を JSON で返す Web サービスを API Gateway と Amazon S3 そして Python で作ってみました

追記:後日談を書きました

inokara.hateblo.jp

tl;dr

日本の祝日や休日を JSON で返してくれる Holidays JP API というサービスがありますよね.

holidays-jp.github.io

すごく便利で有難いと思います.

今回は, ちょっとした時間が出来たので Holidays JP API と同様のレスポンスを返す Web サービスを API Gateway と S3 そして Python で作ってみました.

祝日や休日の情報を何処から取ってくるか

日本が滅びてしまう以外にはきっと無くならないであろう, 内閣府のサイトにて祝日と休日の情報が csv で公開されていますので, こちらを利用させて頂きます. (データの二次時利用等についての但し書きが確認出来なかった為, API で公開してしまっていますが, もし問題があればすぐ公開は中止します.)

国民の祝日について - 内閣府

有難うございます.

csv ファイルは, 以下のようなフォーマットで Shift-JIS 形式で保存されています.

国民の祝日・休日月日,国民の祝日・休日名称
2017-01-01,元日
2017-01-02,休日
2017-01-09,成人の日
...
2018-12-24,休日
2019-01-01,元日
2019-01-14,成人の日

csv データを JSON フォーマットデータに加工して S3 バケットに放り込む

この csv をよしなに JSON フォーマットにパースするスクリプトPython で書いてみました.

gist.github.com

尚, スクリプトは以下の環境で動作確認をしております.

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G19009

$ python --version
Python 3.6.4

レスポンスは Holidays JP API に倣い, 以下のような JSON が返るようになっています.

{
  "2017-01-01": "元日",
  "2017-01-02": "振替休日",
  "2017-01-09": "成人の日",
...
  "2019-11-03": "文化の日",
  "2019-11-04": "振替休日",
  "2019-11-23": "勤労感謝の日"
}

スクリプトcsv を取得して, JSON フォーマットに加工してデータを S3 バケットに放り込んでしまいます. また, Holidays JP API に倣って, 年別のデータを返すようにしたいので, 以下のような階層構造で JSON データを年ごとに分割してバケットに放り込むようにしました.

Bucket/
├── 2017
│   └── data.json
├── 2018
│   └── data.json
├── 2019
│   └── data.json
└── data.json

API Gateway で S3 オブジェクトを公開する

すいません

API Gateway はほぼ初めて触った為, 設定の方法等に誤りがあるかもしれません. もし, 誤りがあれば指摘等頂ければ幸いです.

ざっくりとした流れ

  1. IAM Role を作成
  2. API を作成
  3. 2 で作成した API にリソースを作成
  4. 3 で作成したリソースにメソッドを作成
  5. 4 で作成したメソッドに対して, AWS サービスを関連付ける (統合タイプで AWS サービス を選択し, S3 オブジェクトにアクセス出来るようにする)
  6. API キーの設定を行う

API の設定 (リソースやメソッド), API キーの設定を行った際には [API のデプロイ] を選択してデプロイします.

尚, リソースの設定 (URL パス) についても, 以下のように Holidays JP API に倣った設定にさせて頂きました.

メソッドの設定

下図ように設定しました.

f:id:inokara:20180408231201p:plain

API Gateway を触ったのは初めてだったので, ドキュメントを片手に四苦八苦して上図のような設定となりました.

API キーの設定

API キーでアクセスを制御したいので, API キーを発行して, 作成した API とステージに API キーを紐付けます.

API キーの発行からのざっくりとした流れは以下の通りとなります.

  1. [API キー] にて API キーを作成
  2. [使用量プラン] にてプランを作成
  3. 2 で作成したプランに [API ステージ] に API とステージを関連付ける
  4. 2 で作成したプランに [API キー] を追加する
  5. API のメソッド設定にて [API キーの必要性] を true に変更する

ということで

JSON データに API Gateway を介してアクセスしてみます.

$ curl --header 'x-api-key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -s https://apigateway.execute-api.ap-northeast-1.amazonaws.com/test/api/v1/data.json | jq .
{
  "2017-01-01": "元日",
  "2017-01-02": "振替休日",
  "2017-01-09": "成人の日",
...
  "2019-11-03": "文化の日",
  "2019-11-04": "振替休日",
  "2019-11-23": "勤労感謝の日"
}

年ごとのデータにもアクセスしてみます.

2017 年の場合.

$ curl --header 'x-api-key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -s https://apigateway.execute-api.ap-northeast-1.amazonaws.com/test/api/v1/2017/data.json | jq .
{
  "2017-01-01": "元日",
  "2017-01-02": "振替休日",
  "2017-01-09": "成人の日",
  "2017-02-11": "建国記念の日",
  "2017-03-20": "春分の日",
  "2017-04-29": "昭和の日",
  "2017-05-03": "憲法記念日",
  "2017-05-04": "みどりの日",
  "2017-05-05": "こどもの日",
  "2017-07-17": "海の日",
  "2017-08-11": "山の日",
  "2017-09-18": "敬老の日",
  "2017-09-23": "秋分の日",
  "2017-10-09": "体育の日",
  "2017-11-03": "文化の日",
  "2017-11-23": "勤労感謝の日",
  "2017-12-23": "天皇誕生日"
}

2018 年の場合.

$ curl --header 'x-api-key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -s https://apigateway.execute-api.ap-northeast-1.amazonaws.com/test/api/v1/2018/data.json | jq .
{
  "2018-01-01": "元日",
  "2018-01-08": "成人の日",
  "2018-02-11": "建国記念の日",
  "2018-02-12": "振替休日",
  "2018-03-21": "春分の日",
  "2018-04-29": "昭和の日",
  "2018-04-30": "振替休日",
  "2018-05-03": "憲法記念日",
  "2018-05-04": "みどりの日",
  "2018-05-05": "こどもの日",
  "2018-07-16": "海の日",
  "2018-08-11": "山の日",
  "2018-09-17": "敬老の日",
  "2018-09-23": "秋分の日",
  "2018-09-24": "振替休日",
  "2018-10-08": "体育の日",
  "2018-11-03": "文化の日",
  "2018-11-23": "勤労感謝の日",
  "2018-12-23": "天皇誕生日",
  "2018-12-24": "振替休日"
}

来年の場合.

$ curl --header 'x-api-key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -s https://apigateway.execute-api.ap-northeast-1.amazonaws.com/test/api/v1/2019/data.json | jq .
{
  "2019-01-01": "元日",
  "2019-01-14": "成人の日",
  "2019-02-11": "建国記念の日",
  "2019-03-21": "春分の日",
  "2019-04-29": "昭和の日",
  "2019-05-03": "憲法記念日",
  "2019-05-04": "みどりの日",
  "2019-05-05": "こどもの日",
  "2019-05-06": "振替休日",
  "2019-07-15": "海の日",
  "2019-08-11": "山の日",
  "2019-08-12": "振替休日",
  "2019-09-16": "敬老の日",
  "2019-09-23": "秋分の日",
  "2019-10-14": "体育の日",
  "2019-11-03": "文化の日",
  "2019-11-04": "振替休日",
  "2019-11-23": "勤労感謝の日"
}

ちなみに, API キーが無い場合.

$ curl -s https://apigateway.execute-api.ap-northeast-1.amazonaws.com/test/api/v1/2019/data.json | jq .
{
  "message": "Forbidden"
}

イイ感じ.

以上

奥さんがフェイスエステを終えて待ち合わせ場所にやってきました. ひとまず, API Gateway 初体験でしたが, 意外に簡単に S3 オブジェクトを公開することができました.