Salesforce CRM と企業内で保護された Cloud Functions の統合

このチュートリアルでは、Google Cloud 外部でホストされているサービスから呼び出される Cloud Functions を保護するためのアプローチについて説明します。一般的なユースケースには、顧客管理(CRM)システムなどの Software as a Service(SaaS)アプリ、パートナー ウェブシステム、消費者向けアプリから Cloud Functions を呼び出す場合が含まれます。

このチュートリアルは、アーキテクト、プロダクト オーナー、IT プロフェッショナルを対象としています。このチュートリアルでは、Cloud 関数を外部ソースから呼び出す方法を説明します。また、Cloud Functions を使用する一般的なユースケースについても説明します。

このチュートリアルは、読者が Cloud Functions、Salesforce、Node.js、REST API に精通していることを前提としています。

目標

  • 外部サービスから呼び出せる Cloud Functions の関数をデプロイする。
  • Cloud Identity and Access Management の権限を使用して、デプロイした関数へのアクセスを制御する。
  • JSON ウェブトークン(JWT)リクエストを作成し、外部サービスから ID トークンを使用して Cloud 関数を呼び出す。
  • 承認されたサービスのみが保護された関数にアクセスできることを確認する。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

  • Cloud Functions

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Functions API を有効にします。

    API を有効にする

はじめに

Cloud Functions は、コードを Google Cloud 上で実行し、オンデマンドで、またはイベントへの応答として関数を呼び出す手段となります。

多くの場合、企業の技術エコシステムはさまざまなプラットフォームとアプリからなります。一般に、こうした各種のプラットフォームとそれらのプラットフォームが保持するビジネスデータを統合することが、ビジネスの俊敏性を高める鍵となります。さらに、企業のデータとアプリ間でのデータの移動をセキュリティで保護するのは、組織にとって非常に重要なことです。エンタープライズ アプリ(Salesforce CRM など)に Cloud Functions を統合するときは、どの呼び出し側がどのように関数を呼び出すかを制御できるよう、関数の呼び出しをセキュリティで保護するための手順を踏む必要があります。

適切に設計されたアクセス制御メカニズムには多くの利点があります。まず、攻撃対象領域を縮小し、最小権限の原則に従うのに役立ちます。さらに、セキュリティ メカニズムと制御メカニズムが確立されて、許容する呼び出し側を制限できるようになるため、費用を予測しやすくなります。

アクセス制御を Cloud Functions に追加する方法を学べるよう、このチュートリアルでは例として、保護された Cloud 関数を Salesforce CRM から呼び出す方法について説明します。この関数が呼び出されるのは、Salesforce CRM プラットフォーム内で新しい顧客レコードが作成されて、処理のために Google Cloud 内の記録システム(顧客マスター)に送信された時点です。このチュートリアルでは Salesforce CRM の使用に重点を置いていますが、このソリューションで使用するアプローチは、他の SaaS アプリから Cloud Functions を呼び出す場合にも適用できます。

簡単にするために、GitHub リポジトリにチュートリアルの手順で使用する Cloud 関数を用意してあります。

アーキテクチャ

以下の図は、保護された Cloud 関数を外部サービスから呼び出す場合のアーキテクチャと手順の概要を示しています。承認されたユーザーとサービスだけが保護された関数を呼び出せるよう、Cloud 関数を限定公開でデプロイできます。

Cloud Functions の関数の認証と呼び出しに伴う手順を示す、このアプローチのアーキテクチャ。

