将数据从 GCP 实例作为本地帐户复制到 Google Cloud Storage 存储桶

将数据从 GCP 实例作为本地帐户复制到 Google Cloud Storage 存储桶

我已成功添加了使用 GCP 实例上的我自己的本地帐户连接和从 GCP 实例传输文件的功能,方法是通过添加 Google Cloud 服务帐户的 API 访问权限。

我在 GCP 实例上运行了一项服务 NGINX,并且该服务以实例上的本地帐户权限 (nginx) 运行。但是,作为用户“nginx”,我无法使用 gsutil 命令。我想做的是将日志文件从 GCP 实例传输到存储桶中以进行安全保存,这样我就可以释放实例上的空间。

现在回答我的问题是:如何设置权限或环境,以便用户能够让 GCP 实例上的本地帐户使用 gsutil 和/或 gcloud (或类似)命令使用 GCP 服务帐户将数据从实例复制到存储桶?

答案1

GCE 实例将使用服务帐户,它从服务器上的任何本地用户那里抽象出来 - 凭据本质上嵌入到实例的元数据中。你不应该在 GCE 实例上使用辅助服务帐户或用户凭据 - 这很可能就是为什么您的个人用户能够传输文件而其他nginx用户却不能的原因。

为了使您的实例能够将数据写入 GCS 存储桶,您很可能需要使用 GCS 读/写范围启动实例 (文档) - 默认情况下,GCS 访问是禁用的。

请注意,如果您使用实例模板,这些无法编辑,因此需要销毁并重新创建模板,并且任何基于旧模板的实例也需要重新配置。

答案2

对于可能存在错误的一些想法:

  • 告诉 gsutil 使用应用程序默认凭据的配置位于 中/etc/boto.cfg。确保您的 nginx 用户可以读取该文件。
  • gsutil 的设置可以被覆盖。查看是否有 BOTO_CONFIG 环境变量或 ~nginx/.boto.cfg 文件替换默认设置。

我相信 GCE 实例上的任何用户都应该能够使用gsutil。凭据是通过 HTTP 调用授予的。您可以通过 sudo 成为 nginx 用户并运行以下命令来测试您是否收到了它们:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
-H "Metadata-Flavor: Google"

答案3

.config我通过添加一个组并为该组提供.gsutil适当的权限,然后将用户添加到该组来解决这个问题nginx。但这真的不是我喜欢的解决方法 - 但它确实有用。

相关内容