使用 Google Cloud Platform (GCP) 上的汇总服务

1. 1. 前提条件

预计完成时间:1-2 小时

执行此 Codelab 有两种模式:本地测试聚合服务。本地测试模式需要本地计算机和 Chrome 浏览器(无需创建/使用 Google Cloud 资源)。汇总服务模式需要在 Google Cloud 上完整部署汇总服务。

如需在任一模式下执行此 Codelab,您需要满足一些前提条件。每项要求都会相应地注明是本地测试还是汇总服务所必需的。

1.1. 完成注册和证明(汇总服务)

如需使用 Privacy Sandbox API,请确保您已针对 Chrome 和 Android 完成注册和证明

1.2. 启用 Privacy Sandbox API(本地测试和聚合服务)

由于我们将使用 Privacy Sandbox,因此建议您启用 Privacy Sandbox Ads API。

在浏览器中,前往 chrome://flags/#privacy-sandbox-ads-apis 并启用 Privacy Sandbox API。

启用 Privacy Sandbox API

此外,还应确保已启用第三方 Cookie

在浏览器中,前往 chrome://settings/cookies。请确保第三方 Cookie 未被屏蔽。此设置菜单上可能会显示不同的选项,具体取决于您的 Chrome 版本,不过可接受的配置包括:

  • “阻止所有第三方 Cookie”= 已停用
  • “阻止第三方 Cookie”= 已停用
  • “在无痕模式下阻止第三方 Cookie”= 已启用

启用 Cookie

1.3. 下载本地测试工具(本地测试)

使用本地测试时,您需要下载本地测试工具。该工具将根据未加密的调试报告生成摘要报告。

您可以在 GitHub 中的 Cloud Functions JAR 归档中下载本地测试工具。应将其命名为 LocalTestingTool_{version}.jar

1.4. 确保已安装 JAVA JRE(本地测试和汇总服务)

打开“Terminal”(终端),然后使用 java --version 检查机器是否已安装 Java 或 openJDK。

查看 Java 版本

如果未安装,您可以从 Java 网站openJDK 网站下载并安装。

1.5. 下载 aggregatable_report_converter(本地测试和汇总服务)

您可以从 Privacy Sandbox 演示 GitHub 代码库中下载 aggregatable_report_converter 的副本。

1.6. 设置 GCP 环境(聚合服务)

汇总服务要求使用采用云服务提供商的可信执行环境。在此 Codelab 中,汇总服务将部署在 GCP 中,但也支持 AWS

1.6.1. 部署

按照 GitHub 中的部署说明设置 gcloud CLI,下载 Terraform 二进制文件和模块,并为聚合服务创建 GCP 资源。

“部署说明”中的关键步骤:

  1. 在您的环境中设置“gcloud”CLI 和 Terraform。
  2. 创建一个 Cloud Storage 存储分区来存储 Terraform 状态。
  3. 下载依赖项。
  4. 更新 adtech_setup.auto.tfvars 并运行 adtech_setup Terraform。如需查看示例 adtech_setup.auto.tfvars 文件,请参阅附录。
  5. 更新 dev.auto.tfvars,模拟部署服务账号并运行 dev Terraform。如需查看示例 dev.auto.tfvars 文件,请参阅附录。
  6. 部署完成后,从 Terraform 输出中捕获 frontend_service_cloudfunction_url,在后续步骤中向汇总服务发出请求时需要用到该文件。

1.6.2. 报告存储分区

设置完项目后,您将在 Cloud Storage 中创建一个存储分区,用于存储此 Codelab 中的可汇总报告和摘要报告。以下是用于创建存储分区的 gcloud 命令示例。将占位符替换为您选择的名称和位置。

gcloud storage buckets create gs://<bucket-name> --location=<location>

1.7. 完成汇总服务新手入门(汇总服务)

整合服务要求必须通过培训,协调员才能使用服务。填写汇总服务新手入门表单,提供您的举报网站和其他信息,选择“Google Cloud”,然后输入您的服务帐号地址。此服务账号在之前的前提条件 (1.6. 设置 GCP 环境)。(提示:如果您使用提供的默认名称,则此服务帐号将以“worker-sa@”开头)。