図に示されている手順は次のとおりです。

  1. 外部 Salesforce サービスが、署名付き JWT を使用して ID トークンを要求します。
  2. JWT が有効であれば、Google 承認サーバーから署名付き ID トークンが返されます。
  3. Salesforce サービスが受け取った ID トークンを使用して、API リクエストを保護された Cloud 関数に送信します。
  4. Cloud 関数コンテナが内部で、Authorization Bearer ヘッダーで送信された ID トークンを検証します。
  5. トークンが有効かどうかに基づいて、Cloud 関数が実行されます。
    • トークンが有効な場合、Cloud 関数のコードが実行されて、呼び出し側サービスに「成功」のレスポンスが返されます。必要に応じて、Cloud 関数から他の Google Cloud サービスを呼び出すこともできます。
    • トークンが有効でない場合、HTTP 401 または 403 ステータス コードのレスポンスが返され、Cloud Functions の関数のコードは実行されません。

このチュートリアルでは、Salesforce プラットフォーム上でホストされている外部サービスから、Cloud 関数を呼び出します。Salesforce CRM 内で顧客レコードが作成されると、パイプラインがトリガーされて、上の図に示されている手順が開始されます。Salesforce CRM は Google Cloud サービス アカウントの秘密鍵を保持し、上の図の手順でその鍵を使って、保護された Cloud 関数を呼び出します。このアプローチでは、Salesforce Apex クラスを使用します。

Salesforce CRM 内で顧客レコードが作成されると、Apex トリガーにより、Apex クラス(GCPManageCustomersService)に含まれるキューイング可能ジョブが非同期で実行されます。

保護された Cloud Functions を呼び出す一般的なユースケース

Cloud Functions をエコシステムに統合すると、エンタープライズ ビジネス プロセス全体で、ビルディング ブロックとして使用できるようになります。Cloud Functions は、次のようなタスクに使用できます。

  • ビジネスデータ(フロントエンド CRM システムの顧客レコードなど)を Google Cloud に挿入し、データを保管して分析処理に使用できるようにする。

  • Firestore や Cloud SQL などのバックアップ保存先が顧客マスター(記録システム)として機能する場合、バックアップ保存先で保持する顧客データを作成または更新する。

  • Google Cloud 上のデータストアからトランザクション データ(注文、サービスの依頼、サービスの予約、商品の詳細など)を取得する。たとえば、Salesforce などの SaaS プラットフォーム内で包括的な顧客ビューを作成する場合には、この方法を使用します。

  • パートナー組織から受信した、解析が必要なデータファイルを変換してから、Google Cloud 上のデータレイクまたはデータ ウェアハウスに読み込む。

  • BigQuery と BigQuery ML を使用して分析情報を生成するために、顧客とのやり取りのデータ(フォーム送信、画像など)またはウェブサイトへのドキュメント アップロードを解析する。

このチュートリアルでは、最初のユースケース(Google Cloud へのビジネスデータの挿入)を実装しますSalesforce CRM 内で顧客データが作成されると、保護された Cloud 関数の呼び出しによって、そのデータが Google Cloud に送信されます。

その新しい顧客レコードは、Google Cloud 内で必要に応じて処理できます。共通パターンとしては、Cloud SQL、Firestore、BigQuery などの顧客マスターに顧客レコードを挿入して分析処理を行えるようにすることが挙げられます。このチュートリアルでは、これらのレコードの処理方法については説明しません。

環境を初期化する

  1. Cloud Console で、[Cloud Shell をアクティブにする] をクリックします。

    Cloud Shell を開く

    このチュートリアルでは、すべてのターミナル コマンドに Cloud Shell を使用します。

  2. Cloud Shell で、デフォルト プロジェクトとして作成または選択したプロジェクトを設定します。project-id を Cloud プロジェクト ID に置き換えます。

    gcloud config set project project-id
    
  3. リージョンとゾーンのデフォルト設定を割り当てます。

    gcloud config set run/region us-central1
    gcloud config set compute/zone us-central1-a
    

    このチュートリアルでは、デフォルト リージョンとして us-central1 を使用し、デフォルト ゾーンとして us-central1-a を使用します。

保護された Cloud Functions の関数を作成する

まず、Cloud Functions の関数を作成します。ここで作成した Cloud Functions の関数を後で呼び出します。

