设置自动发送包含 Cloud Billing 数据总结的电子邮件

在本教程中,您将学习如何将 Cloud Billing 数据导出到 BigQuery 并创建 App Engine 服务和 Cloud Scheduler 作业,以每天发送汇总了 Cloud Billing 数据的电子邮件。通过将所有费用导出到 BigQuery,您可以查询数据以汇总费用。此配置可帮助您深入了解 Google Cloud 用量的每日费用,您无需每天查询费用。

本文档适用于希望更深入了解 Google Cloud 支出的开发者和结算管理员。本文假定您熟悉创建 Cloud Billing 帐号。

下图展示了本教程中使用的 Google Cloud 组件。

自动发送的电子邮件的数据和控制流。

数据从 Cloud Billing 流向 BigQuery,在 App Engine 和 BigQuery 之间流动,再流向 App Engine Mail API,最后流向用户。Cloud Scheduler 触发 App Engine 服务。

目标

  • 实现将 Cloud Billing 数据导出到 BigQuery。
  • 使用 PHP 创建 App Engine 服务以查询 BigQuery 并通过电子邮件发送查询结果。
  • 将您的电子邮件地址添加到 App Engine Mail API 授权的发件人列表。
  • 生成 API 密钥。
  • 测试服务。
  • 创建 Cloud Scheduler 作业以每天调用 App Engine 服务。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 在 Cloud Console 中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Cloud Console 的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Cloud SDK 的 Shell 环境,其中包括 gcloud 命令行工具以及已为当前项目设置的值。该会话可能需要几秒钟时间来完成初始化。

实现将 Cloud Billing 数据导出到 BigQuery

为了将 Cloud Billing 数据导出到 BigQuery,请在 BigQuery 中创建目标数据集表,然后配置 Cloud Billing 以将结算数据导出到该数据集。

在 BigQuery 中创建数据集

在本教程中,您将在应用所在的同一 Cloud 项目中创建数据集。

如果您在其他 Cloud 项目中已有数据集,则可以与您的服务帐号共享该数据集并跳转至下一部分。

  1. 在 Cloud Console 中,转到 BigQuery 页面。

    转到 BigQuery 页面

  2. 对于资源,点击您的 Cloud 项目名称。

  3. 如需在 BigQuery 中创建目标表以存储 Cloud Billing 数据,请点击创建数据集

  4. 数据集 ID 字段中,输入 billing_data

  5. 点击创建数据集

将 Cloud Billing 数据导出到 BigQuery

  1. 在 Cloud Console 中,转到结算页面。

    转到“结算”页面

  2. 选择您的 Cloud Billing 帐号。

  3. 点击帐单导出

  4. 点击修改设置

  5. 选择您为本教程创建的 Cloud 项目。

  6. 选择您之前创建的 billing_data 数据集。

  7. 点击保存

您的 Cloud Billing 帐号已配置为将数据导出到 BigQuery。导出过程最长可能需要 24 小时。

获取数据集表名称

  1. 在 Cloud Console 中,转到 BigQuery 页面。

    转到 BigQuery 页面

  2. 对于资源,点击您的 Cloud 项目名称。

  3. 如需展开,请点击 billing_data

  4. 点击导出过程创建的表的名称。名称以 gcp_billing_export_v1 开头。

  5. 点击查询表

  6. 保存数据集表名,您稍后将在本教程中使用该名称来自定义 index.php 文件。

SQL 语句的数据集表名称位于 FROM 关键字后面,格式为 project_name.dataset.table_name

  • project_name 表示 Cloud 项目的名称。
  • dataset 表示数据集的名称。
  • table_name 表示表的名称。

下面是一个数据集表名称示例:myproject.billing_data.gcp_billing_export_v1_000000_000000_000000

创建 App Engine 服务

如果您之前在此 Cloud 项目中创建了 App Engine 服务,则可以跳到下一部分。

如果您之前未在此 Cloud 项目中创建 App Engine 服务,请完成以下步骤:

  1. 在 Cloud Console 中,转到 App Engine 页面。

    转到 App Engine 页面

  2. 点击创建应用

  3. 选择要部署应用的区域。如需了解详情,请参阅地理位置和区域

  4. 点击创建应用

应用创建过程需要几分钟时间。

修改和检查代码

