Google Cloud FunctionをGoogle Cloud CLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)

2022年9月27日掲載

キービジュアル

本記事では、Google Cloud FunctionをCLIベースでNode.jsおよびPythonそれぞれをデプロイしてみました。

目次

  • Google Cloud Function のCLIを触ったことが無い方が対象です
  • 本記事では、Google Cloud Functionのデプロイ方法の1つである、コンソールでNode.jsおよびPythonそれぞれをデプロイする方法を説明します。
  • Google Cloud CLIを使ってデプロイする方法を説明します

はじめに

Google Cloud Functionはサーバレスコンピューティングプラットフォームであり、開発ユーザーは小さな関数のコードを作成するだけで、開発ユーザーはサーバをプロビジョニングすることなく、その関数のコードを実行することができます。

本記事では、Google Cloud Functionのデプロイ方法の1つである、Google Cloud CLIでNode.jsおよびPythonそれぞれをデプロイする方法を説明します。Google Cloud Command Line Interface(Google Cloud CLI)は、コマンドラインシェルのコマンドを使用してGoogle Cloudサービスと対話することを可能にするオープンソースツールです。Google Cloud CLIを使用すると、ターミナルプログラムのコマンドプロンプトから、リソースの作成や管理などを実行することができます。

CLIを使ってデプロイするモチベーションとして、例えばスクリプトの中身が定期的に更新されていくようなDevOps環境のもとで開発運用する場合、サーバレスの設定を外在化、つまり設定データをGitHubやZookeeper、Consul等CI/CDツールなど外部サードパーティやファイルに配置して、無人でもInfrastructure as Code(以降IaC)ベースで素早く自動デプロイするために、IaCを意識したCLIデプロイアプローチが重要になってきます。

※本記事は 2022年9月時点の情報をもとにしております。実際のご利用にあたっては、必ず各社の最新情報をご確認ください。

1. 全体構成図

Google Cloud Function上でのNode.jsおよびPythonコードをCLIでデプロイする際の流れ、構成図としては次の通りになります。

Google Cloud Functionはサーバレスコンピューティングプラットフォームであり、開発ユーザーは小さな関数のコードを作成するだけで、開発ユーザーはサーバをプロビジョニングすることなく、その関数のコードを実行することができます。

2. Google Cloud CLI のインストールと設定

最初にGoogle Cloud CLIコマンドツールを導入します。
Google Cloud CLIをガイドラインに沿ってインストールします。著者はWindowsPCを使用しているので、Windowsを例に説明します。Windowsの場合、Google Cloud CLIのインストーラーからインストールパッケージをダウンロードした後、ウィザードを使用してインストールプロセスをステップごとに完了できます。

参考リンク

インストール作業が完了したら、`gcloud --version`コマンドでバージョン情報を取得できることを確認します。

`gcloud init`コマンドを使用して、Google Cloud CLIツールの設定(アカウント情報、デフォルトプロジェクト、Region、Zoneなど)を行います。

ウェブブラウザまたはコンソールのみで処理を完了させることができます。ブラウザで作業したくない場合は、`gcloud init --console-only` を使って、コマンドでWebブラウザを起動しないようにすることができます。

`Y`を入力すると、ログイン処理のためにウェブブラウザが起動します。

アカウントに正常にログインし、「Google Cloud SDKが選択したアカウントで動作」を許可します。そのあと、ステップのガイドラインが記載された認証成功のページにジャンプします。

コンソールに戻り、デフォルトのプロジェクト、Region、Zoneの設定を続けます。

参考リンク

対応するすべてのRegionとzone情報がコンソールに表示されますので、それに応じて番号を入力します。東京Regionの場合、以下の3つのオプションがあります。

  • [32] asia-northeast1-b
  • [33] asia-northeast1-c
  • [34] asia-northeast1-a

今回は32 asia-northeast1-bを選定します。

これでGoogle Cloud CLIがインストールされ、正常に設定されました。

3. Nodejsスクリプトをデプロイ - 1.Node.jsソースコードの準備

Google Cloud FunctionでデプロイしたいNode.jsソースコードを準備します。本記事では、node_test_zip_gcpというソースコードフォルダを作成し、Cloud Functionのハンドラーが含まれるindex.jsを作成します。ハンドラー(handler)はサーバレスとして利用する言語の関数の開始位置となるもので、HTTPトリガー、イベントトリガーなど様々なトリガーによって実行される際に呼び出すエントリポイントです。このハンドラーは必須項目であり、ハンドラーを呼び出すことで、サーバレスとしての関数コード(以降スクリプト)が実行開始されます。ここでは、HTTP trigger を使用してコードをデプロイするため、コードは関連するフォーマットに従う必要があります。そうしないと、デプロイやテストでエラーが発生します。

