このチュートリアルでは、App Engine アプリケーション内で Cloud Tasks を使用して Cloud Run 関数をトリガーし、スケジュールされたメールを送信する方法について説明します。
目標
- 各コンポーネントのコードを理解する。
- SendGrid アカウントを作成する。
- ソースコードをダウンロードする。
- Cloud Tasks リクエストを受信し、SendGrid API を介してメールを送信する Cloud Run 関数をデプロイする。
- Cloud Tasks キューを作成する。
- Cloud Tasks リクエストを認証するためのサービスアカウントを作成する。
- ユーザーがメールを送信できるようにクライアントコードをデプロイする。
費用
Cloud Tasks、Cloud Run 関数、App Engine には無料枠があるため、無料枠でチュートリアルを実行する限り、追加の費用は発生しません。詳細については、料金をご覧ください。
始める前に
Google Cloud プロジェクトを選択または作成します。
プロジェクトで App Engine アプリケーションを初期化します。
[App Engine へようこそ] ページで [アプリケーションを作成] をクリックします。
アプリケーションのリージョンを選択します。このロケーションは、Cloud Tasks リクエストの
LOCATION_ID
パラメータとして使用するため、メモしておいてください。App Engine コマンドで europe-west および us-central と呼ばれる 2 つのロケーションは、Cloud Tasks コマンドではそれぞれ europe-west1 および us-central1 と呼ばれます。言語として [Node.js] を選択し、環境として [Standard] を選択します。
[課金を有効にする] ポップアップが表示されたら、請求先アカウントを選択します。まだ請求先アカウントがない場合は、[請求先アカウントの作成] をクリックしてウィザードの手順を行います。
[開始] ページで [次へ] をクリックします。他のことは後で対応します。
Cloud Run 関数と Cloud Tasks APIs を有効にします。
gcloud CLI をインストールして初期化する
コードについて
このセクションでは、アプリのコードとその動作を順を追って説明します。
タスクの作成
インデックス ページは、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 関数のトリガータイプを指定します。--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
クリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。
リソースの削除
Google Cloud で作成したリソースをクリーンアップして、今後料金が発生しないようにします。次のセクションで、このようなリソースを削除または無効にする方法を説明します。
Cloud Run 関数の削除
Google Cloud コンソールの [Cloud Run 関数] ページに移動します。
[Cloud Run 関数] ページに移動します。
関数の横にあるチェックボックスをクリックします。
ページの上部にある [削除] ボタンをクリックして、削除操作を確定します。
Cloud Tasks キューの削除
Console で Cloud Tasks キューのページを開きます。
削除するキューの名前を選択し、[キューの削除] をクリックします。
処理を確認します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- HTTP ターゲット タスクの作成の詳細を学習する。
- Cloud Tasks キューの詳細を学習する。