新手入门流程最多需要 2 周才能完成。

1.8. 确定调用 API 端点的方法(聚合服务)

此 Codelab 提供了 2 个用于调用 Aggregation Service API 端点的选项:cURLcURL。c网址 从终端调用 API 端点是一种更快速、更简便的方法,因为它只需进行极少的设置,无需额外的软件。但是,如果您不想使用 c网址,则可以改用 Postman 执行并保存 API 请求,以备将来使用。

在第 3.2 节中:您可以在“Aggregation Service Usage”中找到关于使用这两个选项的详细说明。您可以立即预览这些结果,以确定要使用的方法。如果您选择 Postman,请执行以下初始设置。

1.8.1. 设置工作区

注册 Postman 账号。注册后,系统会自动为您创建一个工作区。

Postman 工作区

如果系统没有为您创建工作区,请前往“工作区”顶部的导航项,然后选择“创建工作区”。

选择“空白工作区”,点击“下一步”,将其命名为“GCP Privacy Sandbox”。选择“个人”,然后点击“创建”。

下载预配置的工作区 JSON 配置全局环境文件

通过“导入”按钮将两个 JSON 文件导入“我的工作区”。

导入按钮

这将为您创建“GCP Privacy Sandbox”集合以及 createJobgetJob HTTP 请求。

1.8.2. 设置授权

点击“GCP Privacy Sandbox”集合,然后前往“授权”标签页。

授权按钮

您将使用“不记名令牌”方法。在终端环境中,运行以下命令并复制输出。

gcloud auth print-identity-token

然后,将此令牌值粘贴到 Postman 授权标签页的“令牌”字段中:

令牌字段

1.8.3. 设置环境

前往右上角的“环境快速查看”:

“环境”按钮

点击“修改”,然后更新“environment”“region”和“cloud-function-id”的“当前值”:

设置当前值

您可以暂时将“request-id”留空,因为稍后我们会进行填充。对于其他字段,请使用 frontend_service_cloudfunction_url 中的值,该值是在前提条件 1.6 中成功完成 Terraform 部署后返回的。网址格式如下:https://--frontend-service--uc.a.run.app

2. 2. 本地测试 Codelab

预计完成时间:不到 1 小时

您可以使用计算机上的本地测试工具执行汇总,并使用未加密的调试报告生成摘要报告。开始之前,请确保您已完成带有“本地测试”标签的所有前提条件。

Codelab 步骤

第 2.1 步:触发报告:触发私密汇总报告以便收集报告。

第 2.2 步:创建调试 AVRO 报告:将收集的 JSON 报告转换为 AVRO 格式的报告。此步骤与广告技术平台从 API 报告端点收集报告并将 JSON 报告转换为 AVRO 格式的报告时类似。

第 2.3 步:检索存储分区键:存储分区键由广告技术平台设计。在此 Codelab 中,由于分桶是预定义的,因此请检索提供的存储分区键。

第 2.4 步:创建输出网域 AVRO:检索存储分区密钥后,创建输出网域 AVRO 文件。

第 2.5 步:创建摘要报告:使用本地测试工具在本地环境中创建摘要报告。

第 2.6 步:查看摘要报告:查看本地测试工具创建的摘要报告。

2.1. 触发器报告

