このチュートリアルでは、App Engine アプリケーション内で Cloud Tasks を使用して Cloud Run 関数をトリガーし、スケジュールされたメールを送信する方法について説明します。
コードについて
このセクションでは、アプリのコードとその動作を順を追って説明します。
タスクの作成
インデックス ページは、app.yaml のハンドラを使用して提供されます。タスクの作成に必要な変数が、環境変数として渡されます。
このコードにより、エンドポイント /send-email が作成されます。このエンドポイントは、インデックス ページからのフォーム送信を処理し、そのデータをタスク作成コードに渡します。
このコードでは実際にタスクが作成され、Cloud Tasks キューに送信されます。コードは、次の方法でタスクを構築します。
- ターゲット タイプを - HTTP Requestに指定します。
- 使用する - HTTP methodとターゲットの- URLを指定します。
- ダウンストリーム アプリケーションが構造化ペイロードを解析できるように、 - Content-Typeヘッダーを- application/jsonに設定します。
- 認証を要求しているリクエスト ターゲットに Cloud Tasks が認証情報を提供できるように、サービス アカウントのメールアドレスを追加します。サービス アカウントは個別に作成されます。 
- 日付のユーザー入力が最大 30 日以内であることを確認し、フィールド - scheduleTimeとしてリクエストに追加します。
メールの作成
このコードは、Cloud Tasks リクエストのターゲットである Cloud Run 関数を作成します。リクエスト本文を使用してメールを作成し、SendGrid API を介して送信します。
アプリケーションの準備
SendGrid の設定
- SendGrid アカウントを作成する。 - これは、SendGrid ウェブサイトから手動で行うこともできます。
- アカウントを作成し、課金データを統合する Google Cloud Launcher を使って行うことも可能です。Cloud Launcher を使って SendGrid アカウントを作成するをご覧ください。
 
- SendGrid API キーを作成します。 - SendGrid アカウントにログインします。 
- 左側のナビゲーションで、[設定] を開き、[API キー] をクリックします。 
- [Create API Key] をクリックし、制限付きアクセスを選択します。[メール送信] ヘッダーで、[フルアクセス] を選択します。 
- 表示された API キーをコピーします(このキーは 1 回だけ表示されます。後で使用できるように別の場所に貼り付けてください)。 
 
ソースコードのダウンロード
- ローカルマシンにサンプルアプリのレポジトリのクローンを作成します。 - git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
- サンプルコードが入っているディレクトリに移動します。 - cd cloud-tasks/
Cloud Run 関数のデプロイ
- function/ディレクトリに移動します。- cd function/
- 関数をデプロイします。 - gcloud functions deploy sendEmail --runtime nodejs14 --trigger-http \ --no-allow-unauthenticated \ --set-env-vars SENDGRID_API_KEY=SENDGRID_API_KEY \ - SENDGRID_API_KEYを API キーに置き換えます。- このコマンドでは、次のフラグを使用します。 - --trigger-httpは Cloud Run functions のトリガータイプを指定します。
- --no-allow-unauthenticated: 関数の呼び出しに認証が必要であることを指定します。
- --set-env-varは SendGrid 認証情報を設定します。
 
- 認証されたユーザーだけを許可するように、関数へのアクセス制御を設定します。 - Cloud Run 関数 UI で - sendEmail関数を選択します。
- sendEmailの権限情報が表示されない場合は、右上隅にある [情報パネルを表示] をクリックします。
- 上の [プリンシパルを追加] ボタンをクリックします。 
- [新しいプリンシパル] を - allAuthenticatedUsersに設定します。
- [ロール] を設定します。 - 第 1 世代の関数: ロールを Cloud Function Invokerに設定します。
- 第 2 世代の関数: ロールを Cloud Run Invokerに設定します。
 
- 第 1 世代の関数: ロールを 
- [保存] をクリックします。 
 
Cloud Tasks キューの作成
- 次の - gcloudコマンドを使用して、キューを作成します。- gcloud tasks queues create my-queue --location=LOCATION - LOCATIONは、キューの目的のロケーション(- us-west2など)に置き換えます。ロケーションを指定しない場合は、gcloud CLI によってデフォルトが選択されます。
- 正常に作成されたことを確認します。 - gcloud tasks queues describe my-queue --location=LOCATION - LOCATIONは、キューのロケーションに置き換えます。
サービス アカウントの作成
Cloud Tasks リクエストでは、Cloud Run 関数がリクエストを認証するための認証情報を Authorization ヘッダーで指定する必要があります。このサービス アカウントで、その目的のために Cloud Tasks で OIDC トークンを作成して追加できます。
- [サービス アカウント] ページで、[サービス アカウントを作成] をクリックします。 
- サービス アカウント名(わかりやすい表示名)を追加し、[作成] を選択します。 
- ロールを設定し、[続行] をクリックします。 - 第 1 世代の関数: ロールを Cloud Function Invokerに設定します。
- 第 2 世代の関数: ロールを Cloud Run Invokerに設定します。
 
- 第 1 世代の関数: ロールを 
- [完了] を選択します。 
エンドポイントとタスク作成者の App Engine へのデプロイ
- app/ディレクトリに移動します。- cd ../app/
- app.yamlの変数を実際の値で更新します。- キューのロケーションを探すには、次のコマンドを使用します。 - gcloud tasks queues describe my-queue --location=LOCATION - LOCATIONは、キューのロケーションに置き換えます。- 関数の URL を探すには、次のコマンドを使用します。 - gcloud functions describe sendEmail 
- 次のコマンドを使用して、アプリケーションを App Engine スタンダード環境にデプロイします。 - gcloud app deploy 
- アプリケーションを開き、ポストカードをメールで送信します。 - gcloud app browse