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のアカウント
以下より登録
[こちら](https://cloud.google.com/gcp/)

■

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


# Cloud Functionの作成

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

![スクリーンショット 2022-03-29 19.40.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/959c64c1-bc6f-27bf-4e9c-a4ca1ca7c269.png)

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

![スクリーンショット 2022-03-29 19.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/b62f6bb8-667f-af86-3dbe-36396bc10af2.png)

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

![スクリーンショット 2022-03-29 19.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/ded9578c-f11b-45ad-07d4-6c14dbf299ba.png)

「main.py」には以下を記載
```python
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したいライブラリなどを記載)
```python
# Function dependencies, for example:
# package>=version
requests
google-cloud-storage
```

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

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

![スクリーンショット 2022-03-29 20.19.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/1a6bae46-8c9e-a529-fabf-022a672c591e.png)

# Cloud Schedulerの作成

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

![スクリーンショット 2022-03-29 20.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/7222e2ed-7503-f7c1-f921-4b385d930a8a.png)


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

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

![スクリーンショット 2022-03-29 20.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/7528a662-b4d8-4842-c12c-91cace095c15.png)

「続行」を押す


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

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

![スクリーンショット 2022-03-29 20.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/45868f0e-92fa-7557-8793-8becbd273eae.png)

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

![スクリーンショット 2022-03-29 20.41.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/15f53c45-12d8-ca77-2db5-2d8cd22cba95.png)

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

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

手動で実行したい場合は下記の「今すぐ実行」を押すことで実行される
![スクリーンショット 2022-03-29 20.46.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317237/5b4d9c36-502f-cb6a-b583-ed31c41f3424.png)


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


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


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

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