Cloud Functions と Pub/Sub に基づくサーバーレス統合ソリューションのデプロイ

このチュートリアルでは、Google マーケティング プラットフォームのサーバーレス統合ソリューションで説明したコンセプトに基づいてデータ統合ソリューションを設定し、テストする方法について説明します。

このサーバーレス ソリューションのデモは、GitHub のオープンソース デモで利用できます。このソリューションには、Google Cloud でのソリューションの設定に役立つ API とシェル スクリプトが付属しています。

このチュートリアルは、API やその他のプログラムによる統合オプション(SFTP アップロードなど)を使用してデータとターゲット システムの統合を自動化するデータ エンジニアやアーキテクトを対象としています。

目標

  • サーバーレス統合ソリューションをデプロイする。
  • ターゲット システムの統合をターゲット API 用に設定する。
  • CSV ファイルを Google スプレッドシートに読み込んで、このソリューションをテストする。

料金

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

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

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

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

  4. Cloud Shell を開く
  5. Cloud Shell を開く

ソリューションのインストール

  1. Cloud Shell で、このチュートリアルで使用するコードが含まれているリポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/cloud-for-marketing.git
    
  2. インストール スクリプトを実行します。

    cd cloud-for-marketing/marketing-analytics/activation/gmp-googleads-connector; chmod a+x deploy.sh; ./deploy.sh
    

    このスクリプトは、環境の確認や依存関係のコンパイルなど、一連のプロセスを実行します。

  3. プロンプトが表示されたら、このチュートリアルで使用する Cloud プロジェクト ID を入力します。

  4. Cloud Function をデプロイし、Cloud Storage にデータを格納するリージョンを選択します。たとえば、us-east1 です。

  5. 使用する組み込み API を選択するか、Enter を押してすべて選択します。このソリューションには、次のターゲット API が含まれています。

    • Google アナリティクス Measurement Protocol
    • Google アナリティクス Management API(データ インポート)
    • キャンペーン マネージャー コンバージョンのアップロード
    • 検索広告 360 にビジネスデータをアップロードするための SFTP アップロード
    • Google スプレッドシートに基づいて、アップロードが予定された Google 広告コンバージョンの Google スプレッドシート API
    • 検索広告 360 コンバージョンのアップロード

    インストール後に Google スプレッドシート API を使用したテストを実行するため、Google スプレッドシート API を含めます。インストールを実行するために必要な権限があるかどうかがチェックされます。このチェックが失敗した場合は、不足している権限を管理者にリクエストしてから、スクリプトを再度実行してください。

  6. データを保存する Cloud Storage バケットの名前を入力します。 バケットが存在しない場合は、リージョンを選択すると、スクリプトによってバケットが作成されます(Cloud Functions のデプロイ先と一致するデフォルトのリージョンの使用をおすすめします)。

  7. このソリューションでモニタリングする Cloud Storage フォルダを入力するか、Enter を押してデフォルトのフォルダを選択します。

  8. Pub/Sub トピックとサブスクリプションの接頭辞を入力するか、Enter を押してデフォルトの接頭辞を使用します。

  9. プロンプトが表示されたら、「Y」と入力して確定し、設定を config.json ファイルに保存します。

    Pub/Sub トピックとサブスクリプションが作成されます。

  10. 有効にした API にサービス アカウントが必要な場合は、サービス アカウント名を入力し、ダウンロードするキーファイルを確認します。

  11. Cloud Functions が自動的にデプロイされた後、スクリプトによって Firestore または Datastore インスタンスが準備できているかどうかが示されます。準備ができていない場合は、Firestore を起動する手順を出力します。

データの準備

これでソリューションがインストールされ、ターゲット システムのデータを準備できるようになりました。

ファイル形式

このソリューションに組み込まれている API には、次のような場合に特定のファイル形式が必要です。

  • SFTP アップロードに形式のリクエストがない場合。この統合では、ファイルの形式に関係なく SFTP を使用してファイルがサーバーにアップロードされます。
  • Google アナリティクスの Management API(データ インポート)と Google スプレッドシート API で、CSV ファイルが必要な場合。
  • 他のすべての API で、改行区切りの JSON(NDJSON)が必要な場合。すべての行は有効な JSON 文字列です。たとえば、BigQuery のエクスポート形式をご覧ください。

API 構成

構成は API ごとに異なり、用途によって 1 つの API に複数の構成を使用できます。したがって、構成は API によってグループ化され、ファイル config_api.json 内にある単一の JSON オブジェクトを組み合わせます。次に、このチュートリアルにある GitHub リポジトリの JSON テンプレート ファイル一覧で、構成方法を示します。

