【问题标题】:Error when trying to create a serviceaccount key in deployment manager尝试在部署管理器中创建服务帐户密钥时出错
【发布时间】:2018-12-11 08:55:07
【问题描述】:

错误如下:

ERROR: (gcloud.deployment-manager.deployments.update) Error in Operation [operation-1544517871651-57cbb1716c8b8-4fa66ff2-9980028f]: errors:
- code: MISSING_REQUIRED_FIELD
  location: /deployments/infrastructure/resources/projects/resources-practice/serviceAccounts/storage-buckets-backend/keys/json->$.properties->$.parent
  message: |-
    Missing required field 'parent' with schema:
    {
      "type" : "string"
    }

以下是我的 jinja 模板内容:

resource:
- name: {{ name }}-keys
    type: iam.v1.serviceAccounts.key
    properties:
      name: projects/{{ properties["projectID"] }}/serviceAccounts/{{ serviceAccount["name"] }}/keys/json
      privateKeyType: enum(TYPE_GOOGLE_CREDENTIALS_FILE)
      keyAlgorithm: enum(KEY_ALG_RSA_2048)

附注 我对属性的参考基于https://cloud.google.com/iam/reference/rest/v1/projects.serviceAccounts.keys

【问题讨论】:

  • 我只能提供部分解决方案。 1)您缺少父母。这需要是一个现有的服务帐户:parent: projects/development-123456/serviceAccounts/mysa@development-123456.iam.gserviceaccount.com
  • 2) 移除封装 privateKeyType 和 keyAlgoritm 的枚举。
  • @JohnHanley,你能给我举个1的例子吗。)
  • 您是指现有服务帐户的示例吗?
  • 您尝试执行的部署会为项目中的现有服务帐户创建服务帐户凭据。问题是我不知道如何告诉部署管理器将返回的凭据保存到文件中。

标签: google-cloud-platform service-accounts google-deployment-manager


【解决方案1】:

我会将@John 的回复发布为造福社区的答案。

父母不见了,需要一个现有的service account

projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}

其中 ACCOUNT 值可以是电子邮件或服务帐户的唯一 ID。

关于模板,请去掉封装 privateKeyType 和 keyAlgoritm 的枚举。

上述部署为现有服务帐户创建了一个服务帐户凭据,为了检索这个可下载的 json 密钥文件,可以使用 publicKeyData 属性使用outputs 公开它,然后对其进行 base64decode。

【讨论】:

  • Dany,您能否修改您的答案以包含最终解决方案。这将有助于其他人更清楚地看到解决方案。
  • 但是为什么parent 不在文档中?
  • 实际上我找不到任何使用部署管理器创建服务帐户的文档或任何示例。这就是为什么我做了一些研究来帮助你,因为我也想知道。我只能找到 REST API,它不能很好地转换为 Deployment Manager YAML。 REST API 不是 Deployment Manager 的参考(在许多情况下,它们的元素完全不同)。