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

时间:2019-09-26 18:32:34

标签: kubernetes google-cloud-platform escaping google-cloud-run

我正在从GKE旋转一个容器(pod / Job)。

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

因此,当我手动对特定的CloudRun服务端点执行@override void setState(fn) { if (mounted) { super.setState(fn); } } 时,我可以执行请求(并获得授权并在响应中包含curl)< / p>

但是,当我尝试通过按如下所示将图像设置为在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

我的问题是我如何查看“身份验证”标头是否确实到达端点(日志对我没有多大启发),如果可以,是否在图像命令/参数调用时适当地呈现了它。

2 个答案:

答案 0 :(得分:1)

在您的工作中,gcloud auth print-identity-token可能不会返回任何令牌。 原因是在本地,gcloud使用您的身份铸造令牌,但是在Job中,您没有登录gcloud。

答案 1 :(得分:1)

在工作中,您使用此容器google/cloud-sdk,该容器是gcloud工具的全新安装。它是通用的,没有任何自定义。

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

如果我们将这两段放在一起,则您想从gcloud工具的通用/空白安装中生成一个身份令牌。顺便说一下,您没有在gcloud中定义服务帐户,并且令牌为空(如@johnhanley所说)。

要解决此问题,请添加这样的环境变量

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

我不知道您当前的运行环境credential.json在哪里。尝试执行此环境变量的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"

不确定是否可行。让我知道