CloudRun: отладка ошибки аутентификации от curl - PullRequest
0 голосов
/ 26 сентября 2019

Я раскручиваю контейнер (модуль / задание) из GKE.

Я настроил соответствующую учетную запись службы на виртуальных машинах кластера.

Поэтому, когда я вручную выполнить curl для конкретной конечной точки службы CloudRun, я могу выполнить запрос (и получить разрешение и получить 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"  
}

Мой вопрос, как я могу увидетьесли заголовок «Аутентификация» действительно достигает конечной точки (журналы не очень меня просвещают), и если это так, то правильно ли он отображается при вызове команды image / args изображения.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

В своей работе вы используете этот контейнер google/cloud-sdk, который является установкой с нуля gcloud инструмента.Он универсален, без какой-либо настройки.

Когда вы звоните по этому номеру $(gcloud auth print-identity-token), вы запрашиваете идентификационный токен учетной записи службы, настроенной в инструменте gcloud.

Если мы соединим это 2абзацы, вы хотите сгенерировать идентификационный токен из общей / пустой установки инструмента gcloud.Кстати, вы не указали служебную учетную запись в gcloud, и ваш токен пуст (как сказал @johnhanley).

Для решения этой проблемы добавьте переменную среды, подобную этой

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

Я не знаю, где находится ваша текущая credential.json вашей рабочей среды.Попробуйте выполнить echo этой переменной env, чтобы найти ее и правильно переслать в свою работу 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"

Не уверен, что работает.Дайте мне знать

1 голос
/ 27 сентября 2019

В вашей работе gcloud auth print-identity-token скорее всего не вернет токен.Причина в том, что локально gcloud использует вашу личность для чеканки токена, но в Job вы не авторизованы в gcloud.

...