【问题标题】:Unable to update GCP deployment using Java deployment manager SDK无法使用 Java 部署管理器 SDK 更新 GCP 部署
【发布时间】:2020-04-14 10:31:26
【问题描述】:

我正在尝试使用 Deployment Manager SDK for Java 编写一个应用程序来管理 GCP 部署。我能够成功列出部署,但无法更新部署,因为 SDK 会引发如下所示的异常。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
  "code" : 404,
  "errors" : [ {
    "domain" : "global",
    "message" : "The object 'projects/--redacted-project--/global/deployments' is not found.",
    "reason" : "notFound"
  } ],
  "message" : "The object 'projects/--redacted-project--/global/deployments' is not found."
}
        at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:150)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
        at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1067)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)

我的电话号码是:

val content = new Deployment().setTarget(target)

val updateResult = client.deployments().update(project, name, content)
          .setCreatePolicy("CREATE_OR_ACQUIRE")
          .setDeletePolicy("DELETE")
          .setPreview(false)
          .execute()

当我为 SDK 打开调试时,我看到以下交换:

2020-04-13 17:52:36,353 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - -------------- REQUEST  --------------
PUT https://www.googleapis.com/deploymentmanager/v2/projects/--redacted-project--/global/deployments/--redacted-deployment--
Accept-Encoding: gzip
Authorization: <Not Logged>
User-Agent: Google-API-Java-Client Google-HTTP-Java-Client/1.25.0 (gzip)
Content-Type: application/json; charset=UTF-8
Content-Encoding: gzip
Content-Length: 565

2020-04-13 17:52:36,353 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - curl -v --compressed -X PUT -H 'Accept-Encoding: gzip' -H 'Authorization: <Not Logged>' -H 'User-Agent: Google-API-Java-Client Google-HTTP-Java-Client/1.25.0 (gzip)' -H 'Content-Type: application/json; charset=UTF-8' -H 'Content-Encoding: gzip' -d '@-' -- 'https://www.googleapis.com/deploymentmanager/v2/projects/--redacted-project--/global/deployments/--redacted-deployment--' << $$$

2020-04-13 17:52:36,354 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - Total: 1,449 bytes

2020-04-13 17:52:36,354 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - {"target":{"config":{"content":"imports:\n  - path: dep.jinja\n\nresources:\n  - name: testing\n    type: dep.jinja\n    properties:\n      env: prod\n      banana: yes\n      retentionInDays: 5"},"imports":[{"content":"resources:\n- name: riffraff-dataset\n  type: bigquery.v2.dataset\n  properties:\n    location: europe-west2\n    datasetReference:\n      datasetId: riffraff_test\n- name: test-table\n  type: bigquery.v2.table\n  metadata:\n    dependsOn:\n    - riffraff-dataset\n  properties:\n    datasetId: riffraff_test\n    tableReference:\n      tableId: banana\n    schema:\n      fields:\n        - name: species\n          type: string\n        - name: plantation\n          type: string\n        - name: harvested\n          type: date\n        - name: quantity\n          type: numeric\n        - name: edible\n          type: boolean\n{% if properties['banana'] == \"yes\" %}\n- name: test-topic\n  type: gcp-types/pubsub-v1:projects.topics\n  properties:\n    topic: riffraff-topic\n{% endif %}\n- name: riffraff-bucket\n  type: storage.v1.bucket\n  properties:\n    location: europe-west2\n    storageClass: STANDARD\n    iamConfiguration:\n      uniformBucketLevelAccess:\n        enabled: True\n    {% if properties['retentionInDays'] %}\n    lifecycle:\n      rule:\n        - action:\n            type: Delete\n          condition:\n            age: {{ properties['retentionInDays'] }}\n    {% endif %}","name":"dep.jinja"}]}}

2020-04-13 17:52:37,174 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - -------------- RESPONSE --------------
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer
Content-Encoding: gzip
Date: Mon, 13 Apr 2020 16:52:37 GMT
Server: ESF
Cache-Control: private
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Alt-Svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000
Transfer-Encoding: chunked

所以它看起来像一个无效的 URL 或对象。

但是,如果我使用 gcloud CLI 工具对 --log-http 执行相同的操作,我会发现它访问的是完全相同的端点,但没有得到 404:

==== request start ====
uri: https://www.googleapis.com/deploymentmanager/v2/projects/--redacted-project--/global/deployments/--redacted-deployment--?alt=json&preview=False&createPolicy=CREATE_OR_ACQUIRE&deletePolicy=DELETE
method: PUT

不知道从这里去哪里。

【问题讨论】:

    标签: java google-cloud-platform google-deployment-manager


    【解决方案1】:

    进一步挖掘后,我注意到 PUT 请求中正文 JSON 中的字段不同。 gcloud CLI 发送 fingerprintnametarget,而 Java SDK 只发送 target

    隐藏在documentation for the request body 中,它说您需要为update 设置fingerprint 和一些其他方法。

    我修改了我的代码以首先获取部署并在请求中包含fingerprint,它开始工作。

    val content = new Deployment().setName(name).setFingerprint(fingerprint).setTarget(target)
    
    val updateResult = client.deployments().update(project, name, content)
      .setCreatePolicy("CREATE_OR_ACQUIRE")
      .setDeletePolicy("DELETE")
      .setPreview(false)
      .execute()
    

    在我看来 404 是错误的错误。 Google 应该返回 400,因为客户端未在请求中包含必填字段。

    此外,SDK 会进行大量的前置条件检查以捕获无效请求,但不包括此一项。我已经通过 Google 向 opened an issue 提出建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多