操作画面

上記のソースコードは次の通りです。

'use strict';
const moment = require('moment');

exports.handler = (req, res) => {
  let message = moment().utcOffset(9).format('YYYY-MM-DD HH:mm:ss');
  res.status(200).send(message);
};

Google Cloud FunctionのNode.jsランタイム環境は、一般的なNode.jsモジュールと、使用可能な共通モジュールを提供します。カスタマイズされたScriptには、サードパーティの依存関係を必要とする場合があります。 上記のソースコードでは、日付を操作するためのmomentと呼ばれるパッケージが必要であり、デプロイ前に準備する必要があります。これらのパッケージはnpmでローカルに管理します。

`npm i <package name> --save`コマンドを実行して必要なパッケージをローカルにインストールした後、node_modulesフォルダ(関連するパッケージコードを含む)とpackage.json (必要なパッケージ情報を含む)がindex.jsと同じフォルダの下にあります。

最後に、これらが含まれているソースコードフォルダ内のすべてのファイルをZIPファイルへ圧縮します。ZIPファイル生成後はCloud Function上でデプロイする際に使用します。

4. Nodejsスクリプトをデプロイ - 2.CLIでデプロイ

Google Cloud CLI は、`--source` フラグを指定することで、様々な場所からCloud Functionをデプロイすることができます。上記の手順でソースコードとインストールされた依存関係を含むZIPファイルを準備したので、この状況ではcloud storageを利用したデプロイが推奨されています。

Google Cloud CLIにはgsutilというCloud Storageサービス用のコマンドツールがあります。これを使って先ほど準備したZIPファイルをアップロードします。コマンドは次の通りです。

gsutil cp D:\SBC_OngoingFC-deploy-comparison Filternode_test_zip_gcp.zip \
gs://<バケット名>/ohara-bob-function-code/etc.gcp_gsutil.zip.gs

デプロイガイドラインに沿って、以下コマンドを準備しながら実行します。

gcloud functions deploy ohara-bob-node-cli --region=asia-northeast1 \
--runtime=nodejs16 --source=gs://<bucket name>/ohara-bob-function-code/node_test_zip_gcp.zip \
--entry-point=handler --trigger-http

ここまで問題なく無事完了すると、対象のFunctionリソースはコンソールで使用可能な状態になります。

5. Nodejsスクリプトをデプロイ - 3.デプロイ結果の確認及びテスト

Google Cloud Functionにはコードのプレビュー機能がありますが、制限事項としてコードが512 KB(実際には1.1 MB)より大きいため、プレビュー機能を利用することができません。

そのため、`Testing` タブに移動し、`Test The Function` ボタンをクリックしてスクリプトを実行します。

スクリプトに基づいて、現在の日付情報が特定の形式で表示されます。

以上が、CLIベースでGoogle Cloud Function上のNode.jsソースコードをデプロイする方法になります。

6. Pythonスクリプトをデプロイ - 1.Pythonソースコードの準備

今度はPythonソースコードをGoogle Cloud Functionでデプロイする方法をご紹介します。
python_test_zip_gcpというソースコードフォルダを作成し、Cloud Functionのハンドラーが含まれるmain.pyを作成します。今回はHTTP Triggerを使用してコード(スクリプト)をデプロイするようにします。

上記のソースコードは次の通りです。

import requests

def handler(request):
    response = requests.get('http://google.com/')
    print(response.text)
    return "Access Google home page with status code: {0}".format(response.status_code)

Pythonで記述されたCloud Functionsの依存関係を指定するには、pipパッケージマネージャのrequirements.txtファイルを使用する方法と、ローカル依存関係を関数と一緒にパッケージ化する方法の2通りがあります。

今回のスクリプトでは、HTTP通信用ライブラリのrequestsという名前のサードパーティパッケージが必要であり、デプロイ前にローカルで準備する必要があります。これらのパッケージはpipを使用してローカルで管理します。

`pip3 install <package name> -t . `コマンドを実行して必要なパッケージをローカルにインストールすると、main.pyに関連するパッケージフォルダができます。

