我一直试图在圣诞节期间从无到有地设计一个项目来自动创建我的家庭网络,其中一个组件是Ubiquiti控制器,它需要一个谷歌密钥才能将设备绘制到地图上。
我已经能够使用Terraform自动创建项目:
resource "google_project" "slaterfamily_network" {
depends_on = ["data.google_organization.org"]
name = "Slater Family Network"
project_id = "slaterfamily-network"
org_id = "${data.google_organization.org.id}"
billing_account = "${var.billing_account}"
}
resource "google_project_iam_binding" "account_owner" {
project = "${google_project.slaterfamily_network.project_id}"
# It's important to specify ALL members, as this replaces them:
# https://twitter.com/devopsreact/status/840233052194320384
members = [
"user:richard@slaterfamily.name",
"serviceAccount:${data.google_service_account.terraform_service_account.email}",
]
role = "roles/owner"
}这对于配置Google来说很好,但是,我似乎找不到一种方法来启用Google Maps和生成API密钥,下面的语句支持服务使用API,但是它无法启用Maps API:
resource "google_project_service" "service_usage" {
project = "${var.project_id}"
service = "serviceusage.googleapis.com"
}
resource "google_project_service" "maps" {
depends_on = ["google_project_service.service_usage"]
project = "${var.project_id}"
service = "maps.googleapis.com"
}有了这个错误:
google_project_service.maps: Error enabling service: failed to issue request: googleapi: Error 403: The caller does not have permission, forbidden在跟踪HTTP调用之后,我得到了以下内容,格式为cURL,以便于再现:
curl -H 'Host: serviceusage.googleapis.com' -H 'content-type: application/json' -H 'authorization: Bearer {{ BEARER_TOKEN }}' -H 'user-agent: google-api-go-client/0.5 Terraform/0.11.7 (+https://www.terraform.io) terraform-provider-google/1.20.0' --data-binary "{}" --compressed 'https://serviceusage.googleapis.com/v1beta1/projects/slaterfamily-network/services/maps.googleapis.com:enable?alt=json&prettyPrint=false'其结果是:
{
"error": {
"code": 403,
"message": "The caller does not have permission",
"errors": [
{
"message": "The caller does not have permission",
"domain": "global",
"reason": "forbidden"
}
],
"status": "PERMISSION_DENIED"
}
}发布于 2021-10-10 02:49:00
如果您想要生成静态映射,我想您要查找的服务ID是maps-backend.googleapis.com或static-maps-backend.googleapis.com。
➜ ~ gcloud services list --available |grep maps
maps-android-backend.googleapis.com Maps SDK for Android
maps-backend.googleapis.com Maps JavaScript API
maps-embed-backend.googleapis.com Maps Embed API
maps-ios-backend.googleapis.com Maps SDK for iOS
static-maps-backend.googleapis.com Maps Static API我在Google版本360.0.0中获得了这些结果,alpha组件还提供了D4服务,这使我认为可以通过使用gcloud模块和gcloud alpha services api-keys create命令来实现。
发布于 2019-06-14 10:08:40
我最近遇到了类似的问题,但通过向服务帐户提供额外的角色来解决这个问题。我不知道你需要什么权限,你需要查一下。在我的例子中,我试图创建一个appengine项目,因此我不得不在服务帐户中添加"Appengine“角色,并通过terraform资源"google_project_service”启用“google_project_service”。
发布于 2021-10-10 09:30:41
谢谢@Ahmet!我悬赏这个问题,Ahmet得到了一个很好的答案。我尝试了gcloud模块的地形,它成功了!但是,我需要更进一步,因为gcloud命令无法保存输出,而且由于权限问题也无法读取文件。因此,我实际上接受了这个概念,并使用terraform中的local-exec来运行一个脚本,它执行我所需的所有gcloud命令。
您可以在这里找到一个API列表:https://developers.google.com/apis-explorer/
进入您需要的文档,并复制url *.googleapis.com,在我的示例中,我需要打开Geocoding,并为其提供一个API密钥。
# main.tf
module "project_services" {
source = "terraform-google-modules/project-factory/google//modules/project_services"
version = "11.2.1"
project_id = var.project_id
activate_apis = [
"geocoding-backend.googleapis.com",
]
disable_dependent_services = false
disable_services_on_destroy = false
}
resource "null_resource" "geocode" {
provisioner "local-exec" {
command = "chmod +x ./scripts/script.sh && sh ./scripts/script.sh"
environment = {
SERVICE_API = "geocoding-backend.googleapis.com"
KEY_NAME = "my-key"
SECRET_NAME = "my-secret"
}
}
depends_on = [
# e.g. module.secret_manager
]
}然后,您可以创建类似这样的脚本,并将环境变量注入到:
# ./scripts/script.sh
GCLOUD_LOCATION=$(command -v gcloud)
echo "Using gcloud from $GCLOUD_LOCATION"
gcloud alpha services api-keys create --api-target=service="$SERVICE_API" --display-name="$KEY_NAME" &&
export KEY_NAME=$(gcloud alpha services api-keys list --format="value(name)" --sort-by createTime --limit 1) &&
export API_KEY=$(gcloud alpha services api-keys get-key-string $KEY_NAME --format="value(keyString)") &&
printf $API_KEY | gcloud secrets versions add "$SECRET_NAME" --data-file=-上面的脚本获取密钥并将其插入到我在terraform中创建的现有秘密中。
https://devops.stackexchange.com/questions/5840
复制相似问题