フォーム読み込み中
2022年9月27日掲載
本記事では、Google Cloud FunctionをCLIベースでNode.jsおよびPythonそれぞれをデプロイしてみました。
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月時点の情報をもとにしております。実際のご利用にあたっては、必ず各社の最新情報をご確認ください。
Google Cloud Function上でのNode.jsおよびPythonコードをCLIでデプロイする際の流れ、構成図としては次の通りになります。
Google Cloud Functionはサーバレスコンピューティングプラットフォームであり、開発ユーザーは小さな関数のコードを作成するだけで、開発ユーザーはサーバをプロビジョニングすることなく、その関数のコードを実行することができます。
最初にGoogle Cloud CLIコマンドツールを導入します。
Google Cloud CLIをガイドラインに沿ってインストールします。著者はWindowsPCを使用しているので、Windowsを例に説明します。Windowsの場合、Google Cloud CLIのインストーラーからインストールパッケージをダウンロードした後、ウィザードを使用してインストールプロセスをステップごとに完了できます。
↓ Google Cloud CLI をインストールする直リンク (Windows用)
https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe
インストール作業が完了したら、`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を選定します。
これでGoogle Cloud CLIがインストールされ、正常に設定されました。
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上でデプロイする際に使用します。
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リソースはコンソールで使用可能な状態になります。
Google Cloud Functionにはコードのプレビュー機能がありますが、制限事項としてコードが512 KB(実際には1.1 MB)より大きいため、プレビュー機能を利用することができません。
そのため、`Testing` タブに移動し、`Test The Function` ボタンをクリックしてスクリプトを実行します。
スクリプトに基づいて、現在の日付情報が特定の形式で表示されます。
以上が、CLIベースでGoogle Cloud Function上のNode.jsソースコードをデプロイする方法になります。
今度は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上でデプロイする際に使用します。
デプロイしたい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
Google Cloud Functionにはコードのプレビュー機能がありますが、制限事項としてコードが512 KB(実際には1.1 MB)より大きいため、プレビュー機能を利用することができません。
そのため、`Testing` タブに移動し、`Test The Function` ボタンをクリックしてスクリプトを実行します。
デプロイする関数コードをインラインエディタでチェックし、コンソールでテストします。上記のデプロイする関数コードの中身は、Googleホームページにアクセスし、関連するHTTPステータスコードを返すものです。
テストの結果、HTTP 200が無事返却されたので、成功です。以上が、CLIベースでGoogle Cloud Function上のNode.jsソースコードをデプロイする方法になります。
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上でスクリプトをテストし、実行結果を確認してみます。
Google Cloud FunctionをCLIベースでNode.jsおよびPythonそれぞれをデプロイする方法をご紹介しました。サーバレスアプリケーションはコードを記述しながら実行できるクラウドサービスなので、エンジニアリングリソースを小さくしてくれるため非常に便利です。一方、複数の開発者による並列操作、環境構成の管理、ランタイムで例えばPythonのバージョン変更など各環境で些細な変更が生じても素早く変更、自動的にデプロイしたい場合は、コンソール画面での操作では手入力等反映リソースが追いつかなくなるため、Infrastructure as Code(IaC)ベースで運用するのがベターです。
本記事では、IaCを意識しながらGoogle Cloud CLIコマンドツールを介して、ローカルにあるソースコードをCloud Storageへアップロード保存し、そのままOSSからFunction ComputeへCLIコマンドでイベント操作をする方法を記載していますので、CI/CDパイプラインでサーバレスアプリケーションを構築する際はご参考になれば幸いです。
サーバレスってなに?Alibaba Cloud, AWS, Azure, Google Cloud のサーバレスサービスを比べてみました
Google Cloud FunctionにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)
Google Cloud FunctionをGoogle Cloud CLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編) ←本記事
Azure FunctionにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)
Azure FunctionをAzure CLIベースおよびAzure Function Core ToolsでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)
Alibaba Cloud Function ComputeにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)
Alibaba Cloud FunctionComputeをCLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)
条件に該当するページがございません