将配置文件从 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 中的文件