首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何启用Google并使用Terraform生成API密钥?

如何启用Google并使用Terraform生成API密钥?
EN

DevOps用户
提问于 2018-12-27 18:56:17
回答 3查看 2.4K关注 0票数 4

我一直试图在圣诞节期间从无到有地设计一个项目来自动创建我的家庭网络,其中一个组件是Ubiquiti控制器,它需要一个谷歌密钥才能将设备绘制到地图上。

我已经能够使用Terraform自动创建项目:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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"
}

有了这个错误:

代码语言:javascript
复制
google_project_service.maps: Error enabling service: failed to issue request: googleapi: Error 403: The caller does not have permission, forbidden

在跟踪HTTP调用之后,我得到了以下内容,格式为cURL,以便于再现:

代码语言:javascript
复制
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'

其结果是:

代码语言:javascript
复制
{
  "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"
  }
}
EN

回答 3

DevOps用户

发布于 2021-10-10 02:49:00

如果您想要生成静态映射,我想您要查找的服务ID是maps-backend.googleapis.comstatic-maps-backend.googleapis.com

代码语言:javascript
复制
➜  ~ 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命令来实现。

票数 2
EN

DevOps用户

发布于 2019-06-14 10:08:40

我最近遇到了类似的问题,但通过向服务帐户提供额外的角色来解决这个问题。我不知道你需要什么权限,你需要查一下。在我的例子中,我试图创建一个appengine项目,因此我不得不在服务帐户中添加"Appengine“角色,并通过terraform资源"google_project_service”启用“google_project_service”。

票数 1
EN

DevOps用户

发布于 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密钥。

代码语言:javascript
复制
# 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
  ]
}

然后,您可以创建类似这样的脚本,并将环境变量注入到:

代码语言:javascript
复制
# ./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中创建的现有秘密中。

票数 0
EN
页面原文内容由DevOps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://devops.stackexchange.com/questions/5840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档