在此部分中,您将创建 index.php 文件,其中包含 App Engine 服务运行的代码。您还将创建 app.yamlcomposer.json 文件,用于控制依赖项和应用设置。该代码使用 PHP Composer 添加依赖项。

  1. 在 Cloud Shell 中,创建一个新目录:

    mkdir billingemail
    
  2. 转到该目录:

    cd billingemail
    
  3. 创建 app.yaml 文件并输入以下代码作为其内容:

    runtime: php55
    threadsafe: yes
    api_version: 1
    
    inbound_services:
    - mail
    - mail_bounce
    handlers:
    - url: .*
      script: index.php
    
  4. 创建 composer.json 文件并输入以下代码作为其内容:

    {
        "require": {
                "google/auth": "^1.0",
                "google/cloud-bigquery": "^1.0",
                "ramsey/uuid": "3.7.3",
                "guzzlehttp/guzzle": "6.0"
        }
    }
    
  5. 创建 index.php 文件并输入以下代码作为其内容:

    <?php
    
    namespace Google\Cloud\Samples\Auth;
    
    use Google\Auth\Credentials\GCECredentials;
    use google\appengine\api\app_identity\AppIdentityService;
    use Google\Cloud\BigQuery\BigQueryClient;
    use google\appengine\api\mail\Message;
    
    // Install composer dependencies with "composer install --no-dev"
    // @see http://getcomposer.org for more information.
    require __DIR__ . '/vendor/autoload.php';
    
    // Variables holding your values, replace before deploying
    $datatable = "projectid.billing_data.gcp_billing_export_v1_000000_000000_000000";
    $toemail = "gcpbilling@domain.com";
    $fromemail = "your@domain.com";
    
    $onGce = GCECredentials::onGce();
    $projectId = $onGce
       ? getenv('GCLOUD_PROJECT')
       : AppIdentityService::getApplicationId();
    
    $bigQuery = new BigQueryClient(['projectId' => $projectId,]);
    $query = 'SELECT current_timestamp() runtime, EXTRACT(DATE FROM usage_start_time) as billing_start_date, sum(cost) daily_cost FROM `' . $datatable . '`
    GROUP BY billing_start_date
    ORDER BY billing_start_date DESC';
    $jobConfig = $bigQuery->query($query);
    $queryResults = $bigQuery->runQuery($jobConfig);
    $message = "Here is the report for GCP Spend over the last days";
    $rows = $queryResults->rows();
    foreach ($rows as $row) {
            printf('%s: %s' . PHP_EOL . '<br>', $row['billing_start_date'], $row['daily_cost']);
            $message = $message . "\r\nDate: " . $row['billing_start_date'] . " ---- Cost: $" . $row['daily_cost'];
    }
    
    $message = wordwrap($message, 70, "\r\n");
    
    try {
            $mailmsg = new Message();
            $mailmsg->setSender($fromemail);
            $mailmsg->addTo($toemail);
            $mailmsg->setSubject('GCP Billing Summary');
            $mailmsg->setTextBody($message);
            $mailmsg->send();
            printf('<br>---Mail sent successfully!---<br>');
    }
    catch (InvalidArgumentException $e) {
            printf('<br>---Error occurred, could not send email---<br>');
    }
    ?>
    

    该代码执行以下步骤:

    • 对用户进行身份验证。
    • 查询 BigQuery 以获取 Cloud Billing 数据。
    • 使用从数据集返回的值构建字符串。
    • 通过电子邮件将结果字符串发送并打印到代码中定义的电子邮件地址。
  6. 更新 index.php 文件中的以下 3 个变量:

    • $datatable:您之前检索到的表的名称,格式为 project_name.dataset.table_name
    • $toemail:您希望每天接收电子邮件的电子邮件地址。
    • $fromemail:Cloud Console 用户的电子邮件地址。
  7. 在 Cloud Shell 中运行以下命令,以更新依赖项:

    composer install --no-dev
    

向已获授权发件人列表添加电子邮件地址

  1. 在 Cloud Console 中,转到 App Engine 的设置页面。

    转到“设置”页面

  2. 电子邮件发件人标签页上,点击添加已获授权的电子邮件发件人

  3. 输入与您的 Google Cloud 帐号关联的电子邮件地址,然后按 Enter。此电子邮件地址与您之前定义的 $fromemail 匹配。

  4. 点击添加

生成 API 密钥

要对应用进行身份验证,请使用 App Engine 服务帐号并生成密钥。

  1. 在 Cloud Console 中,转到身份和访问权限管理的服务帐号页面。

    转到“服务帐号”页面

  2. 选择 App Engine 服务帐号的名称,格式为 project_name@appspot.serviceaccount.com

  3. 点击更多并选择修改

  4. 点击创建密钥

  5. 对于密钥类型,选择 JSON,然后点击创建

    该 JSON 文件将被下载到您的计算机。将密钥保存在安全位置。

  6. 将密钥重命名为 app_eng_bq_credentials.json

  7. 在 Cloud Shell 中,将文件转移到您的实例:

    1. 点击更多,然后选择上传文件
    2. 点击 app_eng_bq_credentials.json 文件。
  8. 在 Cloud Shell 中,将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为 JSON 文件的路径:

    export GOOGLE_APPLICATION_CREDENTIALS=~/app_eng_bq_credentials.json
    

测试应用

使用 Cloud Shell 部署应用并发送测试电子邮件。

  1. 在 Cloud Shell 中,转到您修改应用文件的目录:

    cd ~/billingemail
    
  2. 部署应用:

    gcloud app deploy
    
  3. 要确认部署,请输入 Y

    部署应用可能需要几分钟时间。输出类似于以下内容:

    Setting traffic split for service [default]...done.
    Deployed service [default] to [https://projectname.appspot.com]
    You can stream logs from the command line by running:
    $ gcloud app logs tail -s default
    To view your application in the web browser run:
    $ gcloud app browse
    
  4. 获取 App Engine 服务网址:

    gcloud app browse
    
  5. 要发送测试电子邮件,请点击生成的链接。

设置 Cloud Scheduler

确认您可以运行应用后,请使用 Cloud Scheduler 按计划间隔时间运行 App Engine 服务。

在本教程中,您将在每天上午 11 点运行该服务。Cloud Scheduler 使用 cron 格式的时间表。

  1. 在 Cloud Console 中,转到 Cloud Scheduler 页面。

    转到 Cloud Scheduler 页面

  2. 点击创建作业

  3. 名称字段中,输入 Billing-BigQuery

  4. 说明字段中,输入 Send scheduled email with Google Cloud billing information

  5. 频率字段中,输入 0 11 * * *

  6. 选择您所在的时区。

  7. 对于目标,选择 App Engine HTTP

  8. 网址保留为 /

  9. 服务字段留空。

  10. 点击创建

清理

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

若要避免产生费用,最简单的方法是删除您为本教程创建的 Cloud 项目。或者,您也可以删除各个资源。

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