Сбой развертывания облачной функции с использованием terraform — «Запрошена неверная учетная запись службы функций»

#google-cloud-functions #google-cloud-iam

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

Вопрос:

Я хочу развернуть облачную функцию Google и хочу сделать это с помощью terraform. Я также хочу создать учетную запись службы, которая будет действовать как учетная запись службы не по умолчанию для запуска этой функции, как описано в Function Identity> Per-function identity . Идентификатор этой учетной записи службы dataflowdemo равен .

Я создал учетную запись службы, которую хочу использовать для запуска своих развертываний (не совпадает с учетной записью службы, упомянутой в предыдущем абзаце), идентификатор этой учетной записи службы deployer :

 export PROJECT=myproject
gcloud iam service-accounts create --project $PROJECT deployer
 

Я загрузил файл ключа, на который я могу ссылаться в «$ GOOGLE_APPLICATION_CREDENTIALS», как указано в Terraform Google Provider> Добавление учетных данных:

 export GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/deployer.json
gcloud iam service-accounts keys create 
   --project $PROJECT 
   --iam-account deployer@${PROJECT}.iam.gserviceaccount.com $GOOGLE_APPLICATION_CREDENTIALS
 

и предоставили ей необходимые разрешения

 gcloud projects add-iam-policy-binding $PROJECT --member="serviceAccount:deployer@${PROJECT}.iam.gserviceaccount.com" --role="roles/storage.admin"
gcloud projects add-iam-policy-binding $PROJECT --member="serviceAccount:deployer@${PROJECT}.iam.gserviceaccount.com" --role="roles/cloudfunctions.admin"
gcloud projects add-iam-policy-binding $PROJECT --member="serviceAccount:deployer@${PROJECT}.iam.gserviceaccount.com" --role="roles/iam.serviceAccountAdmin"
gcloud projects add-iam-policy-binding $PROJECT --member="serviceAccount:deployer@${PROJECT}.iam.gserviceaccount.com" --role="roles/iam.roleAdmin"
 

Код terraform довольно прост, он создает dataflowdemo учетную запись службы и указывает эту учетную запись службы в качестве учетной записи службы, отличной от учетной записи службы по умолчанию для облачной функции. Код доступен по адресу https://github.com/jamiekt/dataflowdemo/tree/6775ff7fd395320705a82ecb16f3fb054993ed57 .

Я запускаю развертывание terraform следующим образом:

 terraform init amp;amp; terraform apply --auto-approve
 

и впоследствии происходит сбой с:

Ошибка: googleapi: Ошибка 400: запрошена неверная учетная запись службы функций: serviceAccount:dataflowdemo@myproject.iam.gserviceaccount.com . Пожалуйста, посетите https://cloud.google.com/functions/docs/troubleshooting для получения подробной документации по устранению неполадок., BadRequest

Я посетил ссылку, указанную в сообщении об ошибке, в котором говорится:

Однако для использования учетной записи службы времени выполнения, отличной от учетной записи по умолчанию, у разработчика развертывания должно быть разрешение iam.ServiceAccounts.ActAs для этой учетной записи, отличной от учетной записи по умолчанию. Пользователю, создающему учетную запись службы времени выполнения, отличную от учетной записи службы времени выполнения по умолчанию, автоматически предоставляется это разрешение

Средство развертывания функции (т. Е. deployer Учетная запись службы) — это та же учетная запись, которая создала функцию, поэтому я очень смущен, почему это не удается.

Пожалуйста, кто-нибудь может сказать мне, где я ошибаюсь, и что мне нужно сделать, чтобы это исправить?

Ответ №1:

В вашем functions.tf файле вы определили свою учетную запись службы следующим образом

 service_account_email = "serviceAccount:${google_service_account.sa.email}"
 

Удалите serviceAccount: префикс

 service_account_email = "${google_service_account.sa.email}"
 

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

1. спасибо, это решило проблему. Мне также пришлось предоставить роли учетной записи развертывания / iam.serviceAccountUser. См. раздел Фиксация github.com/jamiekt/dataflowdemo/commit /… для получения подробной информации