如需触发私密汇总报告,您可以使用 Privacy Sandbox 演示网站 (https://privacy-sandcastle-dev-news.web.app/) 或您自己的网站(例如 https://adtechexample.com)。如果您使用的是自己的网站,并且尚未完成注册和证明以及汇总服务新手入门流程,则需要使用 Chrome 标志和 CLI 开关

在本演示中,我们将使用 Privacy Sandbox 演示网站。请点击链接前往该网站;然后,您就可以前往 chrome://private-aggregation-internals 查看报告:

Chrome 内部页面

发送到 {reporting-origin}/.well-known/private-aggregation/debug/report-shared-storage 端点的报告也可以在“Chrome 内部设置”页面上显示的报告的“报告正文”中找到。

在这里,您可能会看到许多报告,但对于此 Codelab,请使用由调试端点生成的 GCP 专用可汇总报告。“报告网址”将包含“/debug/”,“报告正文”的 aggregation_coordinator_origin field 将包含以下网址:https://publickeyservice.msmt.gcp.privacysandboxservices.com。

GCP 调试报告

2.2. 创建可汇总调试报告

复制在 chrome://private-aggregation-internals 的“报告正文”中找到的报告,然后在 privacy-sandbox-demos/tools/aggregatable_report_converter/out/artifacts/aggregatable_report_converter_jar 文件夹(在前提条件 1.5 中下载的代码库中)中创建一个 JSON 文件。

在本例中,我们使用的是 vim,因为我们使用的是 linux。不过,您可以根据需要使用任何文本编辑器。

vim report.json

将报告粘贴到 report.json 中,然后保存您的文件。

报告 JSON

完成上述操作后,使用 aggregatable_report_converter.jar 帮助创建可汇总的调试报告。这会在当前目录中创建一个名为 report.avro 的可汇总报告。

java -jar aggregatable_report_converter.jar \
  --request_type convertToAvro \
  --input_file report.json \
  --debug

2.3. 从报告中检索存储分区键

如需创建 output_domain.avro 文件,您需要可从报告中检索到的存储分区键。

桶键由 adTech 设计。不过,在这种情况下,存储分区密钥由 Privacy Sandbox 演示网站创建。由于此网站的不公开汇总处于调试模式,因此我们可以使用“报告正文”中的 debug_cleartext_payload 来获取存储分区密钥。

接下来,从报告正文中复制 debug_cleartext_payload

调试明文载荷

打开 goo.gle/ags-payload-decoder,将您的 debug_cleartext_payload 粘贴到“输入”框中,然后点击“解码”。

“解码”按钮

页面返回存储分区键的小数值。以下是一个示例存储分区键。

存储分区键

2.4. 创建输出域 AVRO

现在我们有了存储分区键,让我们在之前使用的文件夹中创建 output_domain.avro。确保将存储分区密钥替换为您检索的存储分区密钥。

java -jar aggregatable_report_converter.jar \
  --request_type createDomainAvro \
  --bucket_key <bucket key>

该脚本会在当前文件夹中创建 output_domain.avro 文件。

2.5. 使用本地测试工具创建摘要报告

我们将使用在前提条件 1.3 中下载的 LocalTestingTool_{version}.jar 来使用以下命令创建摘要报告。将 {version} 替换为您下载的版本。请务必将 LocalTestingTool_{version}.jar 移至当前目录,或添加相对路径来引用其当前位置。

java -jar LocalTestingTool_{version}.jar \
  --input_data_avro_file report.avro \
  --domain_avro_file output_domain.avro \
  --output_directory .

运行该命令后,您应该会看到类似如下所示的内容。完成后,系统将创建报告 output.avro

输出 AVRO

2.6. 查看摘要报告

系统会以 AVRO 格式创建摘要报告。为了能够读取此内容,您需要将其从 AVRO 转换为 JSON 格式。理想情况下,广告技术人员应编写代码,将 AVRO 报告转换回 JSON。

我们将使用 aggregatable_report_converter.jar 将 AVRO 报告转换回 JSON。

java -jar aggregatable_report_converter.jar \
  --request_type convertToJson \
  --input_file output.avro

这将返回一个类似于以下内容的报告。以及在同一目录中创建的 output.json 报告。

输出 JSON

3. 3. 汇总服务 Codelab

预计完成时间:1 小时

在开始之前,请确保您已完成带有“汇总服务”标签的所有前提条件。

Codelab 步骤

第 3.1 步:Aggregation Service Input Creation:创建为 Aggregation Service 进行批处理的汇总服务报告。

  • 第 3.1.1 步:触发器报告
  • 第 3.1.2 步:收集可汇总的报告
  • 第 3.1.3 步:将报告转换为 AVRO
  • 第 3.1.4 步:创建 output_domain AVRO
  • 第 3.1.5 步:将报告移至 Cloud Storage 存储分区

第 3.2 步:Aggregation Service Usage:使用 Aggregation Service API 创建摘要报告并查看摘要报告。

  • 第 3.2.1 步:使用 createJob 端点进行批处理
  • 第 3.2.2 步:使用 getJob 端点检索批量状态
  • 第 3.2.3 步:查看汇总报告

3.1. 创建汇总服务输入

继续创建 AVRO 报告,以便将其批量发送到汇总服务。这些步骤中的 shell 命令可以在 GCP 的 Cloud Shell 中运行(只要“前提条件”中的依赖项克隆到您的 Cloud Shell 环境中),或在本地执行环境中运行。

3.1.1. 触发器报告

请点击链接前往该网站;然后,您就可以前往 chrome://private-aggregation-internals 查看报告:

Chrome 内部页面

发送到 {reporting-origin}/.well-known/private-aggregation/debug/report-shared-storage 端点的报告也可以在“Chrome 内部设置”页面上显示的报告的“报告正文”中找到。

在这里,您可能会看到许多报告,但对于此 Codelab,请使用由调试端点生成的 GCP 专用可汇总报告。“报告网址”将包含“/debug/”,“报告正文”的 aggregation_coordinator_origin field 将包含以下网址:https://publickeyservice.msmt.gcp.privacysandboxservices.com。

GCP 调试报告

3.1.2. 收集可汇总的报告

从相应 API 的 .well-known 端点收集可汇总报告。

  • 不公开汇总:{reporting-origin}/.well-known/private-aggregation/report-shared-storage
  • 归因报告 - 摘要报告:{reporting-origin}/.well-known/attribution-reporting/report-aggregate-attribution

对于此 Codelab,我们将手动执行报告收集。在生产环境中,广告技术人员应以编程方式收集并转换报告。

接下来,从 chrome://private-aggregation-internals 复制“Report Body”中的 JSON 报告。

在本示例中,我们使用 vim,因为我们使用的是 linux。不过,您可以根据需要使用任何文本编辑器。

vim report.json

将报告粘贴到 report.json 中,然后保存您的文件。

报告 JSON

3.1.3. 将报告转换为 AVRO

.well-known 端点收到的报告采用 JSON 格式,需要转换为 AVRO 报告格式。获得 JSON 报告后,前往 report.json 的存储位置,并使用 aggregatable_report_converter.jar 帮助创建可汇总的调试报告。这会在当前目录中创建一个名为 report.avro 的可汇总报告。

java -jar aggregatable_report_converter.jar \
  --request_type convertToAvro \
  --input_file report.json

3.1.4. 创建 output_domain AVRO

如需创建 output_domain.avro 文件,您需要可从报告中检索到的存储分区键。

桶键由 adTech 设计。不过,在这种情况下,存储分区密钥由 Privacy Sandbox 演示网站创建。由于此网站的不公开汇总处于调试模式,因此我们可以使用“报告正文”中的 debug_cleartext_payload 来获取存储分区密钥。

接下来,从报告正文中复制 debug_cleartext_payload

调试明文载荷

打开 goo.gle/ags-payload-decoder,将您的 debug_cleartext_payload 粘贴到“输入”框中,然后点击“解码”。

“解码”按钮

页面返回存储分区键的小数值。以下是一个示例存储分区键。

存储分区键

现在我们有了存储分区键,让我们在之前使用的文件夹中创建 output_domain.avro。确保将存储分区密钥替换为您检索的存储分区密钥。

java -jar aggregatable_report_converter.jar \
  --request_type createDomainAvro \
  --bucket_key <bucket key>

该脚本会在当前文件夹中创建 output_domain.avro 文件。

3.1.5. 将报告移至 Cloud Storage 存储分区

创建 AVRO 报告和输出网域后,继续将报告和输出网域移入 Cloud Storage 中的存储分区(即您在前提条件 1.6 中的最后一步创建)。

如果您在本地环境中设置了 gcloud CLI,请使用以下命令将文件复制到相应的文件夹。

gcloud storage cp report.avro gs://<bucket_name>/reports/

gcloud storage cp output_domain.avro gs://<bucket_name>/output_domain/

否则,请将文件上传到您的存储分区。创建一个名为“reports”的文件夹并将 report.avro 文件上传到该文件夹中。创建一个名为“output_domains”的文件夹并将 output_domain.avro 文件上传到该文件夹中。

3.2. 汇总服务使用情况

请记住,在前提条件 1.8 中,您已选择向汇总服务端点发出 API 请求,而选择了 c网址 或 Postman。以下是有关这两个选项的说明。

3.2.1. 使用 createJob 端点进行批处理

按照下面的 c网址 或 Postman 说明创建作业。

cURL

在“终端”中,创建请求正文文件 (body.json),然后将其粘贴到以下内容中。请务必更新占位值。如需详细了解每个字段所代表的含义,请参阅此 API 文档

{
  "job_request_id": "<job_request_id>",
  "input_data_blob_prefix": "<report_folder>/<report_name>.avro",
  "input_data_bucket_name": "<bucket_name>",
  "output_data_blob_prefix": "<output_folder>/<summary_report_prefix>",
  "output_data_bucket_name": "<bucket_name>",
  "job_parameters": {
    "output_domain_blob_prefix": "<output_domain_folder>/<output_domain>.avro",
    "output_domain_bucket_name": "<bucket_name>",
    "attribution_report_to": "<reporting origin of report>",
    "report_error_threshold_percentage": "10",
    "debug_run": "true"
  }
}

执行以下请求。将 c网址 请求网址中的占位符替换为 frontend_service_cloudfunction_url 中的值,该值会在前提条件 1.6 中成功完成 Terraform 部署后输出。

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -d @body.json \
  https://<environment>-<region>-frontend-service-<cloud-function-id>-uc.a.run.app/v1alpha/createJob

汇总服务接受请求后,您应该会收到 HTTP 202 响应。API 规范中介绍了其他可能的响应代码。

邮政信箱

对于 createJob 端点,需要请求正文才能向汇总服务提供可汇总报告、输出网域和摘要报告的位置和文件名。

前往 createJob 请求的“Body”标签页:

“正文”标签页

替换所提供的 JSON 中的占位符。如需详细了解这些字段及其所代表的含义,请参阅 API 文档

{
  "job_request_id": "<job_request_id>",
  "input_data_blob_prefix": "<report_folder>/<report_name>.avro",
  "input_data_bucket_name": "<bucket_name>",
  "output_data_blob_prefix": "<output_folder>/<summary_report_prefix>",
  "output_data_bucket_name": "<bucket_name>",
  "job_parameters": {
    "output_domain_blob_prefix": "<output_domain_folder>/<output_domain>.avro",
    "output_domain_bucket_name": "<bucket_name>",
    "attribution_report_to": "<reporting origin of report>",
    "report_error_threshold_percentage": "10",
    "debug_run": "true"
  }
}

“发送”createJob API 请求:

“发送”按钮

响应代码位于网页的下半部分:

响应代码

汇总服务接受请求后,您应该会收到 HTTP 202 响应。API 规范中介绍了其他可能的响应代码。

3.2.2. 使用 getJob 端点检索批量状态

按照下面的 c网址 或 Postman 说明获取作业。

cURL

在终端中执行以下请求。将网址中的占位符替换为 frontend_service_cloudfunction_url 中的值,这与您用于 createJob 请求的网址相同。对于“job_request_id”,请使用您通过 createJob 端点创建的作业中的值。

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  https://<environment>-<region>-frontend-service-<cloud-function-id>-uc.a.run.app/v1alpha/getJob?job_request_id=<job_request_id>

结果应返回 HTTP 状态为 200 的作业请求状态。请求“Body”包含 job_statusreturn_messageerror_messages 等必要信息(如果作业出错)。

邮政信箱

如需检查作业请求的状态,您可以使用 getJob 端点。在 getJob 请求的“Params”部分中,将 job_request_id 值更新为 createJob 请求中发送的 job_request_id

职位申请 ID

“发送”getJob 请求:

“发送”按钮

结果应返回 HTTP 状态为 200 的作业请求状态。请求“Body”包含 job_statusreturn_messageerror_messages 等必要信息(如果作业出错)。

响应 JSON

3.2.3. 查看汇总报告

在 Cloud Storage 输出存储分区中收到摘要报告后,您可以将此报告下载到本地环境中。摘要报告采用 AVRO 格式,并可转换回 JSON。您可以使用 aggregatable_report_converter.jar 通过以下命令读取报告。

java -jar aggregatable_report_converter.jar \
  --request_type convertToJson \
  --input_file <summary_report_avro>

这将返回每个存储分区键的汇总值的 JSON,类似于以下内容。

摘要报告

如果您的 createJob 请求将 debug_run 设为 true,您便可以在 output_data_blob_prefix 中的“debug”文件夹中收到摘要报告。报告采用 AVRO 格式,可以使用上述命令将其转换为 JSON。

该报告包含桶键、未添加噪声的指标,以及添加到不带噪声的指标以生成摘要报告的噪声。报告类似于以下内容。

添加了噪声的报告

这些注释还包含“in_reports”和/或“in_domain”,这意味着:

  • in_reports - 存储分区键在可汇总报告中可用。
  • in_domain - 存储分区密钥可在 output_domain AVRO 文件中找到。

4. 4. 清理

如需通过 Terraform 删除为聚合服务创建的资源,请在 adtech_setupdev(或其他环境)文件夹中使用 destroy 命令:

$ cd <repository_root>/terraform/gcp/environments/adtech_setup
$ terraform destroy
$ cd <repository_root>/terraform/gcp/environments/dev
$ terraform destroy

如需删除存放可汇总报告和摘要报告的 Cloud Storage 存储分区,请执行以下操作:

$ gcloud storage buckets delete gs://my-bucket

您还可以选择将 Chrome Cookie 设置从前提条件 1.2 还原为之前的状态。

5. 5. 附录

adtech_setup.auto.tfvars 文件示例

/**
 * Copyright 2023 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

project = "my-project-id"

# Required to generate identity token for access of Adtech Services API endpoints
service_account_token_creator_list = ["user:me@email.com"]

# Uncomment the below line if you like Terraform to create an Artifact registry repository
# for self-build container artifacts. "artifact_repo_location" defaults to "us".
artifact_repo_name     = "my-ags-artifacts"

# Note: Either one of [1] or [2] must be uncommented.

# [1] Uncomment below lines if you like Terraform grant needed permissions to
# pre-existing service accounts
# deploy_service_account_email = "<YourDeployServiceAccountName>@<ProjectID>.iam.gserviceaccount.com"
# worker_service_account_email = "<YourWorkerServiceAccountName>@<ProjectID>.iam.gserviceaccount.com"

# [2] Uncomment below lines if you like Terraform to create service accounts
# and needed permissions granted e.g "deploy-sa" or "worker-sa"
deploy_service_account_name = "deploy-sa"
worker_service_account_name = "worker-sa"
# Uncomment the below line if you want Terraform to create the
# below bucket. "data_bucket_location" defaults to "us".
data_bucket_name     = "my-ags-data"

# Uncomment the below lines if you want to specify service account customer role names
# deploy_sa_role_name = "<YourDeploySACustomRole>"
# worker_sa_role_name = "<YourWorkerSACustomRole>"

dev.auto.tfvars 文件示例

/**
 * Copyright 2022 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

# Example values required by job_service.tf
#
# These values should be modified for each of your environments.
region      = "us-central1"
region_zone = "us-central1-c"

project_id  = "my-project-id"
environment = "operator-demo-env"

# Co-locate your Cloud Spanner instance configuration with the region above.
# https://cloud.google.com/spanner/docs/instance-configurations#regional-configurations
spanner_instance_config = "regional-us-central1"

# Adjust this based on the job load you expect for your deployment.
# Monitor the spanner instance utilization to decide on scale out / scale in.
# https://console.cloud.google.com/spanner/instances
spanner_processing_units = 100

# Uncomment the line below at your own risk to disable Spanner database protection.
# This needs to be set to false and applied before destroying all resources is possible.
spanner_database_deletion_protection = false

instance_type = "n2d-standard-8" # 8 cores, 32GiB

# Container image location that packages the job service application
# If not set otherwise, uncomment and edit the line below:
#worker_image = "<location>/<project>/<repository>/<image>:<tag or digest>"

# Service account created and onboarded for worker
user_provided_worker_sa_email = "worker-sa@my-project-id.iam.gserviceaccount.com"

min_worker_instances = 1
max_worker_instances = 20