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"
不确定是否有效。让我知道
我正在从 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"
不确定是否有效。让我知道