Cloud FunctionとCloud Schedulerを使って、定期的にAPIで取得したデータをGCEに格納する


この記事の対象と対象外

【対象】
・APIで取得したデータをGCEに格納したい人
・APIを定期的に実行させたい人
・ドキュメントでは、具体的にどうすれば良いかわからない人
・GCPを使おうとしている人

(勉強のために自分でやったことを記載しているものです。気づきがあればご指摘いただけると嬉しいです)

【対象外】
・GCPってなに?という人
・登録方法がわからない人
・サービスの選択方法、GCP上でサービスのAPIを有効にする方法がわからない人
・セキュリティ面、運用面を考慮した設定方法を知りたい人

使うもの一覧

【今回取得したいデータ】
サービス産業動向調査

【取得サイト】:
e-Stat 政府統計の総合窓口
https://www.e-stat.go.jp/

【取得方法】
API

【使用するサービス】
・Google Cloud Storage
・Google Cloud Function
・Google Cloud Scheduler

【使用言語】
python

事前に準備したもの

■e-statsのID
下記で登録して取得可
https://www.e-stat.go.jp/api/

■gcpのアカウント
以下より登録
こちら

注意:今回使うGoogle Cloud Platformのサービスはお金がかかります、3ヶ月&300$の無料枠を使えない人は、注意ください。また同じメールアドレスでは1度しか無料枠は使えないので注意ください

Cloud Functionの作成

Cloud Functionのコンソール画面上で「関数の作成」を押す

❶-構成の画面では
「関数名」:英数字で名前を設定する
「リージョン」:無料枠の場合はusリージョンしか不可
「トリガーのタイプ」:HTTP
他は初期設定のままでOK

❷-コードの画面では
「ランタイム」:python3.7 or python3.8 or python3.9
「エントリ ポイント」:❶の画面で設定した関数名を入力

「main.py」には以下を記載

def sukina_namae(request):
    import requests
    import json
    import csv
    from google.cloud import storage as gcs
    project_id = "******"  #プロジェクトIDを*の箇所に入力
    client = gcs.Client(project_id)
    bucket = client.bucket('******') #プロジェクトIDを*の箇所に入力
    blob = bucket.blob('*****.csv') #ファイルを保存するときの名前を入力する
    url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData"
    #appIdの*に取得したe-statのIDを入力
    payload = {"cdTab":"001","cdArea":"00000","appId":"******","lang":"J", "statsDataId":"0003179100","metaGetFlg":"N","cntGetFlg":"N","explanationGetFlg":"N","annotationGetFlg":"N","replaceSpChars":"2","sectionHeaderFlg":"2"}
    r = requests.get(url, params=payload)
    blob.upload_from_string(data=r.text, content_type="text/csv")
    return print("success")

「request.py」には以下を記載(installしたいライブラリなどを記載)

# Function dependencies, for example:
# package>=version
requests
google-cloud-storage

ここまで入力し終えたら、「デプロイ」を押す。

少し待てば、関数が作成されるので完了です!
(右のメニューから手動でテスト可能)

Cloud Schedulerの作成

①Cloud Functionのコンソール画面上で「ジョブの作成」を押す

②スケジュールを定義するでは

「名前」:同じリージョン内で1意になる名前を入力します
「リージョン」:関数と同じリージョンに作成します
「頻度」:unix-cron形式で入力します。今回は月次更新のデータなので、毎月1日に取得するようスケジュールします
「タイムゾーン」:日本標準時に変更します

「続行」を押す

③実行内容を構成するでは

「ターゲットタイプ」:HTTP
「URL」:Cloud Function上で作成した関数内に「トリガー」という項目が存在するので、そこでコピーしたurlを入力する

「HTTPメソッド」:GET
「Authヘッダー」:OIDCトークンを追加
「サービスアカウント」:App Engine default service account
「対象」:「URL」と同じ値を入れる

④他はそのままの設定で、「作成」を押す

しばらくしたら作成完了する

手動で実行したい場合は下記の「今すぐ実行」を押すことで実行される

問題がなければ、Cloud Storageの指定したバケットにデータが入っているはず、、

権限がない場合は権限を追加

IAMのコンソール画面で、「App Engine default service account」のものに、Cloud Functionの起動元の権限を付与の必要がある場合があるため付与(もしかしたら、上記のサービスアカウント以外の場合必要なのかもしれない)

最後に

次はこのデータをBigqueryに連携したり、composerで加工する流れを記事にできればなーと思っています

何か気になった点などあれば教えてください