CloudRun:调试来自 curl 的身份验证错误

CloudRun: Debug authentication error from curl

我正在从 GKE 启动一个容器 (pod/Job)。

我已经在集群的 VM 上设置了适当的服务帐户。

因此,当我手动对特定的 CloudRun 服务端点执行 curl 时,我可以执行请求(并获得授权并拥有 200在我的回复中)

但是,当我尝试通过如下方式在 Job 中将图像设置为 运行 来自动执行此操作时,我得到 401

      - name:  pre-upgrade-job
        image: "google/cloud-sdk"
        args:
          - curl
          - -s
          - -X
          - GET
          - -H
          - "Authorization: Bearer $(gcloud auth print-identity-token)"
          - https://my-cloud-run-endpoint

这是 Stackdriver

上的日志
{
 httpRequest: {
  latency: "0s"   
  protocol: "HTTP/1.1"   
  remoteIp: "gdt3:r787:ff3:13:99:1234:avb:1f6b"   
  requestMethod: "GET"   
  requestSize: "313"   
  requestUrl: "https://my-cloud-run-endpoint"   
  serverIp: "212.45.313.83"   
  status: 401   
  userAgent: "curl/7.59.0"   
 }
 insertId: "29jdnc39dhfbfb"  
 logName: "projects/my-gcp-project/logs/run.googleapis.com%2Frequests"  
 receiveTimestamp: "2019-09-26T16:27:30.681513204Z"  
 resource: {
  labels: {
   configuration_name: "my-cloud-run-service"    
   location: "us-east1"    
   project_id: "my-gcp-project"    
   revision_name: "my-cloudrun-service-d5dbd806-62e8-4b9c-8ab7-7d6f77fb73fb"    
   service_name: "my-cloud-run-service"    
  }
  type: "cloud_run_revision"   
 }
 severity: "WARNING"  
 textPayload: "The request was not authorized to invoke this service. Read more at https://cloud.google.com/run/docs/securing/authenticating"  
 timestamp: "2019-09-26T16:27:30.673565Z"  
}

我的问题是如何查看 "Authentication" header 是否确实到达了终点(日志对我启发不大),如果到达了终点,它是否在图像 command/args调用。

在您的工作中,gcloud auth print-identity-token 可能 return 没有任何标记。 原因是在本地,gcloud 使用您的身份来铸造令牌,但在作业中,您没有登录 gcloud。

在您的工作中,您使用这个容器 google/cloud-sdk,它是 gcloud 工具的从头安装。它是通用的,没有任何定制。

当您调用此 $(gcloud auth print-identity-token) 时,您需要在 gcloud 工具中配置的服务帐户的身份令牌。

如果我们将这 2 个段落放在一起,您希望从 generic/blank 安装的 gcloud 工具中生成一个身份令牌。顺便说一句,您没有在 gcloud 中定义服务帐户,并且您的令牌是空的(如@johnhanley 所说)。

为了解决这个问题,添加一个这样的环境变量

env: 
  - GOOGLE_APPLICATION_CREDENTIAL=<path to your credential.json>

我不知道你当前的credential.json 运行ning 环境在哪里。尝试对该环境变量执行 echo 以找到它并将其正确转发给您的 gcloud 作业。

如果您使用的是与元数据服务器兼容的计算引擎或类似系统,则可以使用此命令获取正确的令牌:

curl  -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=<URL of your service>"

更新

尝试在 gcloud 容器之外 运行 您的命令。这里是你工作的更新

 - name:  pre-upgrade-job
        image: "google/cloud-sdk"
        entrypoint: "bash"
        args:
          - -c
          - "curl -s -X GET -H \"Authorization: Bearer $(gcloud auth print-identity-token)\" https://my-cloud-run-endpoint"

不确定是否有效。让我知道