Google CloudのCloud Functionsを徹底解説!(基本編)

記事タイトルとURLをコピーする

G-genの佐々木です。当記事ではGoogle Cloud(旧称GCP)のCloud Functionsについて解説します。
当記事はCloud Functionsの基本的な仕様に絞った基本編となっております。
実際のサービス利用手順というよりは、まずはサービスの概要を掴んでいただければと思います。

なお、当記事の内容は、2022年6月現在プレビュー中のCloud Functions(第2世代)ではなく、現行の第1世代に関するものとなります。

Cloud Functions

Cloud Functionsとは

Cloud FunctionsとはGoogle Cloudが提供するコンピューティングサービスの1つであり、ユーザーがサーバーやコンテナをプロビジョニング、管理することなくクラウド上でコードを実行することができるFaaS(Function as a Service)プロダクトです。
イベントドリブン、つまり特定のイベントが発生するとコードが実行される仕組みとなっており、トリガーとなるイベントによって、Web APIやリアルタイムのETL処理、定期実行タスクなど様々な使い道があります。

類似のサービスとして、AWSのAWS Lambda、Microsoft AzureのAzure Functionsなどがあります。

サーバレス

Cloud Functionsはいわゆるサーバレス(Serverless)なアーキテクチャをもつコンピューティングサービスです。
Serverlessという語は「サーバーのない」という意味になりますが、実際にはGoogleの各リージョンのデータセンターにサーバーが存在しています。
ここでのサーバレスとは、ユーザーが「サーバーの存在を意識することなく」コードを実行できることを意味します。

Cloud Functionsでは、サーバーのプロビジョニング、スケールアップ、メンテナンス等の管理を全てGoogleに任せ、ユーザーはその上で動かすコードの開発のみに集中することができます。
ユーザーがコードをデプロイした後、その実行がトリガーされると、実行環境が即座にプロビジョニングされ、また必要に応じて自動でスケーリングします。

サポートされている言語

2022年6月現在、Cloud Functionsでは以下の言語がサポートされています。

  • Node.js
  • Python
  • Go
  • Java
  • .NET
  • Ruby
  • PHP

最新のサポート状況については公式ドキュメントをご一読いただければと思います。

関数の実行

Cloud Functionsにデプロイしたコード(これ以降はGoogleのドキュメントに倣い、「関数」と表記します)の実行をトリガーするイベントとして、大きく分けてHTTPトリガーとイベントトリガーの2種類があります。

HTTPトリガー

HTTPトリガーでは、関数をデプロイした際に発行されるURLに対して、HTTPリクエストが送信されることで関数が実行されます。 HTTPの呼び出しは同期的で、関数の実行結果はHTTPリクエストのレスポンスとして呼び出し元に返されます。

イベントトリガー

イベントトリガーではHTTPトリガーのようなURLは発行されず、関数が存在するプロジェクト内のイベントに応答する形で実行されます。代表的なものとしては以下のトリガーがあります。

  • Pub/Subトリガー:Pub/Subトピックにパブリッシュされたメッセージによって関数がトリガーされます。
  • Cloud Storageトリガー:Cloud Storageオブジェクトの作成、更新、削除などのイベントによって関数がトリガーされます。
  • Cloud Firestoreトリガー:Firestoreドキュメントの作成、更新、削除などのイベントによって関数がトリガーされます。

ユースケース

簡単なユースケースを紹介します。公式ドキュメントにも代表的なものがいくつか紹介されているので、併せてご確認ください。
以下はPub/Subトリガーの関数を用いた、Compute Engineインスタンスの自動停止・起動の仕組みとなります。

GCEインスタンスの自動停止・起動

  1. Cloud Schedulerでcronを設定し、指定した時間にPub/Subに対してメッセージをパブリッシュします。
  2. Pub/Subにメッセージがパブリッシュされると、Pub/SubトリガーによりCloud Functions関数が呼び出されます。
  3. Cloud Functions関数のコードからCompute Engine APIを呼び出し、Compute Engineインスタンスを停止もしくは起動します。

上記の処理の中で、ユーザーが行わなければならないのはコードの記述と各サービスの設定のみとなっており、各サービスの設定は慣れていれば30分もかからないくらい簡単なものとなっています。
ここで登場するCompute Engine以外のサービスは全てサーバレスであるため、ユーザーは設定部分だけ行い、その他の管理は全てGoogleがやってくれます。

このような非常に少ない手間で決められた処理を実行することができる点が、Cloud Functionsの魅力です。

料金

