• トップ
  • ブログ一覧
  • Google Cloud に入門してみた
  • Google Cloud に入門してみた

    みや(エンジニア)みや(エンジニア)
    2024.10.03

    IT技術

    はじめに

    入社2年目のみやです。未経験新卒で入社して約1年半が経ちました。まだまだ足りない技術を磨いています!
    最近Google Cloudの資格試験を受験する機会があり、Google Cloudについて学習しました。
    知識はインプットされたのですが、実際に使いこなせるようにはなっていないので、「Google Cloudを使ってみた」をブログで紹介しつつ、使い方を覚えていければと思います。

    Google Cloudをはじめる準備

    Google Cloud をはじめるにはGoogle アカウントが必要になります。アカウントの作成方法についてはCloud Identity(公式)やGoogle Workspace(公式)などもありますが、今回は個人用ですので既に持っていた私用のGmailアカウントを利用して始めました。

    以降の手順は2024/07/29時点で私が行った手順です。

    1. 作成したGoogleアカウントで https://cloud.google.com/?hl=ja にアクセスする。
    2. 画面右上の「無料で利用開始」ボタンを押下する。
    3. 国を「日本」で選択し、「同意して続行」ボタンを押下する。
    4. 支払い情報を登録し、「送信」ボタンを押下する。
    5. ようこそ、〇〇さんと表示された、Google Cloudのコンソール画面に遷移する。

    これだけで Google Cloud を利用開始できます。
    最初は自動的に無料トライアル期間になるようで、最初に$300の無料クレジット(3ヶ月の期限付き)が付与されます。

    また、無料クレジットを使い切っても自動的に課金されるようにはなっているので初めて使う人にも安心です。

    Google Cloudの操作は主に2つの方法があります。

    • Webブラウザ上のコンソール画面で操作をおこうなう
    • CLIで操作を行う

    今回は入門ということで操作が簡単なコンソール画面からの操作で行っていきます。

    今回やること

    定期的にGoogleSheetsに記載されているデータを取得し、BigQueryに挿入するというアプリケーションを作ろうと思います。特に目的があって作るわけではなく、Google Cloudの操作方法に慣れるのが今回の目的です。
    主に以下の記事を参考にさせていただきました。
    参考記事

    サービスアカウント

    サービス アカウントは、ユーザーではなくプログラムが利用するアカウントです。プログラムはサービスアカウントを通して、Google Cloud APIの呼び出しを行います。サービスアカウントには適切なロールを付与しておく必要があります。(公式

    サービスアカウントの準備

    Googleスプレッドシートへのアクセス権を持つサービスアカウントを作成し、そのサービスアカウントで認証を行いGoogleスプレッドシートのデータを読み取り可能にします。
    デフォルトのサービスアカウント(公式 / PROJECT_NUMBER-compute@developer.gserviceaccount.com)を使用しても良いのですが、今回は練習のため新しくサービスアカウントを作成しようと思います。
    Googleのコンソール画面の検索窓で「IAMと管理」と検索し、「サービスアカウント」に進みます。
    画面上部の「+サービスアカウントを作成」を押下し、サービスアカウント名を適当に設定し、「完了」ボタンを押下します。

    新たなサービスアカウントが作成されるので、そのアカウント右横の3点リーダーをクリックし、「鍵を管理」を押下します。

    「鍵を追加」>「新しい鍵を作成」の順に進み、JSON形式でサービスアカウントキーを発行します。

    キーはPCにダウンロードされます。このキーは後ほどの作業で使います。

    GoogleSheetsへのアクセス権

    作成したサービスアカウントがGoogleSheetにアクセスできるようにします。
    今回使用するGoogleSheetを開き、右上の「共有」ボタンをクリックします。先ほど作成したサービスアカウント(メールの部分)を貼り付け、「閲覧者」の権限を付与し、「送信」ボタンをクリックします。

    これにより、新規作成したサービスアカウントに今回用いるGoogleSheetへのアクセス権を付与することができました。

    BigQueryへのアクセス権

    このままだと新規作成したサービスアカウントはBigQueryへのアクセスができないので、適切なロールを付与します。
    GoogleCloudのコンソールの検索窓から「IAM」と検索し、IAMのページに移動します。
    「+アクセス権を付与」を押下します。
    プリンシパルには先ほど作成したサービスアカウントを入力し、以下の2つのロールを付与しておきます。

    • BigQueryデータ編集者(roles/bigquery.dataEditor)
    • BigQueryユーザー(roles/bigquery.user)

    BigQueryのテーブル作成

    BigQueryはデータ分析などに用いるデータウェアハウスサービスです。(公式
    BigQueryはリソースの下にデータセットがあり、データセットの下にテーブルがあるという構成です。
    まずデータを投入するテーブルのデータセットを作成します。(公式
    GoogleCloudのコンソールの検索窓から「Big Query」と検索し、BigQueryのページに移動します。
    自身のプロジェクトIDのリソースの3点リーダーを押下し、「データセットを作成」を押下します。

    データセットIDを適当に設定し、「データセットを作成」ボタンをクリックし、データセットを作成します。

    作成されたデータセットの3点リーダーを押下し、「テーブルを作成」を押下します。

    テーブル名を適当に設定し、「テーブルを作成」ボタンをクリックすると、テーブルが作成されます。

    これから作成されたテーブルにGoogleSheetsのデータを投入できるようにしていきます。

    Cloud Functionsの作成

    GoogleSheetsからデータを取得し、BigQueryのテーブルにデータを投入する部分をCloudFunctionsに担ってもらいます。
    CloudFunctionsはサーバーレスでソースコードだけ用意すればアプリケーションをデプロイすることができるマネージドサービスです。(公式
    GoogleCloudのコンソールの検索窓から「Cloud Functions」と検索し、CloudFunctionsのページに移動します。
    画面上部の「+ファンクションを作成」をクリックします。
    関数名は適当に設定し、リージョンは「asia-northeast1(東京)」にしておきます。
    「ランタイム、ビルド、接続、セキュリティの設定」を押下し、ランタイムサービスアカウントを先に作成したサービスアカウントに設定します。
    ソースコード内で使用するランタイム環境変数もここで設定しておきます。※それぞれの変数の値は適宜設定してください。

    全て入力できたら、「次へ」を押下します。

    ランタイムを「python3.12」に設定し、まず画面左側のプラスマークを押下し、my_service_account_credentials.jsonというファイルを作成します。作成したら、先にダウンロードしておいたサービスアカウントキーのJSONファイルの中身をそのまま貼り付けます。

    次にmain.pyを以下のように記述します。

    1# main.py
    2import functions_framework
    3from google.oauth2.service_account import Credentials
    4import pandas as pd
    5import gspread
    6import os
    7import json
    8import pandas_gbq
    9
    10# 変数の定義
    11KEY_PATH = os.environ.get('KEY_PATH')
    12PROJECT_ID = os.environ.get('PROJECT_ID')
    13BIGQUERY_DATASET_ID = os.environ.get('DATASET_ID')
    14BIGQUERY_TABLE_ID = os.environ.get('TABLE_ID')
    15SCOPES = [
    16    "https://www.googleapis.com/auth/spreadsheets",
    17]
    18# 自身のGoogleSheetのURL
    19URL = "https://docs.google.com/spreadsheets/〇〇"
    20
    21def get_from_google_sheet(key_path: str, google_sheet_url: str) -> pd.DataFrame:
    22
    23
    24    credentials = Credentials.from_service_account_file(
    25        key_path,
    26        scopes=SCOPES
    27    )
    28
    29    gspread_client = gspread.authorize(credentials)
    30
    31    sheets = gspread_client.open_by_url(google_sheet_url)
    32    worksheet = sheets.get_worksheet(0)
    33    data = worksheet.get_all_records()
    34    df = pd.DataFrame.from_dict(data)
    35
    36    return df
    37
    38def insert_data_to_bigquery(
    39    df: pd.DataFrame,
    40    bigquery_table_id: str,
    41    bigquery_dataset_id: str = BIGQUERY_DATASET_ID,
    42    project_id: str = PROJECT_ID,
    43) -> None:
    44
    45    pandas_gbq.to_gbq(
    46        dataframe=df,
    47        destination_table=f"{bigquery_dataset_id}.{bigquery_table_id}",
    48        project_id=project_id,
    49        progress_bar=False,
    50        if_exists="append",
    51        chunksize=None,
    52        api_method="load_csv",
    53        location="asia-northeast1",
    54        verbose=False,
    55    )
    56    print("saved successfully.")
    57
    58@functions_framework.http
    59def google_sheet_into_bigquery(request):
    60
    61    df = get_from_google_sheet(key_path=KEY_PATH, google_sheet_url=URL)
    62
    63    insert_data_to_bigquery(
    64        df=df,
    65        bigquery_table_id=BIGQUERY_TABLE_ID,
    66    )
    67    return "completed."

    main.pyの説明

    google.oauth2.service_account moduleを利用し、サービスアカウントキーが格納されているJSONファイルを元に認証に用いるCredentialsインスタンスを作成します(参考
    このCredentialsを用いて、gspreadを認証します。
    これによりGoogleSheetsの操作が可能になります。

    BigQueryのテーブルにデータを挿入する部分はpandas_gbqというオープンソースライブラリを用います。こちらについてはGoogleの公式にも記載があります。

    次にrequirements.txtには必要な外部モジュールを記載する必要があるので、以下を記載します。

    1# requirements.txt
    2functions-framework==3.*
    3pandas
    4gspread
    5pandas_gbq
    6google-auth

    最後にエントリポイントを「google_sheet_into_bigquery」に設定して、「デプロイ」ボタンを押下します。

    テストしてみる

    まず、今回用いるGoogleスプレッドシートに以下のように記載しました。

    CloudFunctionsのデプロイが終わっていることを確認し、CloudFunctionsの対象の関数の「テスト中」のタブに移動します。
    画面下部の「CLOUD SHELLで実行」というボタンを押下し、CLOUD SHELLを起動します。

    すでにコマンド入力されているので、Enterキーを押下し、テストが実行できます。
    テストが成功すると、以下のような表示になります。

    BigQueryのテーブルを見ると、データが挿入されていることが確認できました。

    ※テストでエラーが出た場合はログを確認してください!私の場合はGoogleSheetsAPIが有効になっていないエラーなどに遭遇しましたが、ログから原因を見つけて対処できます。ログはログエクスプローラーかCloudFunctionsのログタブから確認できます。
    エラー例

    1gspread.exceptions.APIError: APIError: [403]: Google Sheets API has not been used in project ...

    CloudSchedulerのジョブ作成

    CloudSchedulerはサーバーレスなジョブスケジューラサービスです。(公式
    CloudSchedulerにより毎日0時0分にBigQueryにGoogleSheetのデータを追加することを考えます。
    その前に、CloudSchedulerがCloudFunctionsを呼び出すために使用するサービスアカウントを作成します。
    Googleのコンソール画面の検索窓で「IAMと管理」と検索し、「サービスアカウント」に進みます。
    画面上部の「+サービスアカウントを作成」を押下し、サービスアカウント名を適当に設定し、「作成して続行」ボタンを押下します。
    ロールに「Cloud Run 起動元」を入力し、「完了」ボタンをクリックします。

    それではCloudSchedulerのジョブ作成に移ります。
    Googleのコンソール画面の検索窓で「Cloud Scheduler」と検索し、CloudSchedulerのページに進みます。
    画面上部の「+ジョブを作成」を押下し、適当な名前でスケジュールを定義し、「続行ボタン」を押下します。

    次に実行内容を構成します。
    ターゲットタイプをHTTPに指定し、URL欄に先ほど作成したCloudFunctionsのURLを入力します。
    Authヘッダーは「OIDCトークンを追加」を選択し、サービスアカウントに先ほど作成したものを選択します。

    入力後「作成」ボタンを押下します。
    すると、ジョブが作成されたことがわかります。

    0時0分まで実行されないですが、動作確認のため強制実行を行います。
    対象のジョブにチェックをいれ、「強制実行」ボタンを押下します。
    すると、ステータスが成功となり、BigQueryのテーブルにデータが追加されていることが確認できます。

    まとめ

    GoogleCloudの資格試験でインプットした知識を使いながら、GoogleCloudを触ってみました。業務でもGoogleCloudを触る機会はあったのですが、すでに先人が作成したものを操作することが主だったので、今回のように一からアプリケーション(みたいなもの)を作るのは初めてでいい機会になりました。
    GoogleCloudの技術をもっと身につけて、知識だけではなく技術としてGoogleCloudを扱えるようになっていきます!

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    みや(エンジニア)
    みや(エンジニア)
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background