You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform配置实例使用Cloud Storage存储桶启动脚本?

Terraform配置GCP实例加载GCS启动脚本失败排查与解决

问题背景

尝试三种Terraform配置方式让GCP实例加载Cloud Storage存储桶中的启动脚本,均未生效,但手动在GCP控制台配置可正常运行。所用服务账号已配置roles/storage.legacyObjectReader和roles/storage.legacyBucketReader补充角色。

三种尝试的配置方式:

  • 实例模板模块的startup_script参数直接传入GCS URL
  • 实例模板模块的metadata中注释了startup-script-url配置
  • google_compute_instance_from_template资源的metadata中配置startup-script-url

排查与修复方案

1. 实例模板模块参数误用修正

使用的terraform-google-modules/vm/google//modules/instance_template(v11.x)模块中,startup_script参数仅支持内联脚本内容,不能直接传入GCS URL。直接传URL会导致实例尝试执行字符串本身,而非下载脚本。

需改用模块的metadata参数传入startup-script-url。

2. 实例模板metadata配置修复

取消metadata中startup-script-url的注释,同时注意:

  • 避免var.metadata中的键值对覆盖该配置(merge函数会优先保留变量中的值)
  • 移除map键值对末尾的逗号(Terraform语法不需要)

修改后配置:

module "instance_template" {
  source  = "terraform-google-modules/vm/google//modules/instance_template"
  version = "~> 11.0"

  # 其他原有参数保持不变...

  metadata = merge(
    var.metadata,
    {
      # enable-oslogin = "TRUE"
      "startup-script-url" = "gs://bucketbbbb/script.sh"
    }
  )
}

3. 实例资源metadata合并逻辑修正

在google_compute_instance_from_template中直接使用metadata会完全覆盖模板中的所有metadata,可能丢失服务账号、访问范围等关键配置,导致脚本下载失败。

需改用metadata_merge参数实现配置合并:

resource "google_compute_instance_from_template" "bastion_vm" {
  count   = var.create_instance_from_template ? 1 : 0
  name    = var.name
  project = var.project
  zone    = var.zone
  labels  = var.labels

  metadata_merge = {
    "startup-script-url" = "gs://bucketbbbb/script.sh"
  }
}

4. 权限与访问范围验证

  • 确认实例模板的service_account块中email正确指向有权限的服务账号
  • 检查实例访问范围(scopes):若使用自定义scopes,需包含https://www.googleapis.com/auth/devstorage.read_only,或直接使用storage-read-only预设范围

5. 日志排查

若仍未生效,登录实例查看启动脚本执行日志定位具体问题:

  • Debian/Ubuntu:sudo journalctl -u google-startup-scripts.service 或查看/var/log/google-startup-scripts.log
  • RHEL/CentOS:sudo journalctl -u google-startup-scripts.service

总结

核心问题点:

  1. 第一种方法误用模块参数,startup_script不支持GCS URL
  2. 第二种方法未启用注释配置,且需注意merge逻辑
  3. 第三种方法错误使用metadata导致模板配置被覆盖

调整上述配置后,实例即可正常从GCS下载并执行启动脚本。

内容的提问来源于stack exchange,提问作者Karina Janus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:59:56