Cloud Functionsの料金は以下の項目によって決まります。(公式ドキュメント

  • 関数の呼び出し回数
  • 関数の実行時間
  • データ転送料金(関数によって送信ネットワークリクエストが作成された場合)
  • 関数のイメージの保存(Container Registry利用料)

それぞれ安価かつ月ごとの無料枠も存在するため、先のユースケースで紹介したような使い方であれば、ほとんど、あるいは全く課金されることなく使用することができるでしょう。

関数の呼び出し回数

関数を実行した回数に応じた課金となります。

呼び出し回数(1ヶ月あたり) 料金(100万回あたり)
最初の200万回 無料
200万回を超えた分 $0.40

呼び出し料金は1回あたり$0.0000004円と非常に安価であり、そのうえ1ヶ月のうち最初の200万回は無料で呼び出すことが可能です。

関数の実行時間

関数の呼び出しから完了までの時間に応じた課金となります。
Cloud Functionsでは関数のデプロイの際、関数が使用できるメモリ容量を7段階から指定することができます。 指定したメモリ容量に応じてvCPUが割り当てられ、また料金も増加します。
また、リージョンごとにTier 1とTier 2に料金設定が分かれており、asia-northeast1(東京)はTier 1となります。(参考

メモリ vCPU 料金/100 ms(Tier 1 料金) 料金/100 ms(Tier 2 料金)
128 MB .083 vCPU (200MHz) $0.000000231 $0.000000324
256 MB 0.167 vCPU (400MHz) $0.000000463 $0.000000648
512 MB 0.333 vCPU (800MHz) $0.000000925 $0.000001295
1,024 MB 0.583 vCPU (1.4GHz) $0.000001650 $0.000002310
2,048 MB 1 vCPU (2.8GHz) $0.000002900 $0.000004060
4,096 MB 2 vCPU (4.8GHz) $0.000005800 $0.000008120
8192 MB 2 vCPU (4.8GHz) $0.000006800 $0.000009520

こちらの無料枠は少々分かりづらいのですが、メモリの使用時間とvCPUの使用時間に分かれており、以下のようになっています。

  • 1ヶ月あたり400,000 GB秒(GB秒 = 1GBのメモリを使用した場合の1秒)のメモリ使用
  • 1ヶ月あたり200,000 GHz 秒(GHz秒 = 1GHzのCPUを使用した場合の1秒)のvCPU使用

データ転送料金

関数からの送信データについて課金されます。(同一リージョン内のGoogle APIに対する送信を除く)

タイプ 料金/GB
送信データ $0.12
受信データ 無料
同じリージョン内のGoogle APIへの送信データ 無料

こちらは、1ヶ月あたり5GBのデータ送信までが無料枠となっています。

関数のイメージの保存

関数はデプロイされるとContainer RegistryまたはArtifact Registryにコンテナイメージとして保存されるため、保存したイメージの容量分だけ課金されます。
1GBあたり、Container Registryの場合は$0.026/月、Artifact Registryの場合は$0.10/月(こちらは0.5GBまで無料)のストレージ料金となります。

料金例①

試しに、以下の条件で料金を計算してみます。
計算にはGoogle Cloud Pricing Calculatorを使用します。

  • 関数の呼び出し回数 → 300万回/月
  • 関数の実行時間 → 10秒/1回
  • 関数に割り当てるメモリ容量 → 256MB
  • Google Cloudのリージョン内で完結する処理(asia-northeast1を使用)

この条件では、1ヶ月あたり$0.40となります。
関数の呼び出し回数300万回のうち、200万回分に対して無料枠が提供されます。
また、1ヶ月の実行時間合計30,000,000秒(=メモリ256MB、10秒 * 300万回)については、無料枠の範囲に収まっています。
したがって、この例では関数呼び出し100万回分のみの課金ということになります。

料金例②

続いて、料金例①の関数の呼び出し回数、実行時間をそれぞれ10倍にして計算してみます。

  • 関数の呼び出し回数 → 3000万回/月
  • 関数の実行時間 → 100秒/1回
  • 関数に割り当てるメモリ容量 → 256MB
  • Google Cloudのリージョン内で完結する処理(asia-northeast1を使用)

この条件では、1ヶ月あたり$22.08となります。
内訳として、関数の呼び出し回数にかかる料金は、無料枠を除いた2800万回分の$11.20になります。
1ヶ月の実行時間合計3,000,000,000秒(=メモリ256MB、10秒 * 3000万回)については、無料枠を超過した分の料金として$10.88となっています。
これだけの処理をさせても、1ヶ月あたり数千円で利用することができるということです。

制限

基本編の締めとして、Cloud Functions関数を利用する際の制限事項についても軽く触れておきたいと思います。
Cloud Functionsの制限事項はいくつかありますが、その中から2つを抜粋して紹介したいと思います。

制限対象 上限 備考
関数1つあたりの実行時間 540秒 上限を過ぎた場合は関数がタイムアウトとして強制終了されます。
関数の同時実行数 3,000 同じ関数を同時に実行できる数となります。

これらの制限は、はじめに述べた「サーバレスといってもデータセンターにはサーバーが存在する」ことによるものではないかと思います。
クラウドサービスである以上、1人のユーザーがデータセンターのリソースを完全に独占することはできないということでしょう。

関連記事

当ブログの過去記事として、ローカル環境におけるCloud Functionsの検証に関する記事もありますので、併せてご一読いただければと思います。

blog.g-gen.co.jp

blog.g-gen.co.jp

参考

Cloud Functions 公式ドキュメント

佐々木 駿太(記事一覧)

クラウドソリューション部

2022年6月にG-genにジョイン。Google Cloud認定4冠、AWS 5冠、Azure 3冠、Salesforce 1冠のクラウドネイティブなエンジニア。

Professional Cloud Architect、Professional Cloud Network Engineerなどを所持