从 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 中的环境变量的主要内容,如果未能解决你的问题,请参考以下文章