こんにちは!石黒です。
皆さんはCloudFunctionsにデプロイした関数を定期実行したいと思うことはないでしょうか。バッチの実装など、決められたスケジュールでCloudFunctionsを実行したいケースは少なくないと思います。そのような場合にはCloudSchedulerからCloudFunctionsを呼び出す方法がオススメです。
本記事では、その為に必要な手順を紹介したいと思います。
手順
- CloudFunctionsに関数をデプロイ
- CloudSchedulerでジョブを作成
CloudFunctionsに関数をデプロイ
CloudFunctionsとは
CloudFunctionsとは、サーバレスな実行環境を提供するサービスです。
サーバレスのため開発者はインフラストラクチャの管理を気にせず、実行したい関数を記述するだけで問題ありません。
記述した関数は、トリガーを設定することで特定のイベントが発生した際に自動的に実行されるようになり、非常に柔軟で使いやすいです。
本記事ではトリガーとして、CloudSchedulerを使用してみたいと思います!
CloudFunctionsに関数をデプロイする
それでは早速CloudFunctionsを使用してみましょう。
まずはGoogleCloudへログインし、「CloudFunctions」と検索し、選択します。
初めてCloudFunctionsを使用する場合はAPIの有効化を要求されるため、全て有効にします。
APIを有効化すると以下の画面が表示されるので、「関数を作成」を押下します。
「関数を作成」ボタンを押下すると、まずは基本構成を設定する画面が表示されます。
今回は以下の通り設定します。
■基本
・環境:第1世代と第2世代が選択できます。今回は第1世代を選択します。
・関数名:任意の名称をつけます。
・リージョン:「asia-northest1(東京)」を使用します。
・トリガー:トリガー方法を選択できます。今回は「HTTP」を選択します。
※生成されたURLは後ほど使用するので控えておいてください(後から確認も可能)
認証方法は2種類あり、インターネットに公開するシステム以外は、
基本的に「認証が必要」を選択することが推奨されています。
「ランタイム、ビルド、接続、セキュリティの設定」の右にあるプルダウンメニューを開くと、
接続ネットワークや環境変数、自動スケーリングなど様々な項目を詳細に設定できます。
今回はデフォルトのまま「次へ」を選択します。
次の画面ではいよいよデプロイする関数を記述していきます。
まず「ランタイム」のプルダウンメニューを展開し、7種類から目的の言語を選択します。今回は「.NET 6.0」を選択します。
次に「ソースコード」ですが、ここでは関数をアップロードする方法を選択することができます。
予めソースが用意されている場合はzipアップロードやCloudStorage、CloudSourceRepositoriesに用意しておき、そこからアップロードするという方法もあります。
今回選択する「インラインエディタ」では、コンソール上でコードを直接記述することができ、言語ごとに必要な構文やファイル構成がサンプルで用意されています。
それでは早速関数を用意していきましょう。
まずはメインとなる処理を「Function(任意).cs」ファイルに記述します。
HTTP(S) リクエストをトリガーとして関数を呼び出す場合は HTTP 関数を使用します。
C#ではIHttpFunctionインターフェースを持つHTTPハンドクラスを実装する必要があります。
using Google.Cloud.Functions.Framework;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace HelloWorld;
public class Function : IHttpFunction
{
public async Task HandleAsync(HttpContext context)
{
// ここに処理を記述する
await context.Response.WriteAsync("Hello World!");
}
}
もう1つ必要なのが「Sample(任意).csproj」ファイルです。
このファイルにはGoogle.Cloud.Functions.Hostingへの依存を追加する必要があります。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Google.Cloud.Functions.Hosting" Version="2.1.0" />
</ItemGroup>
</Project>
また、エントリポイントはHTTP ハンドラクラスの完全修飾名(名前空間を含む)なので、
上記サンプルの場合は以下の通りです。
コードが用意できたら、画面下部の「デプロイ」ボタンを押下します。
緑色のステータスが表示されるとデプロイ成功です!
デプロイ後でも、関数は修正や再デプロイが可能です。「ソース」タブから編集することができます。
エラーの場合はエラーコードが画面に表示されるため、原因を特定する際に役立ちます。
また、CloudLoggingに移ることもでき、そこではより詳細にログを確認することができます。
以上で、CloudFunctionsの準備は完了です!次は関数を呼び出すためのCloudSchedulerについて見ていきましょう。
CloudSchedulerでジョブを作成
CloudSchedulerとは
CloudSchedulerとはタスクのスケジュールと実行を管理するためのサービスで、こちらもCloudFunctionsと同様にサーバレスサービスです。
作成したジョブを使用すると、定期実行させたい処理にスケジュールを設定したり、特定のイベントが発生した際に指定のサービスにリクエスト送信するよう設定したりすることができます。
CloudSchedulerを使用することで、スケジュールされたジョブの管理を簡素化し、タスクの自動化を容易にすることが可能です。
ジョブを作成
それでは早速CloudSchedulerでジョブを作成していきます。
GoogleCloudの画面で「CloudScheduler」と検索し、選択します。
するとジョブの一覧画面が表示されるので、画面中央の「ジョブのスケジュール設定」を押下
ボタンを押下するとスケジュールを定義する画面へ遷移します。今回は以下の通り設定します。
■スケジュールを定義
・名前:任意ですが、同じリージョン内のジョブで一意である必要があります。
・リージョン:「asia-northeast1(東京)」を選択します。
・説明:ジョブの説明を記載することができます。
・頻度:cron形式でジョブの頻度を設定できます。今回は「*/15 * * * *」。 ※cron形式は後述
・タイムゾーン:「日本標準時(JST)」を設定します。
【補足】cron形式とは
cron形式とは、ジョブのスケジュールを表現するための標準的な形式です。
cron形式は、以下のようなフィールドで構成されます。
分 時 日 月 曜日
* * * * *
フィールド | 指定できる値 |
分 | 0~59 |
時間 | 0~23 |
日 | 1~31 |
月 | 1~12、またはJAN~DEC |
曜日 | 0(日曜日)~6(土曜日)、またはSUN~SAT ※7も指定可能で日曜日に該当 |
また、今回のように「/数値」とすることで実行間隔を指定することも可能です。
※「*/15 * * * *」とすると15分ごとの実行を表す
項目を設定した後は「続行」を押下します。
続行を押下すると、次に実行内容の構成に遷移します。
■実行内容を構成する
ここではターゲットタイプを選択します。ターゲットタイプの種類は以下の通りです。
・HTTP
・Pub/Sub
・Workflows (HTTP経由)
今回はCloudFunctionsのトリガー設定時に控えておいたURLを使用するため、HTTPを選択します。URLには先ほど控えておいたURLを貼り付けます。
Authヘッダーでは「OICDトークンを追加」を選択し、サービスアカウントの欄には先ほど作成したCloudFunctionsに設定されているサービスアカウントを選択します。
設定が完了した後に続行を押下すると、その他オプションを設定することができます。
今回はデフォルトのまま「更新」を押下します。
しばらく待機すると、ジョブが作成され最初の一覧画面に表示されます。
あとは頻度で設定したタイミングで自動的に実行されます。
無事ステータスに「成功」が表示されました!
まとめ
いかがでしたでしょうか。
今回はCloudSchedulerをCloudFunctionsを呼び出すトリガーとして使用してみました。
CloudSchedulerでスケジュール設定を行うことで、CloudFunctionsに記述したコードを簡単に定期実行させることができます。
皆さんも、是非業務で活用してみてください!
Google および Google Cloud Platform™ service は Google LLC の商標であり、この記事は Google によって承認されたり、Google と提携したりするものではありません。
コメント