将配置文件从 Google Cloud Storage 提取到 App Engine Standard 的选项都有哪些?

Posted

技术标签:

【中文标题】将配置文件从 Google Cloud Storage 提取到 App Engine Standard 的选项都有哪些?【英文标题】:What are my options to pull configuration files from Google Cloud Storage to App Engine Standard?将配置文件从 Google Cloud Storage 提取到 App Engine Standard 的选项有哪些? 【发布时间】:2019-11-08 16:02:49 【问题描述】:

我需要读取我的 App Engine(标准)实例内 Google Cloud Storage 中的存储桶中的 .php 文件。

我有两个网络应用程序:

Web App 1 是一个内部工具(托管在本地),它允许我们更改一些配置并将其以 JSON 格式保存到本地 .php 文件,然后再同步到 Google Cloud Storage。 Web App 2 是另一个托管在 App Engine 上的内部工具(标准 - php72)。此应用需要不断地从 Web App 1 读取配置文件。

我们还有一些其他的 web 应用程序也依赖于这些配置文件,但由于它们与这个特定问题无关,我不会解释它们。

我们目前解决此问题的方法是每分钟在 Web App 2 上运行一个 cron,将 rsync 从 Google Cloud Storage 传输到服务器。

我想出的一些选项:

将配置文件从存储桶流式传输到 Web App 2 https://googleapis.github.io/google-cloud-php/#/docs/cloud-storage/v1.12.2/storage/readme Cloud Storage Fuse,但我得想办法重新加载 PHP https://cloud.google.com/storage/docs/gcs-fuse 切换到 App Engine (Flex),创建已安装 gcloud 和存储桶凭据的自定义 docker 映像。这个选项的问题是我们的生产环境与我们的暂存环境不同

【问题讨论】:

让我看看我是否理解正确:您有两个应用程序。应用 1 更新了一些 rsync-ed 到 Google Cloud Storage 的文件。 App 2 (PHP72) 必须从 Cloud Storage 中读取这些文件。这是正确的吗? @Mayeru 没错。 App Engine Standard 没有 gcloud 工具,因此可以使用 gcloud rsync 命令。我认为我最好的选择是将登台和生产切换到 App Engine Flex :( 如果您想从 App2 实例上的文件系统中“同步”文件,这将是一个简单的选择,如果您想保留 App Engine 标准环境,我已经发布了一个答案。 【参考方案1】:

每当您的 Cloud Storage 有更新时,从 App 2 访问您的 Cloud Storage 的方法是:

    在您的应用程序上创建一个端点,该端点将启动文件的读取过程。由于您将使用 PHP,因此请使用 PHP Cloud Storage libs。

导入库:

composer require google/cloud-storage

通用代码download Cloud Storage objects:

use Google\Cloud\Storage\StorageClient;

/**
 * Download an object from Cloud Storage and save it as a local file.
 *
 * @param string $bucketName the name of your Google Cloud bucket.
 * @param string $objectName the name of your Google Cloud object.
 * @param string $destination the local destination to save the encrypted object.
 *
 * @return void
 */
function download_object($bucketName, $objectName, $destination)

    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $object->downloadToFile($destination);
    printf('Downloaded gs://%s/%s to %s' . PHP_EOL,
        $bucketName, $objectName, basename($destination));

    创建一个Cloud Function,它将在后台运行并在 Cloud Storage 上执行更新时激活(由 Cloud Storage 触发),您可以指定事件是否是由于某些对象正在:创建、删除、存档或更新(元数据更新),但请记住,您必须使用 Go、Nodejs 或 Python 创建脚本。

脚本将调用 App 2 上的端点:

import requests

def hello_gcs(event, context):
    """Triggered by a change to a Cloud Storage bucket.
    Args:
         event (dict): Event payload.
         context (google.cloud.functions.Context): Metadata for the event.
    """
    file = event
    url = 'https://app2.appspot.com/'
    response = requests.get(url)
    print(f"call made.")
    print(f"Processing file: file['name'].")

记得在 Cloud Console Functions GUI 的“requirements.txt”选项卡上添加“requests”依赖项。

您可以根据需要使这种交互变得简单或复杂,优点是“同步”仅在 Cloud Storage 存储桶发生更改时发生,而不是像您当前使用 Cron 作业那样每分钟都发生。

【讨论】:

有一件事需要澄清,我相信 OP 忽略了。不保证 App Engine 实例是单个实例。实际上,您可以根据应用程序 yaml 中的负载和设置拥有任意数量的实例。除非他将最大实例设置为 1,否则 cron 作业或云功能将仅触发一个实例,而不是所有实例。 OP 需要在其 GAE 案例中提供有关这些配置文件性质的更多信息,并找到合适的机制来更新其所有实例。 确实如此,但我认为 OP 实际上并没有写入实例的本地文件系统,因为根据文档,这是不可能的:“在 App Engine 中,您的应用程序部署的本地文件系统to 是不可写的。这种行为确保了应用程序的安全性和可扩展性。” -> cloud.google.com/appengine/docs/standard/php/googlestorage 。 @Michael Delle如果我的解决方案不能解决您的问题,您能否详细说明App 2与文件的关系?如果您可以共享您正在使用的 Cron 作业脚本,将会有所帮助。

以上是关于将配置文件从 Google Cloud Storage 提取到 App Engine Standard 的选项都有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

将大量文件从 Google Cloud Storage 复制到 Google Colab,无需记录/打印

将文件从 Google Cloud 自动上传到 Big Query

从 Google Cloud Function (Python) 将新文件写入 Google Cloud Storage 存储桶

将文件从 Google Cloud Storage 添加到云端硬盘

将文件从 S3 存储桶复制到 Google Cloud Storage

Apache Beam/Google Dataflow - 将数据从 Google Datastore 导出到 Cloud Storage 中的文件