ソース リポジトリのクローンを作成する

  1. Cloud Shell で、サンプルの Cloud Functions の関数と Salesforce アーティファクトが格納されている GitHub リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/salesforce-cloud-functions-crm-tutorial
    
  2. リポジトリのクローンとして作成されたディレクトリに移動します。

    cd salesforce-cloudfunc-integration
    

ディレクトリ内のコードを確認する

ディレクトリには、salesforcemanage-customer-func という名前の 2 つのディレクトリがあります。salesforce ディレクトリ内には、次の Salesforce Apex コードファイルがあります。

  • CustomerAccounts.trigger ファイル。このファイルには、新しい顧客アカウントが作成されると GCPManageCustomersService クラス内のキューイング可能ジョブをトリガーするコードが含まれています。
  • GCPManageCustomersService クラス。このファイルには、生成された JWT と引き換えに Google ID トークンを要求し、Cloud 関数を呼び出すコードが含まれています。
  • Salesforce XML メタデータ ファイル。

manage-customer-func ディレクトリ内には、secureFunction という名前の Cloud Functions の関数の Node.js コードファイルと、この Cloud Functions の関数の依存関係の概要を示すパッケージング ファイルがあります。

関数の呼び出しに使用する外部 Salesforce サービスのサービス アカウントを作成する

Google Cloud 上にデプロイされたサービスとリソースへのアクセスを厳しく管理するために、最小権限の原則に従うことをおすすめします。このセクションでは、Cloud Functions の関数にアクセスする外部 SaaS サービスのサービス アカウントを作成します。

Console

  1. Cloud Console で、[サービス アカウント] ページに移動します。

    [サービス アカウント] ページに移動

  2. [プロジェクトを選択] をクリックし、このチュートリアル用に作成したプロジェクトを選択します。

  3. [サービス アカウントを作成] をクリックします。

  4. サービス アカウント名 function-invoker-sa を入力します。

  5. [作成] をクリックします。

  6. このサービス アカウントの役割として [Cloud Functions 起動元] を選択し、[保存] をクリックします。

  7. [続行] をクリックします。

  8. [鍵を作成] をクリックし、[キーのタイプ] として [P12] を選択してから [作成] をクリックします。

    P12 鍵ファイルがローカル ディスクにダウンロードされます。

    Google Cloud によって生成されたデフォルトのパスワード(通常は notasecret)をメモします。

  9. [完了] をクリックしてサービス アカウントの作成を完了します。

  10. Cloud Shell で [その他] をクリックし、[ファイルをアップロード] を選択します。

  11. ファイルを Cloud Shell にアップロードするには、先ほどダウンロードした project-id-NNNNNN.p12 鍵ファイルを選択し、[開く] をクリックします(文字列 NNNNNN は、鍵ファイルの名前の一部として生成された一連の数値です)。

  12. Cloud Shell で、ホーム ディレクトリに移動します。

    cd $HOME
    
  13. アップロードした鍵ファイルの名前を、後でチュートリアルで使用しやすいように、わかりやすい名前に変更します。

    mv ${DEVSHELL_PROJECT_ID}-NNNNNN.p12 external-service-invoker-sa.p12
    

gcloud

  1. ホーム ディレクトリに移動します。

    cd $HOME
    
  2. 作成するサービス アカウントの名前を格納する環境変数を作成します。

    export SERVICE_ACCOUNT_NAME=function-invoker-sa
    
  3. サービス アカウントを作成します。

    gcloud beta iam service-accounts create ${SERVICE_ACCOUNT_NAME} \
        --display-name ${SERVICE_ACCOUNT_NAME}
    
  4. サービス アカウントの P12 鍵を生成し、ダウンロードします。

    gcloud iam service-accounts keys create ~/external-service-invoker-sa.p12 \
        --key-file-type p12 \
        --iam-account ${SERVICE_ACCOUNT_NAME}@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com
    

    Cloud Shell のホーム($HOME)ディレクトリに P12 鍵がダウンロードされます。Cloud Shell 内に表示される出力にも、鍵がダウンロードされた場所が示されます。

