---
# System prepended metadata

title: GCP(クラウド勉強会)

---

# GCP(クラウド勉強会)


[About Takayuki](https://taka-baya-work.com/about/)

## アジェンダ

### 成果物1

日本の輸入出とサービス業の国際収支の推移を表示するページを作成する。
https://learning-gcp-403802.ue.r.appspot.com/

![成果物.png](https://hackmd.io/_uploads/ryGptDkQa.png)

【成果物のクラウド設計】
![Cloud.png](https://hackmd.io/_uploads/Hy-Dnde7a.png)


### 成果物2
成果物1カスタマイズして、より可視化されたグラフなど、改良して良いものを作ってください。

## 今回使用するもの

### プログラミング言語
・Python
・HTML
・JavaScript (Chart.js)

### ツール
・Google Cloud Pratform(GCP)

---

## 事前準備

### 事前準備その１：GCPへの登録

以下リンクの記事を参考にGCPへの登録(クレジットカードの追加)をお願いします。

【日本語】
https://www.n-study.com/gcp/start-gcp/

【英語】
https://cloud.google.com/docs/get-started?hl=en

### 事前準備その２：Pythonのインストール

<span style="color:red">**Pythonをインストールするときは、バージョン3.10でインストールしてください(環境の統一&gcloud CLIがv3.10しか対応してないので)**</span>.

#### Windows
●WindowsでPython実行環境のインストール方法
1. **PythonをWindowsにインストールするには、以下の手順を実行します。**
公式ウェブサイトからインストーラをダウンロード:
【Pythonの公式ウェブサイト】
https://www.python.org/ftp/python/3.10.11/python-3.10.11-amd64.exe
にアクセスし、ダウンロードページからPythonの最新バージョンのインストーラをダウンロードします。

2. **インストーラを実行:**
ダウンロードしたインストーラをダブルクリックして実行します。

3. **パスにPythonを追加:**
インストーラの最初の画面で、「Add Python X.Y to PATH」（X.YはダウンロードしたPythonのバージョン番号）というオプションをチェックします。これにより、PythonがシステムのPATH環境変数に追加され、コマンドプロンプトから直接Pythonを実行できるようになります。

3. **インストール:**
「Install Now」をクリックして、インストールを開始します。

4. **インストールの確認:**
インストールが完了すると、「Setup was successful」または類似のメッセージが表示されます。これでPythonのインストールは完了です。

5. **Pythonの動作確認:**
コマンドプロンプトを開き、python --versionと入力して、Pythonのバージョンが正しく表示されることを確認します。

6. **（オプショナル）追加のパッケージのインストール:**
必要に応じて、Pythonのパッケージマネージャであるpipを使用して、追加のパッケージをインストールします。たとえば、pip install numpyを実行すると、NumPyという数値計算ライブラリをインストールできます。

これで、Windows上でPythonを使用する準備が整いました。

#### OS X
●MacでPythonをインストールするには、いくつかの方法がありますが、ここでは主に2つの方法を紹介します。

【インストーラーを使ったインストールの場合】
1. **公式ウェブサイトからインストーラをダウンロード:**
Pythonの公式ウェブサイト
https://www.python.org/ftp/python/3.10.11/python-3.10.11-macos11.pkg
にアクセスし、Pythonの最新バージョンのインストーラをダウンロードします。

2. **ダウンロードしたインストーラをダブルクリックして実行し、画面の指示に従ってインストールを完了させます。**

【Homebrewを使用】

1. **ターミナルを開き、以下のコマンドを実行してPythonをインストールします:**
```
brew install python3.10
```

どちらの方法でも、インストールが完了したらターミナルを開き、python3 --versionコマンドを実行してPythonのバージョンを確認することができます。これでPythonのインストールは完了し、MacでPythonを使用する準備が整いました。

また、OSXでPythonのバージョン管理を行いたい場合は、pyenvを使用することもお勧めします。pyenvは、複数のPythonバージョンを管理し、プロジェクトごとに異なるPythonバージョンを使用することを簡単にします。

### 事前準備その３：Cloud SDKのインストール
*gcloud CLI*はパソコン端末からコマンドでGCPのクラウド環境を操作するツール(コマンド)です。

基本的には以下URLを参照して頂ければ幸いです。

#### ●Windowsでのインストール方法

1. CLIインストーラーのダウンロード
[Google Cloud CLI インストーラ](https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe?hl=ja)をダウンロードします。
or
または、PowerShell ターミナルを開き、以下の PowerShell コマンドを実行します。
```.ps
(New-Object Net.WebClient).DownloadFile("https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe", "$env:Temp\GoogleCloudSDKInstaller.exe")

& $env:Temp\GoogleCloudSDKInstaller.exe
```

2. **インストーラを起動して、画面の指示に沿って操作します。インストーラには Google LLC による署名が付いています。**
スクリーン リーダーを使用している場合は、[スクリーン リーダー モードをオンにする] チェックボックスをオンにします。このオプションで gcloud を構成すると、Unicode スピナーの代わりにステータス トラッカーが使用され、進行状況が割合で表示されます。また、テーブルがフラット化されます。詳しくは、ユーザー補助機能のガイドをご覧ください。

※*Google Cloud CLI には Python が必要です。サポートされているバージョンは Python 3（3.8～3.10）です。デフォルトでは、Google Cloud CLI の Windows バージョンには Python 3 がバンドルされています。Google Cloud CLI を使用するには、お使いのオペレーティング システムでサポートされているバージョンの Python を実行できる必要があります。*

CLIのインストールが終わったら、**gcloud CLI**を実行して、以下コマンドを実行してください。

```.sh
gcloud auth login
```

実行すると、Googleアカウントの認証表示されるので、GCPに登録したアカウントでログインしてください。

#### ●MacOSでのインストール方法

1. **サポートされているバージョンの Python を使用していることを確認します。**
現在の Python バージョンを確認するには、 python3 -V または python -V を実行します。サポートされているバージョンは Python 3（3.8～3.10）です。
Google Cloud CLI リリース バージョン 352.0.0 以降の場合、メインのインストール スクリプトでは、Intel ベースの Mac に CPython の Python 3.10 をインストールできます。
そうでない場合は、サポートされている Python バージョンをインストールするには、Python.org の macOS 用 Python リリースにアクセスしてください。
マシンに複数の Python インタープリタがインストールされている場合は、希望するインタープリタのパスを指すようにシェル内に CLOUDSDK_PYTHON 環境変数を設定します。
Python インタープリタの選択方法と構成方法についてはgcloud topic startup をご覧ください。

2. **インストーラをダウンロードします。**

| パッケージ | サイズ | SHA256 | チェックサム |
| -------- | -------- | -------- | -------- |
|macOS 64 ビット (x86_64) | [google-cloud-cli-452.0.1-darwin-x86_64.tar.gz](https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-452.0.1-darwin-x86_64.tar.gz?hl=ja) | 123.0 MB |	2afce77c2a4c98bf6a133018b71c92bf22ef63940867f1e919c8b4d0959e13c6 |
|macOS 64 ビット (ARM64, Apple M1 silicon) | [google-cloud-cli-452.0.1-darwin-arm.tar.gz](https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-452.0.1-darwin-arm.tar.gz?hl=ja) | 120.1 MB | b57abce33c044ddd2608b2d4993d91b2148c823abb1bb4dfadb6034c1ab9343c |
| macOS 32 ビット (x86) | [google-cloud-cli-452.0.1-darwin-x86.tar.gz](https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-452.0.1-darwin-x86.tar.gz?hl=ja) | 121.7 MB | b3b35a6bc0eea9e5f7ea1c2f0407c571a63457a31c2c31d55e326fe17eb3169d |

3. **インストーラーの展開**
アーカイブをファイル システム上の任意の場所に展開します。ホーム ディレクトリを使用することをおすすめします。macOS では、ダウンロードした .tar.gz アーカイブ ファイルを任意の場所で開くことでこれを実現できます。
既存のインストールを置き換えるには、既存の google-cloud-sdk ディレクトリを削除し、同じ場所にアーカイブを展開します。

4. **インストーラの実行**
インストール スクリプトを使用して、gcloud CLI ツールを PATH に追加します。また、シェル、使用統計情報の収集ではコマンドの補完を利用し、Python 3.10 をインストールできます。
このコマンドを使用して（前の手順で展開したフォルダのルートから）スクリプトを実行します。

```.sh
./google-cloud-sdk/install.sh
```

5. **gcloud CLI を初期化するには、gcloud init を実行します。**

CLIのインストールが終わったら、**gcloud CLI**を実行して、以下コマンドを実行してください。

```.sh
gcloud auth login
```

実行すると、Googleアカウントの認証表示されるので、GCPに登録したアカウントでログインしてください。


**以上で事前準備終了です**、お疲れさまでした。

---

## ハンズオン課題

### a. 今回使用するプログラムのダウンロード

以下githubのlinkから今回使用するプログラム一式をダウンロードできます。

[github link](https://github.com/taka-baya/learning_gcp_appengine)

or

コマンド
```
git clone https://github.com/taka-baya/learning_gcp_appengine.git
```


●フォルダ階層
```
./app/
 |-main.py
 |-app.yaml
 |-templates
    |-chart.html
```

● ./app/main.py

```.py
import os

from flask import Flask, render_template, request
from google.cloud import bigquery

from google.cloud import bigquery
from google.oauth2 import service_account


#key_path = "..\\ssh\\credencial-key.json"
#credentials = service_account.Credentials.from_service_account_file(
#    key_path, scopes=["https://www.googleapis.com/auth/cloud-platform"],
#)
#bigquery_client = bigquery.Client(credentials=credentials, project=credentials.project_id,)

bigquery_client = bigquery.Client()
app = Flask(__name__)

# リクエストを受け付ける関数
@app.route('/', methods=['GET'])
def diplay():

    #BigQueryにクエリを投げる
    query_job = bigquery_client.query(
        """
        SELECT
            *
        FROM 
            `your-databse-name`
        ORDER BY 
            day
        """
    )

    # クエリの実行結果をデータフレームに取得する
    df = query_job.to_dataframe()
    
    #print(type(df))
    # print(df.fillna(0))
    # df = df.fillna(0)
    
    labels = df["day"]
    datas = [df["Goods_and_services"], df["Goods_total"], df["Exports"], df["Imports"], df["Services"]]
    
    return render_template('chart.html', datas=datas, labels=labels)


if __name__ == '__main__':
    #ローカル実行時はCloud Shell推奨の8080ポートを使用する
    app.run(host='0.0.0.0', port=8080)
```

./app/app.yaml
```.yaml
runtime: python310
service: default
```

./app/requirements.txt
```.txt
db-dtypes==1.1.1
Flask==3.0.0
google-cloud-bigquery==3.13.0
pandas==2.1.2
pyarrow==13.0.0
```

./app/templates/chart.html
```.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>課題</title>

    <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0"></script>
  </head>
  <body>
    <canvas id="chart"></canvas>

    <script>
    window.chartColors = {
        red: 'rgb(255, 99, 132)',
        orange: 'rgb(255, 159, 64)',
        yellow: 'rgb(255, 205, 86)',
        green: 'rgb(75, 192, 192)',
        blue: 'rgb(54, 162, 235)',
        purple: 'rgb(153, 102, 255)',
        grey: 'rgb(201, 203, 207)'
    };

    var chartDatas = {
        type: 'bar',
        data: {
            labels: [
                {% for label in labels %}
                    "{{label}}",
                {% endfor %}
            ],
            datasets: [{
                label: '輸入出とサービス事業の国際支出',
                type: 'bar',
                backgroundColor: window.chartColors.red,
                borderColor: window.chartColors.red,
                yAxisID: 'yaxis1',
                data: [
                    {% for data in datas[0] %}
                        {{data}},
                    {% endfor %}
                ],
                fill: false,
            }, {
                label: '貿易支出トータル',
                type: 'bar',
                fill: false,
                backgroundColor: window.chartColors.green,
                borderColor: window.chartColors.green,
                yAxisID: 'yaxis1',
                data: [
                    {% for data in datas[1] %}
                        {{data}},
                    {% endfor %}
                ],
            }, {
                label: '輸出',
                type: 'line',
                fill: false,
                backgroundColor: window.chartColors.orange,
                borderColor: window.chartColors.orange,
                yAxisID: 'yaxis1',
                data: [
                    {% for data in datas[2] %}
                        {{data}},
                    {% endfor %}
                ],
            }, {
                label: '輸入',
                type: 'line',
                fill: false,
                backgroundColor: window.chartColors.grey,
                borderColor: window.chartColors.grey,
                yAxisID: 'yaxis1',
                data: [
                    {% for data in datas[3] %}
                        {{data}},
                    {% endfor %}
                ],
            },  {
                label: 'サービス事業',
                type: 'line',
                fill: false,
                backgroundColor: window.chartColors.purple,
                borderColor: window.chartColors.purple,
                yAxisID: 'yaxis1',
                data: [
                    {% for data in datas[4] %}
                        {{data}},
                    {% endfor %}
                ],
            }]
        },
        options: {
            responsive: true,
            title: {
                display: true,
                text: '日本の感染状況'
            },
            tooltips: {
                mode: 'index',
                intersect: false,
            },
            hover: {
                mode: 'nearest',
                intersect: true
            },
            scales: {
                x: {
                    display: true,
                    scaleLabel: {
                        display: true,
                        labelString: '日付'
                    }
                },
                yaxis1 : {
                    display: true,
                    position: 'left',
                    scaleLabel: {
                        display: true,
                        labelString: '￥'
                    }
                },
                yaxis2 : {
                    display: true,
                    position: 'right',
                    scaleLabel: {
                        display: true,
                        labelString: '￥'
                    }
                }
            }
        }
    };
    var mychart = document.getElementById("chart");
    var chart = new Chart(mychart, chartDatas);
    </script>
  </body>
</html>
```

### b. BigQueryにデータを追加

#### データのダウンロード

今回使うデータは以下リンクのページの「6s-1-4  国際収支総括表【月次】」からダウンロードできます。
https://www.mof.go.jp/policy/international_policy/reference/balance_of_payments/bpnet.htm

既に整形済みのものを用意しているので、以下URL or コマンドでダウンロードしてください。

[整形済みデータダウンロードURL](https://storage.googleapis.com/balance-of-payments/Sample_data.csv)

or

```.sh
 curl -O https://storage.googleapis.com/balance-of-payments/Sample_data.csv
```

任意のフォルダに「Sample_data.csv」がダウンロードされていることを確認してください。

#### BigQueryにデータを追加する。

**●GUIの場合**

以下画面のように。左横のタブから「BigQuery」を選択して、「＋追加」を選択してください。

![IAM.png](https://hackmd.io/_uploads/SkJBOaxmp.png)

その後、「一般的なソース」の下に「ローカル ファイル」があるのでそちらを選択してください。
すると、以下画像のようにテーブルを作成する画面が出てきます。

![図1.png](https://hackmd.io/_uploads/SJj21Rg7p.png)

> 項目ソース：こちらはダウンロードしたデータセットを選択してアップロードしてください・

> 送信先：対象のプロジェクトを選択、項目「データセット」はDBです。任意のDB名を入力してどこのリージョンに保存するか選択してください。項目「テーブル」はテーブルなので、任意のテーブル名を入力してください。

> スキーマ：こちらの項目はカラム名の編集です。基本的に自動でカラム名が認識されますが、自分で編集したい場合はこちらを設定してください。

**CLIの場合**

CLIの場合はgcloud CLIを使ってローカルのダウンロードしたCSVファイルからBigQueryにデータベースを作成します。以下URLのドキュメントのページ内タブ「bq」を選択して参照して構築してみてください。


https://cloud.google.com/bigquery/docs/batch-loading-data?hl=ja#bq


例）
・テーブルの作成
```
bq load --skip_leading_rows=1 --source_format=CSV mydataset.mytable data.csv my_schema.json
```

スキーマ.jsonの例
```.json
[
  {"name": "day", "type": "date", "mode": "required"},
  {"name": "Goods_and_services", "type": "integer", "mode": "required"},
  {"name": "Goods_total", "type": "integer", "mode": "required"},
  {"name": "Exports", "type": "integer", "mode": "required"},
    {"name": "Imports", "type": "integer", "mode": "required"},
  {"name": "Services", "type": "integer", "mode": "required"}
]
```

テーブルが作成完了したら、「BigQuery Studio」に戻り以下SQLを実行してみてください。


```.sql
SELECT * FROM `learning-gcp-403802.Finance_data.balance_of_payments` LIMIT 1000
```


### c. クレデンシャルキーの作成

「IAMと管理」を選択して、「サービスアカウント」を選択してください。

![IAM.png](https://hackmd.io/_uploads/S1gOMpgma.png)

その後、「サービスアカウント作成」を選択してクレデンシャルキーを作成します。作成するサービスアカウント名は任意に決めて頂いて問題無いです。
ただし、アクセス権限に関しては「BigQuery 管理者」としてロールを設定してください

![IAM.png](https://hackmd.io/_uploads/HkKyrpgma.png)

新しくサービスアカウントを作成したらサービスアカウント一覧に、新しく作成したサービスアカウントの名前が表示されます。
それを選択すると、キーというタブが表示されると思います。

「キー」というタブが表示されたら、
> 「新しい鍵を追加」->「新しい鍵を作成」->「Json」-「作成」

を選択してください。するとJson形式のファイルがダウンロードされると思います。**しっかりとした場所に保管しておきましょう(例えば ~./.ssh/ とか)**

![IAM.png](https://hackmd.io/_uploads/SyI1Dax76.png)


### d. ローカル端末での実行

※本作業では、クレデンシャルキーとBigQueryでのDB構築が終えてから取り組んでください。

**step1.** まずは、ダウンロードしたサンプルプログラムのフォルダ内のmain.pyを開いてください。
**step2.** 開いた後に以下のように10行目～のコメントアウト「#」を削除して、16行目をコメントアウト「#」してください。
**step3.** 次に、10行目の変数key_pathにダウンロードしたクレデンシャルキーのパスを記載してください。
**step4.** 次に、29行目の'your-databse-name'をBigQueryで作成したデータベース名を指定してください。

```.py=
import os

from flask import Flask, render_template, request
from google.cloud import bigquery

from google.cloud import bigquery
from google.oauth2 import service_account


key_path = "..\\ssh\\credencial-key.json"
credentials = service_account.Credentials.from_service_account_file(
    key_path, scopes=["https://www.googleapis.com/auth/cloud-platform"],
)
bigquery_client = bigquery.Client(credentials=credentials, project=credentials.project_id,)

#bigquery_client = bigquery.Client()
app = Flask(__name__)

# リクエストを受け付ける関数
@app.route('/', methods=['GET'])
def diplay():

    #BigQueryにクエリを投げる
    query_job = bigquery_client.query(
        """
        SELECT
            *
        FROM 
            `your-databse-name`
        ORDER BY 
            day
        """
    )

    # クエリの実行結果をデータフレームに取得する
    df = query_job.to_dataframe()
    
    #print(type(df))
    # print(df.fillna(0))
    # df = df.fillna(0)
    
    labels = df["day"]
    datas = [df["Goods_and_services"], df["Goods_total"], df["Exports"], df["Imports"], df["Services"]]
    
    return render_template('chart.html', datas=datas, labels=labels)


if __name__ == '__main__':
    #ローカル実行時はCloud Shell推奨の8080ポートを使用する
    app.run(host='0.0.0.0', port=8080)
```

**step5.** 最後に、更新したmain.pyを保存して、ターミナルやコマンドなのでmain.pyがあるフォルダに対して以下コマンドを実行してください。

```.sh
python main.py
```

**step6.** 最後に http://localhost:8080 でグラフチャートが表示されるかを確認してください。

### e. AppEngineにデプロイ

AppEngineの概要に関しては以下資料を参照してください。
https://cloud.google.com/appengine/docs/the-appengine-environments?hl=ja

それでは最後に、AppEngineでデプロイする用にプログラムを書き直します。
main.pyを開いた後に以下のように10行目～のコメントアウト「#」を追記し、16行目をコメントアウト「#」を外してください。
```.py=
import os

from flask import Flask, render_template, request
from google.cloud import bigquery

from google.cloud import bigquery
from google.oauth2 import service_account


#key_path = "..\\ssh\\credencial-key.json"
#credentials = #service_account.Credentials.from_service_account_file(
#    key_path, scopes=["https://www.googleapis.com/auth/cloud-platform"],
#)
#bigquery_client = bigquery.Client(credentials=credentials, project=credentials.project_id,)

bigquery_client = bigquery.Client()
app = Flask(__name__)

# リクエストを受け付ける関数
@app.route('/', methods=['GET'])
def diplay():

    #BigQueryにクエリを投げる
    query_job = bigquery_client.query(
        """
        SELECT
            *
        FROM 
            `your-databse-name`
        ORDER BY 
            day
        """
    )

    # クエリの実行結果をデータフレームに取得する
    df = query_job.to_dataframe()
    
    #print(type(df))
    # print(df.fillna(0))
    # df = df.fillna(0)
    
    labels = df["day"]
    datas = [df["Goods_and_services"], df["Goods_total"], df["Exports"], df["Imports"], df["Services"]]
    
    return render_template('chart.html', datas=datas, labels=labels)


if __name__ == '__main__':
    #ローカル実行時はCloud Shell推奨の8080ポートを使用する
    app.run(host='0.0.0.0', port=8080)
```

main.pyへの修正が終わった場合は保存してください。

クラウドへのデプロイは簡単です。
app.yamlがあるフォルダに対してターミナルで移動して以下コマンドを実行するだけです。

```
gcloud app deploy
```



#### ※Python Runtime について
app.yamlについてもっと知りたい方は以下記事を参照してください。
https://cloud.google.com/appengine/docs/standard/python3/runtime?hl=ja

### f. カスタマイズ開発

課題1 : もっと見やすいグラフにしてください。
課題2 : 輸出と輸入の割合の円グラフとか作れないですかね...
