如何使用 Terraform 公开 gcp 云功能

Posted

技术标签:

【中文标题】如何使用 Terraform 公开 gcp 云功能【英文标题】:How to make gcp cloud function public using Terraform 【发布时间】:2020-10-12 20:48:57 【问题描述】:

我首先要说我对 GCP 和 Terraform 都很陌生,所以我希望有一个我刚刚忽略的简单答案。

我正在尝试创建一个 GCP 云功能,然后使用 Terraform 将其公开。尽管严格遵循文档的示例,但我能够创建该函数但不能将其公开:https://www.terraform.io/docs/providers/google/r/cloudfunctions_function.html

当到达 google_cloudfunctions_function_iam_member 资源时,我收到错误“googleapi: 错误 403: Permission 'cloudfunctions.functions.setIamPolicy' denied on resource ...(或资源可能不存在)”。

如何将此功能设为公开?它是否与我用于创建所有这些资源的凭据的帐户/api 密钥有关?

提前致谢。

我的 main.tf 文件:

provider "google" 
  project     = "my-project"
  credentials = "key.json" #compute engine default service account api key
  region      = "us-central1"


terraform 
  backend "gcs" 
    bucket  = "manually-created-bucket"
    prefix  = "terraform/state"
    credentials = "key.json"
  


# create the storage bucket for our scripts
resource "google_storage_bucket" "source_code" 
  name     = "test-bucket-lh05111992"
  location = "us-central1"
  force_destroy = true


# zip up function source code
data "archive_file" "my_function_script_zip" 
 type        = "zip"
 source_dir  = "../source/scripts/my-function-script"
 output_path = "../source/scripts/my-function-script.zip"


# add function source code to storage
resource "google_storage_bucket_object" "my_function_script_zip" 
 name   = "index.zip"
 bucket = google_storage_bucket.source_code.name
 source = "../source/scripts/my-function-script.zip"


#create the cloudfunction 
resource "google_cloudfunctions_function" "function" 
  name        = "send_my_function_script"
  description = "This function is called in GTM. It sends a users' google analytics id to BigQuery."
  runtime     = "nodejs10"

  available_memory_mb   = 128
  source_archive_bucket = google_storage_bucket.source_code.name
  source_archive_object = google_storage_bucket_object.my_function_script_zip.name
  trigger_http          = true
  entry_point           = "handleRequest"


# IAM entry for all users to invoke the function 
resource "google_cloudfunctions_function_iam_member" "invoker" 
  project        = google_cloudfunctions_function.function.project
  region         = "us-central1"
  cloud_function = google_cloudfunctions_function.function.name
  
  role = "roles/cloudfunctions.invoker"
  member = "allUsers"

【问题讨论】:

【参考方案1】:

除了调整 @chinoche 建议的 IAM 角色之外,我还发现我需要修改我正在使用的服务帐户以授予项目所有者权限。 (我猜我使用的默认没有这个)。我更新了我的 key.json,它终于奏效了。

【讨论】:

您不必将所有者权限授予您的 SA,您只需添加此权限即可; cloudfunctions.functions.setIamPolicy 实现此目的的最佳方法是应用最小权限原则,即创建您自己的自定义角色,然后将其附加到您的 SA。【参考方案2】:

似乎 terraform 站点中该示例的唯一问题是自 2019 年 11 月以来已修改的“Cloud Functions IAM 资源”。现在您必须按照 here 的说明指定这些资源。现在对于您的用户案例(公共云功能),我建议您关注 this configuration 并将“members”属性更改为“allUsers”,这样它就会是这样的

resource "google_cloudfunctions_function_iam_binding" "binding" 
  project = google_cloudfunctions_function.function.project
  region = google_cloudfunctions_function.function.region
  cloud_function = google_cloudfunctions_function.function.name
  role = "roles/cloudfunctions.invoker"
  members = [
    "allUsers",
  ]

最后,您可以对其进行测试并在“#Try this API”右侧面板中修改您已经创建的函数here,然后像这样输入正确的资源和请求正文(确保输入“资源" 参数正确):


  "policy": 
    "bindings": [
      
        "members": [
          "allUsers"
        ],
        "role": "roles/cloudfunctions.invoker"
      
    ]
  

【讨论】:

感谢您指出 IAM 资源中的更新。

以上是关于如何使用 Terraform 公开 gcp 云功能的主要内容,如果未能解决你的问题,请参考以下文章

gcp 云函数 pub/sub 主题死信

使用 Github 和 Cloud Source Repository 的 Terraform GCP Cloud 功能

分配 GCP 函数服务帐号角色以使用 Terraform 与 Firebase 互动

如何使用 API 或 Terraform 模板在 GCP 中创建 StackDriver 工作区

使用 terraform 创建多个 GCP 存储桶

如何使用变量在 terraform GCP 上添加或删除 access_config