Cloud Functions の関数をデプロイする

保護された関数として Cloud 関数をデプロイします。保護された関数を呼び出せるのは、その関数へのアクセス権を付与されたユーザーとサービスだけです。次のステップで Cloud IAM アクセス権を設定して権限を確定します。

  1. Cloud Shell で、manage-customer-func ディレクトリに移動します。

    cd manage-customer-func
    
  2. 関数をデプロイします。

    gcloud functions deploy secureFunction \
        --runtime nodejs8 \
        --trigger-http
    
  3. 関数が正常にデプロイされたことを確認します。

    gcloud functions describe secureFunction
    

    デプロイに成功すると、次のような準備完了ステータスが表示されます。

    status:  ACTIVE
    timeout:  60s
    httpsTrigger:
      url: https://us-central1-[PROJECT_ID].cloudfunctions.net/secureFunction
    

    後で必要になるので、httpsTrigger の URL をメモしておきます。

デプロイされた関数へのアクセス権を付与する

次は、作成したサービス アカウントに、secureFunction Cloud 関数にアクセスするための適切な役割を割り当てます。また、自動的に追加された allUsers アカウントを削除します。これにより、サービス アカウントだけが Cloud Functions の関数を呼び出せるようになります。

Console

  1. Cloud Console で、[Cloud Functions] ページを開きます。

    [Cloud Functions] ページに移動

  2. 関数のリストから [secureFunction] を選択します。

  3. [情報パネル] が表示されていない場合は、ツールバーで [情報パネルを表示] をクリックします。

  4. [権限] タブで、[メンバーを追加] をクリックします。

  5. [新しいメンバー] ボックスに「function-invoker-sa」と入力してファクションにアクセスする必要があるサービス アカウントを検索し、該当するサービス アカウントを選択します。

  6. [役割を選択] リストで [Cloud Functions] を選択し、[Cloud Functions 起動元] の役割を選択します。

  7. [保存] をクリックします。

  8. [権限] タブで、[Cloud Functions 起動元] のロールを展開します。

  9. allUsers メンバーの行で [削除] ボタンをクリックし、[削除] をクリックして確定します。これにより、この関数が公開アクセスの対象外になります。

gcloud

  1. デプロイされた関数へのアクセスを許可するために、作成したサービス アカウントに [Cloud Function 起動元] のロールを割り当てます。

    gcloud beta functions add-iam-policy-binding secureFunction \
        --member=serviceAccount:${SERVICE_ACCOUNT_NAME}@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --role=roles/cloudfunctions.invoker
    
  2. [Cloud Function 起動元] のロールから allUsers メンバーを削除します。

    gcloud beta functions remove-iam-policy-binding secureFunction \
        --member=allUsers \
        --role=roles/cloudfunctions.invoker
    

保護された関数を呼び出す Salesforce サービスを作成する

Salesforce 組織に、ビジネス プロセスフローを起動するために必要な Apex コードを設定する必要があります。Salesforce CLI(SFDX)を使用して、Salesforce コードと必要な構成をスクラッチ組織にデプロイします。必要に応じて、デプロイした変更を後で本番環境に昇格できます。

次のリストに、Salesforce 組織で行う必要があるタスクを要約します。このセクションの詳細な手順で、各タスクについて説明します。

  1. Salesforce CLI を設定します。
  2. スクラッチ組織を作成し、クローニングしたリポジトリからその組織にコードを push します。
  3. エクスポートした Google Cloud サービス アカウントの P12 鍵から Java KeyStore(JKS)鍵を作成し、その JKS 鍵を Salesforce サービスにインポートします。
  4. カスタム メタデータ型オブジェクトに Google Cloud の設定に関連するデータを取り込みます。これには、呼び出す関数のエンドポイント、サービス アカウントのメールアドレス、Salesforce サービスが ID トークンを要求するために使用できるトークン エンドポイントが含まれます。
  5. 作成した Apex クラスを見直して、カスタム メタデータ型のフィールド名と JKS 鍵の名前が Apex コードで正しく参照されていることを確認します。
  6. Salesforce CRM 内で顧客レコードを作成します。これにより、CustomerAccounts.trigger コードが呼び出され、新しい顧客レコードのデータを Google Cloud に送信するためのプロセスが開始されます。

