Google cloud platform 地形:不允许交叉项目引用

Google cloud platform 地形:不允许交叉项目引用,google-cloud-platform,terraform,Google Cloud Platform,Terraform,我在google\u compute\u firewall中看到了一些奇怪的东西,计算实例位于共享子网中 我假设防火墙规则需要与该子网所属的网络相关联。但我们无法将防火墙规则添加到该网络,因为: google_compute_firewall.intacct-firewall: Error creating Firewall: googleapi: Error 400: Invalid value for field 'resource.network': 'projects/it-produc

我在
google\u compute\u firewall
中看到了一些奇怪的东西,计算实例位于共享子网中

我假设防火墙规则需要与该子网所属的网络相关联。但我们无法将防火墙规则添加到该网络,因为:

google_compute_firewall.intacct-firewall: Error creating Firewall: googleapi: Error 400: Invalid value for field 'resource.network': 'projects/it-production-186816/global/networks/production'. Cross project referencing is not allowed for this resource., invalid
在共享网络上找不到有关防火墙规则的任何文档。我们是否要将防火墙添加到本地专有网络而不是共享专有网络

计算映像具有以下网络配置:

  network_interface {
    subnetwork         = "${var.subnetwork}"
    subnetwork_project = "${var.vpc_parent}"
    access_config      = {
      nat_ip = "${google_compute_address.dokku.address}"
    }
  }
因此,尽管计算实例位于
project-1
中,但它使用的网络位于
project-2

编辑:

My main.tf:

# Backend config
terraform {
  backend "gcs" {
    bucket      = "intacct-staging-remote-backend"
    project     = "fr-intacct-staging"
    credentials = "./creds/serviceaccount.json"
  }
}
#
# Provider config
provider "google" {
  region      = "${var.gcp_region}"
  project     = "${var.gcp_project}"
  credentials = "${file("./creds/serviceaccount.json")}"
}
#
# Static IP Address for the app
resource "google_compute_address" "dokku" {
  name = "fr-intacct-staging-ip"
  address_type = "EXTERNAL"
}
#
# Compute Instance Config
resource "google_compute_instance" "dokku" {
  project                   = "${var.gcp_project}"
  name                      = "dokku-host1"
  machine_type              = "${var.comp_type}"
  zone                      = "${var.gcp_zone}"
  allow_stopping_for_update = "true"

  tags = ["intacct"]

  # Install Dokku
  metadata_startup_script   = <<SCRIPT
sudo yum install -y wget
wget https://raw.githubusercontent.com/dokku/dokku/v0.14.5/bootstrap.sh
sudo DOKKU_TAG=${var.dokku_version} bash bootstrap.sh
sudo dokku apps:create fr-intacct-staging
sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo systemctl restart network
setenforce 0
SCRIPT

  boot_disk {
    initialize_params {
      image = "${var.compute_image}"
    }
  }
  network_interface {
    subnetwork         = "${var.subnetwork}"
    subnetwork_project = "${var.vpc_parent}"
    access_config      = {
      nat_ip = "${google_compute_address.dokku.address}"
    }
  }
}
#
# Firewall rule for app access
resource "google_compute_firewall" "intacct-firewall" {
  name    = "intacct-firewall"
  network = "projects/it-production-186816/global/networks/production"
  allow {
    protocol = "tcp"
    ports    = [ "80" ]
  }
  source_ranges = [ "0.0.0.0/0" ]
  target_tags   = [ "intacct" ]
}
#后端配置
地形{
后端“gcs”{
bucket=“intacct暂存远程后端”
project=“fr intacct分期”
credentials=“./creds/serviceCount.json”
}
}
#
#提供者配置
提供商“谷歌”{
region=“${var.gcp_region}”
project=“${var.gcp_project}”
凭据=“${file(“./creds/servicecomport.json”)}
}
#
#应用程序的静态IP地址
资源“谷歌计算地址”“dokku”{
name=“fr intacct staging ip”
地址\u type=“外部”
}
#
#计算实例配置
资源“google\u compute\u实例”“dokku”{
project=“${var.gcp_project}”
name=“dokku-host1”
machine_type=“${var.comp_type}”
zone=“${var.gcp_zone}”
允许为更新而停止
标记=[“intacct”]
#安装Dokku
元数据\启动\脚本=/etc/sysctl.conf
sudo systemctl重新启动网络
设置强制执行0
剧本
启动盘{
初始化参数{
image=“${var.compute\u image}”
}
}
网络接口{
subnetwork=“${var.subnetwork}”
子网_项目=“${var.vpc_parent}”
访问配置={
nat_ip=“${google_compute_address.dokku.address}”
}
}
}
#
#应用程序访问的防火墙规则
资源“谷歌计算防火墙”intacct防火墙{
name=“intacct防火墙”
network=“projects/it-production-186816/global/networks/production”
容许{
协议=“tcp”
端口=[“80”]
}
source_范围=[“0.0.0.0/0”]
目标_标记=[“intacct”]
}
为另一个项目使用另一个提供程序配置来添加防火墙规则似乎是错误的


如果是那样的话,那就这样吧。。。但是,由于正在使用的服务帐户对另一个项目具有权限,因此我们必须为另一个项目使用另一个提供商似乎是错误的?

错误没有问题,您应该在声明网络的项目中执行terraform

如果是project-2(就像您在一个多项目环境中一样),您应该在project-2上执行您的地形,而不是声明您的地形以使用project-1在另一个项目中进行配置。这正是错误告诉您的:)

更新

让我们更准确地说

因此,您可以声明另一个提供程序,这是我更愿意做的,因为我可以准确地知道代码的执行位置和项目,但您也可以尝试在资源中指定项目,就像您在计算实例上所做的那样,用于防火墙规则:

resource "google_compute_firewall" "intacct-firewall" {
  project = "projcet-2"
  name    = "intacct-firewall"
  network = "projects/it-production-186816/global/networks/production"
  allow {
    protocol = "tcp"
    ports    = [ "80" ]
  }
  source_ranges = [ "0.0.0.0/0" ]
  target_tags   = [ "intacct" ]
}

这样做有一个陷阱,您使用的服务帐户应该有权在这两个项目中执行操作。

正确的答案是创建另一个本地模块,用于在主机项目中创建防火墙规则

我们需要看看terraform代码才能正确回答您的帖子,事实上,您应该有多个声明,因为您有多个项目?我没有多个项目。这是一个共享的专有网络。因此,计算实例正在使用其他项目网络。我在原来的帖子中添加了更多细节。我在原来的帖子中添加了更多细节。我只是不确定这听起来是否正确…所以,你提供的例子正是我最初尝试的。。。这导致了我发布的原始错误。抱歉,正如我所看到的,我在一开始是相当模糊的。好吧,如果这不起作用,我给出的第一个解决方案是你最好的选择。为防火墙规则在其他项目上运行创建一个单独的地形你说“创建另一个地形”,但是。。。我们不能有多个提供商。所以我不能使用另一个tf文件。我想我必须有一个单独的模块?即使如此,我也不确定我们是否能有另一家供应商<代码>错误:provider.google:存在多个配置;每个提供程序只允许一种配置使用新的提供程序创建另一个文件夹,并使用此文件夹在第二个项目中执行。。。