概要
- Google Cloud Functions を定期実行するために、Cloud Sheduler と Pub/Sub を使った方法
- Google Cloud Functions からのインターネットアクセスが静的IPアドレスから行われるよう設定する方法
手順
- Cloud Functionsで関数を作成
- Cloud SchedulerでJobを作成
- VPCの作成
- サーバーレスVPCアクセスコネクタを作成
- Cloud Functionsの接続設定を変更
- Cloud NATを作成
- 静的IPになったことを確認する
Cloud Functionsで関数を作成
まずは関数を作成

関数名、リージョン、トリガーのタイプを選択。

トリガーはCloud Pub/Sub
を選択し、トピックは新規で作成をする。

保存をしたら次へを選択。

コードの画面へ遷移したら、ランタイムにNode.12を選択する。

添付画像のように「Cloud Build API では、選択されているランタイムを使用する必要があります。」と表示されている場合は「APIを有効にする」を選択してください。

画面遷移したら、Cloud Build APIを有効にしてください。
Cloud Build APIはCloud Functionsをデプロイするために必要となります。
Cloud Build API を有効にしたら Cloud Functions に戻りデプロイを選択して関数を作成/デプロイします。

デプロイがされたのが確認できます。これで関数の作成は完了です。
Cloud Scheduler で Job を作成
Cloud Schedulerのジョブは3つまで無料となります。
Google 請求先アカウントごとに、毎月 3 つのジョブを無料で利用できます。この無料枠は、プロジェクト単位ではなくアカウント単位で集計されますのでご注意ください。たとえば、アカウントに 5 つのプロジェクトがあり、各プロジェクトに 2 つのジョブがある場合、無料のジョブは 3 つ、有料のジョブは 7 つになります。
料金 | Cloud Scheduler のドキュメント | Google Cloud
メニューからCloud Schedulerを選択し、リージョンを選んでジョブを新たに作成します。


以下の画面が表示されるので、内容を入力していきます。
頻度はunix-cron形式を指定します。ここでは1時間ごとに設定をしています。

ジョブの定義をしたら構成を設定していきます。
ターゲットタイプは「Pub/Sub」を選択し、トピックは先ほど作成した「function-test-topic」を選択します。
メッセージ本文(ペイロード)は設定した内容をSubscriberへ送信することができます。 今回はCloud FunctionsがSubscriberなので、メッセージやデータなどを受け取ることが可能です。

詳細設定はデフォルトのままとし、作成します。

作成が完了するとJobが有効になり、設定したスケジュール通りに実行されるはずです。

VPCの作成
メニューからVPCネットワークを選択してください。
Compute Engine APIを有効にしていない場合は有効にします。

「Compute Engine API」を有効にし、VPCネットワークの画面が表示されたら「VPCネットワークの作成」から作成します。

名前を入力し、ルーティングモードはリージョンを選択します。
デフォルトで新しいサブネットの入力が表示されるのでキャンセルを押して削除します。

作成ボタンを押し、トップにVPCが作成されていることが確認できました。

サーバーレスVPCアクセスコネクタを作成
VPCネットワークのサイドメニューからサーバーレスVPCアクセスを選択します。

Serverless VPC Access API が有効になっていなければ有効にしましょう。

有効にしたらコネクタを作成を選択し、名前などを入力して作成します。
ネットワークには先ほど作成したfunctions-test-vpc
を選択します。
サブネットはカスタム IP 範囲を選択しIP範囲は10.0.1.0
とします。
スケーリング設定はデフォルトのままとしましょう。

トップで作成されていることが確認できました。

Cloud Functionsの接続設定を変更
アクセスコネクタを作成したので、Cloud Functionsで先ほど作成した関数を選択し編集から接続の設定を行います。
「RUNTIME, BUILD AND CONNECTIONS」のタブを開き、接続を選択します。
下り(外向き)設定で先ほど作成したコネクタを選択し、「すべてのトラフィックをVPCコネクタ経由でルーティングする」にチェックを入れます。

次へを選択し、index.jsに自分のIPアドレスを取得する以下の関数をconsole.log(message);
の下に追記してデプロイをしましょう。
const https = require('https');
const req = https.request('https://httpbin.org/ip', (res) => {
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
})
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
req.end();

参考
Cloud NATを作成
Cloud Functionsからのインターネットアクセスが静的IPアドレスから行われるようにCloud NATを作成します。
ネットワークサービスのCloud NATから開始を選択。


名前、作成したVPCネットワーク、リージョンを入力します。

Cloud Routerを新規に作成し、NAT IP アドレスは手動で静的IPの予約を行います。



静的IPの予約自体は VPCネットワークの外部IPアドレスから行うこともできます。
これでCloud functionからのアクセスが静的IPになったはずです。
設定されている静的IPをメモしておきましょう。
静的IPになったことを確認する
先ほどCloud Functionsのindex.jsに記述した関数を実行します。
テスト中のタブを選択し、関数をテストします。

テストの実行が完了したらログを確認します。先ほど設定した静的IPアドレスが表示されてるので、無事設定されていることが確認できます。

参考記事
さいごに
これで Cloud Functions を静的IPで実行できるようになりました。
また、スケジューラーで定期実行もできるので、あとはcronを設定して実行すれば動くはずです。