Salesforce CLI を設定する

このセクションでは、Salesforce CLI をインストールして、その CLI が承認されるように設定します。

Salesforce CLI をインストールする

  1. Cloud Shell で、ホーム ディレクトリに移動します。

    cd $HOME
    
  2. Cloud Shell セッションで Salesforce CLI をインストールします。

    wget https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz
    
  3. ダウンロードした tar ファイルを解凍します。

    tar -xvf sfdx-linux-amd64.tar.xz
    
  4. Salesforce バイナリをパスに追加します。

    export PATH="$PATH:${HOME}/sfdx-cli-v7.8.1-8f830784cc-linux-x64/bin"
    

    これで、Salesforce CLI を使用してコマンドを実行できるようになりました。

  5. CLI が正しく設定されていることを確認します。

    sfdx
    

    出力は次のとおりです。

    バージョン、使用法、コマンド、トピックを含む、sfdx コマンドの出力を示すターミナル リスティング。

    バージョン情報とコマンドのリストが表示されます。

  6. Salesforce 組織の [設定] で、[クイック検索] ボックスに「Dev Hub」と入力し、[Dev Hub] を選択します。

    Salesforce ダッシュボード内での「Dev」の検索。

  7. Dev Hub を有効にします。

    [Dev Hub] 切り替えスイッチを使用して Dev Hub を有効にします。

    このステップでは、このチュートリアルのコードをデプロイするスクラッチ組織を設定します。

  8. Cloud Shell で、SFDX CLI から Salesforce 組織に対する認証を行うための証明書と鍵のペアを生成します。

    openssl req -x509 -sha256 -nodes -days 36500 -newkey \
       rsa:2048 -keyout salesforce.key -out \
       salesforce.crt
    

    証明書を識別する詳細を入力するよう求められます。このチュートリアルでは、この値は重要でないため、Enter キーを押してデフォルト値を受け入れます。

  9. Cloud Shell で [さらに表示] をクリックし、[ファイルをダウンロード] を選択します。

  10. [完全修飾ファイルパス] ボックスに、次のファイル名を入力し、[ダウンロード] をクリックします。

    salesforce.crt
    

    生成された証明書がローカルマシンにダウンロードされます。次の手順で、証明書を Salesforce 組織にアップロードします。