{
  "CM": {
    "foo": {
      "cmAccountId": "[YOUR-DCM-ACCOUNT-ID]",
      "cmConfig": {
        "idType": "encryptedUserId",
        "conversion": {
          "floodlightConfigurationId": "[YOUR-FL-CONFIG-ID]",
          "floodlightActivityId": "[YOUR-FL-ACTIVITY-ID]",
          "quantity": 1
        },
        "customVariables": [
          "[YOUR-U-VARIABLES-NAME-1]", "[YOUR-U-VARIABLES-NAME-2]"
        ],
        "encryptionInfo": {
          "encryptionEntityId": "[YOUR-ENCRYPTION-ID]",
          "encryptionEntityType": "DCM_ADVERTISER",
          "encryptionSource": "AD_SERVING"
        }
      }
    }
  },
  "GA": {
    "bar": {
      "dataImportHeader": "[YOUR-DATA-IMPORT-HEADER]",
      "gaConfig": {
        "accountId": "[YOUR-GA-ACCOUNT-ID]",
        "webPropertyId": "[YOUR-WEB-PROPERTY-ID]",
        "customDataSourceId": "[YOUR-CUSTOM-DATASOURCE-ID]"
      }
    }
  },
  "MP": {
    "baz": {
      "mpConfig":{
        "v": "1",
        "t": "transaction",
        "ni": "1",
        "dl": "[YOUR-SOMETHING-URL]",
        "tid": "[YOUR-WEB-PROPERTY-ID]"
      }
    }
  },
  "SFTP": {
    "qux": {
      "sftp":{
        "host": "[YOUR-SFTP-HOST]",
        "port": "[YOUR-SFTP-PORT]",
        "username": "[YOUR-SFTP-USERNAME]",
        "password": "[YOUR-SFTP-PASSWORD]"
      }
    }
  },
  "GS": {
    "foo": {
      "spreadsheetId": "[YOUR-SPREADSHEET-ID]",
      "sheetName": "[YOUR-SHEET-NAME]",
      "sheetHeader": "[ANYTHING-PUT-AHEAD-OF-CSV]",
      "pasteData": {
        "coordinate": {
          "rowIndex": 0,
          "columnIndex": 0
        },
        "delimiter": ","
      }
    }
  },
  "SA": {
    "bar": {
      "saConfig": {
        "currencyCode": "[YOUR-CURRENCY-CODE]",
        "type": "TRANSACTION",
        "segmentationType": "FLOODLIGHT",
        "segmentationId": "[YOUR-SEGMENTATION-ID]",
        "state": "ACTIVE"
      },
      "availabilities": [
        {
          "agencyId": "[YOUR-AGENCY-ID]",
          "advertiserId": "[YOUR-ADVERTISER-ID]",
          "segmentationType": "FLOODLIGHT",
          "segmentationId": "[YOUR-SEGMENTATION-ID]"
        }
      ]
    }
  },
  "ACLC": {
    "foo" : {
      "customerId": "[YOUR-GOOGLE-ADS-ACCOUNT-ID]",
      "loginCustomerId": "[YOUR-LOGIN-GOOGLE-ADS-ACCOUNT-ID]",
      "developerToken": "[YOUR-GOOGLE-ADS-DEV-TOKEN]",
      "adsConfig": {
        "conversion_action": "[YOUR-CONVERSION-ACTION-NAME]",
        "conversion_value": "[YOUR-CONVERSION-VALUE]",
        "currency_code": "[YOUR-CURRENCY-CODE]"
      }
    }
  },
  "ACM": {
    "foo" : {
      "developerToken": "[YOUR-GOOGLE-ADS-DEV-TOKEN]",
      "customerMatchConfig": {
        "customer_id": "[YOUR-GOOGLE-ADS-ACCOUNT-ID]",
        "login_customer_id": "[YOUR-LOGIN-GOOGLE-ADS-ACCOUNT-ID]",
        "list_id": "[YOUR-CUSTOMER-MATCH-LIST-ID]",
        "list_type": "[YOUR-CUSTOMER-MATCH-LIST-TYPE],
        "operation": "create|remove"
      }
    }
  }
}

テンプレートのファイル名を config_api.json に変更し、ターゲット API セクションのみを残して、構成の詳細を編集できます。複数の構成がある場合は、その構成をコピーしてそれぞれに異なる名前を付けます。その後、Firestore で構成を更新します。

./deploy.sh update_api_config

ファイル名の命名規則

さまざまな種類の API と構成に柔軟に対応できるように、このソリューションでは受信ファイルに命名規則を採用しています。ファイル名にはパターン API[X]config[Y] を含める必要があります。

  • X はターゲット API のコードを表します。 このソリューションでは、X は次のようになります。
    • MP: Google アナリティクス Measurement Protocol
    • GA: Google アナリティクス Management API(データ インポート)
    • CM: DCM / DFA Reporting and Trafficking API
    • SFTP: SFTP アップロード
    • GS: Google Sheets API
    • SA: 検索広告 360 API
  • Y は、テンプレート コードの foobar などの構成名です。

