Не удалось развернуть функцию: «artifactregistry.repositories.downloadArtifacts» отказано, но учетной записи службы предоставлена политика

#google-cloud-functions #google-cloud-build

#google-cloud-функции #google-cloud-build

Вопрос:

Как новичок в GCP и облачной функции, я следил за официальным руководством Google по развертыванию HelloWorld Node.js Облачная функция.

Cloud SDK находится в версии 366.0.0, и компоненты были обновлены.

При сборке (с использованием cloud_build_local или cloud build) развертывание завершается с ошибкой :

 >ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: {"error":>>{"buildpackId":"","buildpackVersion":"","errorType":"OK","canonicalCode":"OK","errorId":"","errorMessage":""},"stats":[{"buildpackId":"google.utils.archive-source","buildpackVersion":"0.0.1","totalDurationMs":51,"userDurationMs":51},{"buildpackId":"google.nodejs.npm","buildpackVersion":"0.9.0","totalDurationMs":9223,"userDurationMs":9211},{"buildpackId":"google.nodejs.functions-framework","buildpackVersion":"0.9.3","totalDurationMs":2730,"userDurationMs":2679},{"buildpackId":"google.utils.label","buildpackVersion":"0.0.1","totalDurationMs":0,"userDurationMs":0}],"warnings":["*** Improve build performance by generating and committing package-lock.json."]}
 

При просмотре журналов облачной сборки в консоли :

 >Step #1 - "build": ERROR: failed to export: failed to write image to the following tags: [eu.gcr.io/**myproject**/gcf/**europe-west1**/de6f32d4-69e9-4967-a008-6443bd39f1d9:helloHttp_version-1:
GET https://eu.gcr.io/v2/token?scope=repository:**myproject**/gcf/**europe-west1**/de6f32d4-69e9-4967-a008-6443bd39f1d9:push,pullamp;scope=repository:fn-img/buildpacks/nodejs16/run:pullamp;service=eu.gcr.io:
DENIED: Permission "_**artifactregistry.repositories.downloadArtifacts**_" denied on resource "projects/**fn-img**/locations/**europe**/repositories/eu.gcr.io" (or it may not exist)]
 

Вот роли, предоставленные учетной записи службы облачной сборки :

 >ROLE
roles/appengine.appAdmin
roles/appengine.deployer
roles/artifactregistry.reader
roles/cloudbuild.builds.builder
roles/cloudbuild.workerPoolUser
roles/cloudfunctions.developer
roles/cloudkms.cryptoKeyDecrypter
roles/compute.instanceAdmin.v1
roles/container.developer
roles/iam.serviceAccountUser
roles/run.admin
roles/secretmanager.secretAccessor
roles/storage.admin
 

Сконфигурированный Docker creds:

 >  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud",
    "europe-west1-docker.pkg.dev": "gcloud"
  }
 

Список активированных API в проекте :

 >gcloud services list --enabled
NAME                                 TITLE
aiplatform.googleapis.com            Vertex AI API
apigateway.googleapis.com            API Gateway API
appengine.googleapis.com             App Engine Admin API
artifactregistry.googleapis.com      Artifact Registry API
bigquery.googleapis.com              BigQuery API
bigquerystorage.googleapis.com       BigQuery Storage API
cloudapis.googleapis.com             Google Cloud APIs
cloudbuild.googleapis.com            Cloud Build API
clouddebugger.googleapis.com         Cloud Debugger API
cloudfunctions.googleapis.com        Cloud Functions API
cloudkms.googleapis.com              Cloud Key Management Service (KMS) API
cloudresourcemanager.googleapis.com  Cloud Resource Manager API
cloudtrace.googleapis.com            Cloud Trace API
compute.googleapis.com               Compute Engine API
container.googleapis.com             Kubernetes Engine API
containerregistry.googleapis.com     Container Registry API
datastore.googleapis.com             Cloud Datastore API
deploymentmanager.googleapis.com     Cloud Deployment Manager V2 API
dns.googleapis.com                   Cloud DNS API
firebase.googleapis.com              Firebase Management API
iam.googleapis.com                   Identity and Access Management (IAM) API
iamcredentials.googleapis.com        IAM Service Account Credentials API
logging.googleapis.com               Cloud Logging API
monitoring.googleapis.com            Cloud Monitoring API
oslogin.googleapis.com               Cloud OS Login API
pubsub.googleapis.com                Cloud Pub/Sub API
run.googleapis.com                   Cloud Run Admin API
runtimeconfig.googleapis.com         Cloud Runtime Configuration API
secretmanager.googleapis.com         Secret Manager API
servicecontrol.googleapis.com        Service Control API
servicemanagement.googleapis.com     Service Management API
servicenetworking.googleapis.com     Service Networking API
serviceusage.googleapis.com          Service Usage API
source.googleapis.com                Legacy Cloud Source Repositories API
spanner.googleapis.com               Cloud Spanner API
sql-component.googleapis.com         Cloud SQL
sqladmin.googleapis.com              Cloud SQL Admin API
storage-api.googleapis.com           Google Cloud Storage JSON API
storage-component.googleapis.com     Cloud Storage
storage.googleapis.com               Cloud Storage API
vpcaccess.googleapis.com             Serverless VPC Access API`
 

Кроме того, переход из реестра контейнеров завершен (хотя я никогда не использовал реестр контейнеров)

Шаги для воспроизведения: следуя руководству:'( : /

Я чувствую, что просмотрел всю доступную документацию (я мог). Я даже расширил права учетной записи службы облачной сборки на хранение, артефакты и функции администратора… Я пробовал использовать другие собственные функции в других регионах…

Кто-нибудь знает, что я делаю не так?

Большое спасибо

Комментарии:

1. Можете ли вы поделиться тем, как вы развертываете облачную сборку?

2. Здравствуйте, конечно, важная вещь, которую я забыл упомянуть. Я также выполняю развертывание, следуя руководству: > функции gcloud развертывают helloGET —runtime nodejs16 —trigger-http —allow-не прошедший проверку подлинности Я также пробовал с альфа- и бета-компонентами. Спасибо за вашу помощь

3. Можете ли вы проверить, активировали ли вы API реестра артефактов (в меню API -> Каталог в консоли)?

4. Да, она активирована. Я обновил вопрос списком активированных сервисов. Кроме того, переход из реестра контейнеров завершен (хотя я никогда не использовал реестр контейнеров).

Ответ №1:

Похоже, что учебное пособие может быть устаревшим, поскольку переход от реестра контейнеров к хранилищу артефактов является обязательным. Решение можно найти в документации здесь.

Для развертывания облачных функций с хранилищем артефактов требуется :

  • использование альфа- или бета-компонентов SDK ;
  • указание целевого реестра артефактов с помощью флага —docker-repository (установка артефактов конфигурации / репозитория будет недостаточной).

В заключение, вместо выполнения команды, упомянутой в руководстве :

 gcloud functions deploy helloGET --runtime nodejs16 --trigger-http --allow-unauthenticated
 

Я побежал :

 gcloud beta functions deploy helloGET --runtime nodejs16 --trigger-http --allow-unauthenticated --region=europe-west1 __--docker-repository__=projects/myproject/locations/europe-west1/repositories/myrpreviouslycreatedrepo
 

И это сработало просто отлично.