Salesforce(Dev Hub)組織内に Salesforce CLI を認可するための接続されているアプリを作成する

  1. Salesforce 組織のエディションに応じて、次のいずれかの手順で接続されているアプリを作成します。

    • Lightning Experience で、アプリケーション マネージャーを使用して接続されているアプリを作成します。Salesforce 組織の [設定] で、[クイック検索] ボックスに「App」と入力し、[アプリケーション マネージャー] を選択します。[新規接続アプリケーション] をクリックします。
    • Salesforce Classic の場合、Salesforce 組織の [設定] で、[クイック検索] ボックスに「Apps」と入力し、[アプリケーション]([ビルド]、[作成] の下にあります)を選択します。[接続されているアプリ] ペインで [新規] をクリックします。
  2. 連絡先メール情報とアプリに適切なその他の情報を入力します。

  3. [OAuth 設定の有効化] を選択します。

  4. [コールバック URL] の値として「http://localhost:1717/OauthRedirect」と入力します。

  5. デジタル署名を使用するオプションを有効にするには、[ファイルを選択] をクリックし、前にダウンロードした salesforce.crt 証明書ファイルを選択します。

    この証明書は、Cloud Shell セッションで実行中の SFDX クライアントを認証して Salesforce Dev Hub 組織に接続する際に使用する公開鍵として機能します。

  6. 次の OAuth 範囲を [選択した OAuth 範囲] に追加します。それには、範囲をクリックし、[追加] 矢印をクリックして選択します。

    • データにアクセスして管理する(api)
    • 随時ユーザーに代わってリクエストを実行する(refresh_token、offline_access)
    • ウェブ経由でデータにアクセスする(web)

      Salesforce ダッシュボード内で選択された OAuth 範囲。

  7. [保存] をクリックします。

  8. 表示されるコンシューマ鍵をメモします。

  9. [管理] をクリックし、[ポリシーを編集] をクリックして、OAuth ポリシーを変更します。

  10. [許可されているユーザー] を [管理者が承認したユーザーは事前承認済み] に設定し、この選択を確定します。

  11. [IP 制限の緩和] を [IP 制限の緩和] に設定します。

  12. [保存] をクリックします。

  13. [プロファイルの管理] をクリックし、[システム管理者] プロファイルを追加します。

    これにより、このプロファイルを引き継ぐユーザーが SFDX CLI にログインできるようになります。

  14. [保存] をクリックします。

Salesforce CLI の認可ステップを完了する

  1. Cloud Shell で、前の手順の接続されているアプリによって作成されたコンシューマ鍵を格納する環境変数を作成します。

    export CONSUMER_KEY=your-consumer-key
    

    your-consumer-key を実際のコンシューマ鍵で置き換えます。

  2. このチュートリアルで前に作成した Salesforce 組織のユーザー名を格納する環境変数を作成します。

    export SALESFORCE_USERNAME=your-salesforce-username
    

    your-salesforce-username を実際の Salesforce 名で置き換えます。

  3. Cloud Shell で、JWT 付与を使用して Salesforce 組織に対する認証を行います。

    sfdx force:auth:jwt:grant \
        -u ${SALESFORCE_USERNAME} \
        -f $(pwd)/salesforce.key -i ${CONSUMER_KEY}
    

    承認されたことを伝えるメッセージが表示されます。

    JWT ベースのフローを使用して組織を承認する方法について詳しくは、Salesforce ドキュメントの JWT ベースのフローを使用した組織の承認に関するページをご覧ください。

Salesforce メタデータをスクラッチ組織に push する

  1. Cloud Shell で、クローニングしたリポジトリに移動します。

    cd salesforce-cloudfunc-integration
    
  2. このチュートリアル用にクローニングしたリポジトリをテストするためのスクラッチ組織を作成します。

    sfdx force:org:create \
        --setdefaultusername \
        --definitionfile salesforce/config/project-scratch-def.json \
        --targetdevhubusername ${SALESFORCE_USERNAME} \
        --setalias gcp-func-test-scratch-org
    

    このテストにはスクラッチ組織を使用することをおすすめします。スクラッチ組織は、新しいパッケージやクローニングしたリポジトリを安全にテストできるスペースになります。

  3. salesforce サブディレクトリに移動します。

    cd salesforce
    
  4. メタデータとコードをスクラッチ組織に push します。

    sfdx force:source:push
    
  5. スクラッチ組織の URL を生成します。

    sfdx force:org:open
    
  6. 生成された URL をクリックして、ブラウザでスクラッチ組織に移動します。

エクスポートされた P12 鍵を含む JKS キーストア ファイルを作成する

Salesforce の証明書と鍵のペアは、Salesforce サービスと外部のウェブサイトおよびサーバーとの間の認証済み SSL 通信に使用されます。Salesforce サービスでは、このチュートリアルで前に生成した、Google Cloud サービス アカウントの P12 鍵も安全に保管しなければなりません。Salesforce サービス内では鍵を JKS(Java KeyStore)形式で保管する必要があります。

  1. Cloud Shell で、ホーム ディレクトリ内にある salesforce.jks という名前の JKS キーストア ファイルに P12 鍵を追加します。

    keytool \
        -importkeystore \
        -srckeystore $HOME/external-service-invoker-sa.p12 \
        -destkeystore $HOME/salesforce.jks \
        -srcstoretype pkcs12 \
        -srcstorepass notasecret \
        -deststorepass notasecret \
        -deststoretype jks \
        -destalias google_cloud \
        -srcalias privatekey
    
  2. Cloud Shell で [さらに表示] をクリックし、[ファイルをダウンロード] をクリックします。

  3. [完全修飾ファイルパス] ボックスに、次のファイル名を入力し、[ダウンロード] をクリックします。

    salesforce.jks
    

    これにより、生成されたキーストアがローカルマシンにダウンロードされます。

Salesforce のスクラッチ組織に JKS ファイルをインポートする

これで、Salesforce.com ID プロバイダを有効にして JKS 鍵をアップロードする手順を完了できます。

  1. Salesforce 組織の [設定] で、[クイック検索] ボックスに「Identity」と入力し、[ID プロバイダ] をクリックして ID プロバイダの設定ページに移動します。

    Salesforce ダッシュボードの ID プロバイダの設定ページへの移動。

  2. [ID プロバイダを有効化] をクリックし、[保存] をクリックして証明書を受け入れます。

  3. [設定] で、[クイック検索] ボックスに「Certificate」と入力し、[証明書と鍵の管理] を選択します。

    Salesforce ダッシュボードの証明書と鍵の管理ページへの移動。

  4. [キーストアからインポート] をクリックします。

  5. [ファイルを選択] をクリックし、前にダウンロードした JKS ファイルを選択します。

  6. [キーストアのパスワード] ボックスに「notasecret」と入力します。

  7. [保存] をクリックします。

  8. 証明書のラベルが google_cloud となっていることを確認します。Apex クラスはこの名前を使用して証明書を参照するため、ラベルは重要です。

カスタム メタデータ型オブジェクト レコードを作成する

Salesforce CLI を使用してリポジトリを push すると、カスタム メタデータ型オブジェクトが自動的に作成されます。そのオブジェクトに詳細を取り込むには、このセクションで説明するレコードを作成します。このレコードが Apex クラスで参照されて、関連するメタデータを Salesforce サービスから呼び出す Cloud Functions の関数にマッピングするために使用されます。

  1. Salesforce スクラッチ組織の [設定] で、[クイック検索] ボックスに「Custom metadata」と入力し、[カスタム メタデータ型] を選択します。

    [GCP 鍵] というカスタム メタデータ型が表示されます。

  2. [GCP 鍵] の横にある [レコードの管理] をクリックします。

  3. [新規] をクリックして新しいレコードを作成し、次の情報を入力します。

    1. ラベル。「GCP Function Invoker」と入力します。
    2. クライアントのメール。作成したサービス アカウントのアドレスを次の形式で入力します。

      function-invoker-sa@project-id.iam.gserviceaccount.com

      project-id は、このチュートリアルの Cloud プロジェクトの ID に置き換えます。

    3. 関数の対象エンドポイント。Cloud 関数の httpsTrigger の URL を入力します。

      https://us-central1-project-id.cloudfunctions.net/secureFunction
      
    4. トークン エンドポイント。「https://www.googleapis.com/oauth2/v4/token」と入力します。

      Salesforce ダッシュボード内でのトークン エンドポイントの設定。

  4. [保存] をクリックします。

Salesforce スクラッチ組織内にリモートサイトの設定を作成する

リモートサイトの設定を追加して、Salesforce スクラッチ組織から Google Cloud の Cloud Functions の関数とトークンの各エンドポイントに Apex コールアウトが行われるようにします。

  1. Salesforce 組織の [設定] で、[クイック検索] ボックスに「Remote」と入力し、[リモートサイトの設定] を選択します。
  2. [新規リモートサイト] をクリックします。
  3. [リモートサイト名] に「GCPCloudFunction」と入力します。
  4. [リモートサイトの URL] に、Cloud 関数の httpsTrigger エンドポイントを入力します。

    https://us-central1-project-id.cloudfunctions.net/secureFunction
    
  5. [保存] をクリックします。

  6. [新規リモートサイト] をクリックし、別のリモートサイトの設定を作成します。

  7. [リモートサイト名] に「GCPToken」と入力します。

  8. [リモートサイトの URL] に「https://www.googleapis.com」と入力します。

    Salesforce ダッシュボード内でのリモートサイトの名前と URL の設定。

  9. [保存] をクリックします。

Cloud Functions の関数をテストする

Cloud Functions の関数をテストするには、次の 2 つのテストを行います。

  • 有効なトークンを使用して、Cloud Functions の関数を呼び出す Salesforce サービスをトリガーします。
  • トークンを使用せずに Google Cloud 関数を呼び出します。これにより、認証されていない限り Cloud Functions の関数を呼び出せないことが検証されます。

有効な ID トークンを使用して Salesforce サービスから Cloud Functions の関数を呼び出す

  1. Salesforce 組織で、[アプリケーション ランチャー] アイコンをクリックします。

    Salesforce ダッシュボード内でのアプリケーション ランチャーの起動。

  2. 検索バーで「Accounts」を検索します。

  3. 検索結果で、[アカウント] をクリックします。

  4. [新規] をクリックして、新しいアカウントを作成します。

  5. [名前] に、「テスト アカウント」と入力します。

  6. [保存] をクリックします。

    アカウントの作成。このアカウントで、secureFunction Cloud Functions の関数を呼び出す Apex クラスをトリガーします。

Cloud Functions の関数が呼び出されたことを確認する

Cloud Logging ログを確認して、Cloud Functions の関数がレコードを正常に受信したことを検証します。

  • Cloud Shell で、secureFunction Cloud Functions の関数によって生成されたログを確認します。

    gcloud functions logs read secureFunction
    

    Cloud Functions の関数が呼び出されていれば、ログに、Salesforce サービス内で作成した Test Account という顧客の名前が示されているはずです。

トークンを使用せずに Cloud Functions の関数を呼び出す

次は、認証済みユーザーと承認されたユーザーのみが Cloud Functions の関数にアクセスできることを確認できます。

  1. Cloud Functions の関数に未認証のリクエストを送信します。

    curl https://us-central1-${DEVSHELL_PROJECT_ID}.cloudfunctions.net/secureFunction
    

    レスポンスは HTTP 403 Forbidden ステータス コードです。これで、アクセスが拒否されたことを確認できました。

    <html><head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <title>403 Forbidden</title>
    </head>
    <body text=#000000 bgcolor=#ffffff>
    <h1>Error: Forbidden</h1>
    <h2>Your client does not have permission to get URL <code>/secureFunction</code> from this server.</h2>
    <h2></h2>
    </body></html>
    

クリーンアップ

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

Salesforce リソースの削除

このチュートリアル用に作成した Salesforce Developer Edition 組織および関連するスクラッチ組織も削除する必要があります。

Developer Edition 組織を無効にする

  1. Salesforce(Dev Hub)組織の [設定] で、[クイック検索] ボックスに「Company」と入力し、[組織情報] を選択します。
  2. [組織情報] をクリックします。
  3. [組織を無効化] ボタンをクリックします。

    Salesforce 設定ページの [組織を無効化] ボタン。

スクラッチ組織の削除

  • Cloud Shell で、次のコマンドを実行して Salesforce スクラッチ組織を削除します。

    sfdx force:org:delete -u gcp-func-test-scratch-org
    

次のステップ