从 Google Cloud Build 访问存储在 Google Secret Manager 中的环境变量

Posted

技术标签:

【中文标题】从 Google Cloud Build 访问存储在 Google Secret Manager 中的环境变量【英文标题】:Access environment variables stored in Google Secret Manager from Google Cloud Build 【发布时间】:2020-05-18 21:48:37 【问题描述】:

如何从我的 Google Cloud Build Pipeline 访问我在 Google Secret Manager 中定义的变量?

【问题讨论】:

我现在不建议使用 Google Secret Manager,因为它处于预发布状态,这意味着它肯定会在未来发生变化。至于访问存储在 Google Secret Manager 中的环境变量,仍然无法从 Cloud Build 中实际检索到它。尽管如此,here 你会发现如何在 Cloud Build 中管理加密资源。我希望它有所帮助。 我不同意@ChristopherRodriguezConde。 Google Beta 产品通常非常接近生产版本。 Alpha 版本可能会更改(或被取消),您可以对 Beta 版本充满信心,在稳定性和可用性方面。 无论如何,你能描述一下你的用例吗?为什么您需要在 Cloud Build 管道期间以纯文本形式提供您的秘密? @guillaumeblaquiere 我有很多环境变量,我需要一种更直观的方式来为不同的环境存储它们。我宁愿不使用 KMS,因为它为一个相当简单的任务带来了很多复杂性。我只想要构建中的变量,就像我在 circleci、travisci、bitbucket-pipelines 中一样...... e.t.c 这能回答你的问题吗? How to specify secretEnv to cloudbuild.yaml via gcloud cli args or environment variables 【参考方案1】:

您可以使用标准的 Cloud Builder gcloud 从 Cloud Build 访问机密

但是,有两个问题:

    如果您想在另一个 Cloud Build 步骤中使用密钥值,则必须将您的密钥存储在一个文件中,这是在一个步骤中重复使用先前值到另一个步骤的唯一方法 当前的 Cloud Builder gcloud 不是最新的(今天,2020 年 2 月 3 日)。您必须添加 gcloud 组件更新才能使用正确的版本。 我为此打开了一个问题。
steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: "bash"
      args:
          - "-c"
          - |
              gcloud components update
              # Store the secret is a temporary file
              gcloud beta secrets versions access --secret=MySecretName latest > my-secret-file.txt
    - name: AnotherCloudBuildStepImage
      entrypoint: "bash"
      args:
          - "-c"
          - |
              # For getting the secret and pass it to a command/script
              ./my-script.sh $(cat my-secret-file.txt)

考虑将角色 Secret Manager Secret Accessor roles/secretmanager.secretAccessor 授予 Cloud Build 默认服务帐户 <PROJECT_ID>@cloudbuild.gserviceaccount.com

编辑

您可以从任何地方访问密钥,无论是安装 gcloud CLI(并使用授权访问密钥的服务帐户进行初始化)或通过 API 调用

curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://secretmanager.googleapis.com/v1beta1/projects/PROJECT_ID/secrets/MySecretName/versions/latest:access

注意:您在数据字段中以 base64 编码格式收到秘密。使用前别忘了解码!

您必须在授予正确角色的服务帐户上生成访问令牌。这里我再次使用gcloud,因为它更容易。但是根据你的平台,使用最合适的方法。 python 脚本也可以完成这项工作。


编辑 2

Cloud Build 中现在有一个新的 way to get secrets exists。样板更少,更安全。现在看看并使用这种方式。

【讨论】:

是否有任何意图让 Cloud Build 直接完成这项工作,或者我必须拼凑一个脚本来处理获取变量?看起来 Google 应该实现自动化。 Cloud Build 因为它是您的问题标题,但您可以从您想要的地方进行。可以使用我的示例中的 Gcloud 命令,也可以直接使用 API 调用。看看我的编辑 虽然我无法评论具体细节,但我们正在努力与其他 GCP 产品进行更深入的集成。将来这会更容易,但现在您可以使用 gcloud 或 API 期待未来。 我不太确定我的问题是否相同,但我正在遵循本指南,并且在第 4 步中我们创建了密钥。但是在第 7 步运行迁移时,似乎没有检测到秘密:File "/usr/local/lib/python3.8/site-packages/environ/environ.py", line 273, in get_value value = self.ENVIRON[var] File "/usr/local/lib/python3.8/os.py", line 675, in __getitem__ raise KeyError(key) from None KeyError: 'SECRET_KEY'codelabs.developers.google.com/codelabs/cloud-run-wagtail#7

以上是关于从 Google Cloud Build 访问存储在 Google Secret Manager 中的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine 应用无法访问 Google Cloud Storage 存储分区

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

私有 VPC 网络上的 Google Cloud Build

我们可以从 Google Cloud Dataflow 访问 gsutil 吗?如果是,那么有人可以举例说明吗?

将 env 变量从 Google 的 Secret Manager 加载到在 Google Cloud Run 上运行但未通过 Cloud Build 部署的 Docker 容器中?

Google Cloud DataStore 说明