たとえば、API[GA]_config[bar]_20191111.csv という名前のファイルは次のことを示します。

  • [GA] は Google アナリティクスがターゲット システムで、データ インポートがターゲット API であることを意味します。
  • [bar] は、テンプレート構成ファイルに保存されている JSON オブジェクトの bar 鍵を使用してファイルがターゲット システムに送信されることを意味します。

ファイル名の省略可能なパターンは次のとおりです。

  • ファイル名に dryrun が含まれる場合、プロセスはすべての手順に従いますが、データは API サーバーに送信されません。
  • ファイル名に _size[Z] または _size[Zmb] が含まれる場合、受信ファイルは複数のファイルに分割され、Cloud Storage の Z MB 未満のファイルサイズは一部の API のファイルサイズ制限に従います。たとえば、データ インポートには 1 GB の制限があります。

たとえば、API[GA]_config[bar]_dryrun_20191111.csv という名前のファイルは Google アナリティクスには送信されませんが、統合システム全体を経由します。API[GA]_config[bar]_size[100]_20191111.csv という名前のファイルのサイズが 100 MB 以下のグループに分割され、各ファイルは個別に Google アナリティクスにデータ インポートを介して送信されます。

ソリューションのテスト

ソリューションをインストールしたら、CSV ファイルを作成して統合をテストし、そのファイルのデータを対象の Google スプレッドシートに自動的に読み込みます。

サービス アカウントに権限を付与する

  1. 新しい Google スプレッドシートを作成して、名前を変更します。たとえば、Integration Test です。
  2. [共有] をクリックします。
  3. Cloud Shell で、インストール手順で使用したサービス アカウントのメールアドレスを取得します。

    ./deploy.sh print_service_account
    
  4. [ユーザー] フィールドで、サービス アカウントのメールアドレスをコピーし、 [編集者] を選択して編集者の権限を割り当てます。

対象のスプレッドシートの ID を取得する

  • 対象の Google スプレッドシートのスプレッドシート ID をコピーします。

    スプレッドシート ID は、スプレッドシートの URL 内の /d/ から /edit までの値です。たとえば、次の場合は spreadsheetId です。

    https://docs.google.com/spreadsheets/d/spreadsheetId/edit#gid=0
    

API 構成を更新する

  1. Cloud Shell で、ソリューションをインストールしたフォルダに移動します。たとえば、~/cloud-for-marketing/marketing-analytics/activation/gmp-googleads-connector です。
  2. config_api.json という名前の JSON ファイルを開き、内容を次のコードで置き換えます。

    {
      "GS": {
        "foo": {
          "spreadsheetId": "your-spreadsheet-id",
          "sheetName": "your-sheet-name",
          "sheetHeader": "This is a test integration",
          "pasteData": {
            "coordinate": {
              "rowIndex": 0,
              "columnIndex": 0
            },
            "delimiter": ","
          }
        }
      }
    }
    

    以下を置き換えます。

    • your-spreadsheet-id: スプレッドシート ID。
    • your-sheet-name: Google スプレッドシートの対象となるシートの名前。
  3. 構成を Firestore または Datastore にアップロードします。

    ./deploy.sh update_api_config
    

    次のような出力が表示されます。

    Init ApiConfig based on Datastore.
      Import Config for API[GS]_config[foo]
    

送信するファイルを準備する

このテストでは、CSV ファイルのデータを対象のシートに読み込みます。

  • Cloud Shell で、いくつかの組み込み API のコンテンツを含む CSV ファイルを作成します。

    cat > API[GS]_config[foo]_test.csv <<EOF
    #What are Tentacles built in APIs
    Target System, Target API, Code
    Google Analytics, Measurement Protocol, MP
    Google Analytics, Google Analytics Management API, GA
    Campaign Manager, DCM/DFA Reporting and Trafficking API, CM
    Search Ads 360, SFTP, SFTP
    EOF
    

Cloud Storage にファイルをアップロードする

  • ファイルを Cloud Storage バケットにアップロードします。

    ./deploy.sh copy_file_to_gcs API[GS]_config[foo]_test.csv
    

    出力は次のようになります。

    Copy integration data file to target folder…
    Copying file:...
      Operation completed over...
    

結果を確認する

  • 先ほど作成した Google スプレッドシートを開きます。

    シート 1 のサイズが変更され、CSV ファイルのデータが読み込まれました。

    Google スプレッドシートにアップロードしたデータを示すスクリーンショット。

クリーンアップ

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

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

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

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

次のステップ