次に、ソースコードフォルダ内のすべてのファイルをZIPファイルへ圧縮します。ZIPファイル生成後はCloud Function上でデプロイする際に使用します。

7. Pythonスクリプトをデプロイ - 2.CLIでデプロイ

デプロイしたいPythonソースコードの準備が出来たら、今度は上記と同様に、用意したCLIを使ってZIPファイルをCloud Storageへアップロードします。

gsutil cp D:\SBC_Ongoing\FC-deploy-comparison\python_test_zip_gcp\python_test_zip_gcp.zip \
gs://<bucket name>/ohara-bob-function-code/

以下のコマンドでターゲット機能をデプロイします。

gcloud functions deploy ohara-bob-python-cli --region=asia-northeast1 --runtime=python38 \
--source=gs://<bucket name>/ohara-bob-function-code/python_test_zip_gcp.zip \
--entry-point=handler --trigger-http

8. Pythonスクリプトをデプロイ - 3.デプロイ結果の確認及びテスト

Google Cloud Functionにはコードのプレビュー機能がありますが、制限事項としてコードが512 KB(実際には1.1 MB)より大きいため、プレビュー機能を利用することができません。

そのため、`Testing` タブに移動し、`Test The Function` ボタンをクリックしてスクリプトを実行します。

デプロイする関数コードをインラインエディタでチェックし、コンソールでテストします。上記のデプロイする関数コードの中身は、Googleホームページにアクセスし、関連するHTTPステータスコードを返すものです。

テストの結果、HTTP 200が無事返却されたので、成功です。以上が、CLIベースでGoogle Cloud Function上のNode.jsソースコードをデプロイする方法になります。

9. 補足事項

・ローカルコードで直接デプロイする方法について (Non-ZIP)

Cloud Functions が関数定義を見つけるために、各言語ランタイムはソースコードの構造化に関する要件を持っています。

Node.js 関数の基本的なディレクトリ構造は以下の通りです。

Cloud Functions は各言語のランタイムごとのソースコード構造化に関する仕様があります。例えば、Node.js 関数の基本的なディレクトリ構造は以下の通りです。

├── index.js
└── package.json

Python関数はこの通りになります。

├── main.py
└── requirements.txt

他のプログラミング言語については、公式ドキュメント:ソースディレクトリの構造 で基本的なディレクトリ構造を確認することができます。

ここでは、Node.jsを例に、ローカルコードでクラウド機能を展開する方法を説明します。


以下、index.jsのサンプルコードです。

'use strict';
const moment = require('moment');

exports.handler = (req, res) => {
  let message = moment().utcOffset(9).format('YYYY-MM-DD HH:mm:ss');
  res.status(200).send(message);
};
操作画面

package.jsonの中身は次の通りです

{
  "main": "index.js",
  "dependencies": {
    "moment": "^2.29.4"
  }
}

コマンドを実行すると、デプロイ中に package.json で定義された必要なサードパーティパッケージが npm によってインストールされます。そのため、デプロイ前にローカルでコマンドを実行し、パッケージを準備する処理は不要です。

gcloud functions deploy ohara-bob-python-cli-local --region=asia-northeast1 \
--runtime=nodejs16 --source=D:\SBC_Ongoing\FC-deploy-comparison\node_test_zip_gcp_local\ \
--entry-point=handler --trigger-http

Cloud Function上でスクリプトをテストし、実行結果を確認してみます。

10. 最後に

Google Cloud FunctionをCLIベースでNode.jsおよびPythonそれぞれをデプロイする方法をご紹介しました。サーバレスアプリケーションはコードを記述しながら実行できるクラウドサービスなので、エンジニアリングリソースを小さくしてくれるため非常に便利です。一方、複数の開発者による並列操作、環境構成の管理、ランタイムで例えばPythonのバージョン変更など各環境で些細な変更が生じても素早く変更、自動的にデプロイしたい場合は、コンソール画面での操作では手入力等反映リソースが追いつかなくなるため、Infrastructure as Code(IaC)ベースで運用するのがベターです。

本記事では、IaCを意識しながらGoogle Cloud CLIコマンドツールを介して、ローカルにあるソースコードをCloud Storageへアップロード保存し、そのままOSSからFunction ComputeへCLIコマンドでイベント操作をする方法を記載していますので、CI/CDパイプラインでサーバレスアプリケーションを構築する際はご参考になれば幸いです。

関連サービス

Google Cloud

Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません