Получаю действительно странную ошибку, когда пытаюсь развернуть свою облачную функцию в конкретном проекте. я бегу
gcloud config set project <project>
gcloud functions deploy my_cf --entry-point start_process \
--gen2 \
--trigger-http \
--region europe-west1 \
--runtime python310 \
--service-account <service account name>@<project>.iam.gserviceaccount.com \
--no-allow-unauthenticated \
--source=./CloudFunction/
И моя учетная запись службы имеет, как я предполагаю (на основе документации), необходимые разрешения, а также некоторые:
Artifact Registry Administrator
Cloud Functions Admin
Cloud Run Admin
Eventarc Event Receiver
Eventarc Service Agent
Pub/Sub Publisher
Service Account Token Creator
Storage Admin
Однако я продолжаю получать ошибку
OperationError: code=13, message=Build failed with status: FAILURE and message: An unexpected error occurred. Refer to build logs: https://console.cloud.google.com/cloud-build/builds;region=europe-west1/<build_id>?project=<project_number>
И когда я проверяю журналы сборки облака, я вижу ошибку с сообщением:
"Step #2 - "build": ERROR: failed to create image cache: accessing cache image
"europe-west1-docker.pkg.dev/<project>/gcf-artifacts/my--cf/cache:latest":
connect to repo store "europe-west1-docker.pkg.dev/<project>/gcf-artifacts/<my--cf>/cache:latest":
GET https://europe-west1-docker.pkg.dev/v2/token?scope=repository%3A<project>%2Fgcf-artifacts%2Fmy--cf%2Fcache%3Apull&service=:
DENIED: Permission "artifactregistry.repositories.downloadArtifacts"
denied on resource "projects/<project>/locations/europe-west1/repositories/gcf-artifacts"
(or it may not exist)"
Я пробовал изменить разрешение как для себя, так и для учетной записи службы, но, похоже, ничего не имеет значения. Кроме того, я выполнял это упражнение в других проектах, и у меня не было этой проблемы. Есть идеи, что не так?
@DazWilkin, у этой учетной записи уже была роль cloudbuild.builds.builder, которая включает вышеуказанное разрешение. Я изучил детали выполнения сборки и обнаружил, что она использует учетную запись службы, например ${NUMBER}[email protected]. Это было странно, потому что он использовал это, даже когда я указал учетную запись службы, которую использует моя служба, и учетную запись службы облачной сборки, которая будет использоваться по умолчанию для сборок. Облачные функции должны иметь учетную запись компьютерной службы по умолчанию с возможностью жесткой перезаписи.
Можете ли вы попробовать добавить роли cloudfunctions.developer
и iam.serviceAccountUser
в учетную запись [PROJECT_NUMBER]@cloudbuild.gserviceaccount.com`. Также убедитесь, что учетную запись службы CloudBuild также необходимо добавить в качестве члена учетной записи службы, имеющей разрешения на развертывание вашей облачной функции. Также взгляните на эту Документацию.
Исправление - это то, о чем я отметил. По какой-то причине это сервисная учетная запись, например ${NUMBER}[email protected]
, которая выполняет сборки Cloud Build только из Cloud Functions. Я даже пытался изменить предпочитаемую учетную запись службы Legacy Cloud Build и учетную запись службы, которую я использую для своей облачной функции, но это не сработало.
Кажется, проблема в том, что Cloud Functions заставляет Cloud Build использовать ${NUMBER}[email protected]
в качестве учетной записи службы для своих заданий сборки. Решением было предоставить этому сервисному аккаунту разрешение artifactregistry.repositories.downloadArtifacts
.
Я подозреваю (!), что проблема связана с учетной записью службы Cloud Build (!), а не с вашей (!?) учетной записью службы. Вы можете идентифицировать учетную запись службы Cloud Build с помощью
NUMBER=$(gcloud projects describe ${PROJECT} --format = "value(projectNumber)")
, а затем перечислить ее роли с помощьюgcloud projects get-iam-policy ${PROJECT} --flatten = "bindings[].members" --filter = "bindings.members:${NUMBER}@cloudbuild.gserviceaccount.com" --format = "value(bindings.role)"
, а затем проверить, включено ли разрешение (!)artifactregistry.repositories.downloadArtifacts
.