【问题标题】:Terraform: Cross project referencing not allowedTerraform:不允许跨项目引用
【发布时间】:2019-07-08 04:51:03
【问题描述】:

我看到google_compute_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

找不到任何记录在共享网络上的防火墙规则的内容。我们是否将防火墙添加到本地 VPC 而不是共享 VPC?

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

  network_interface {
    subnetwork         = "${var.subnetwork}"
    subnetwork_project = "${var.vpc_parent}"
    access_config      = {
      nat_ip = "${google_compute_address.dokku.address}"
    }
  }

因此,虽然计算实例位于 project-1,但它使用的网络位于 project-2

编辑:

我的 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" ]
}

为另一个项目使用另一个提供程序配置来添加防火墙规则似乎是错误的。

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

【问题讨论】:

  • 我们需要查看 terraform 代码才能正确回答您的帖子,实际上您应该有多个声明,因为您有多个项目?
  • 我没有多个项目。这是一个共享的 VPC。所以计算实例正在使用其他项目网络。我在原帖中添加了更多细节。

标签: google-cloud-platform terraform


【解决方案1】:

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

如果它是 project-2(因为您在多个项目环境中),您应该在 project-2 上执行您的 terraform,而不是声明您的 terraform 以使用 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 以在其他项目上运行
  • 你说'创建另一个 terraform' 但是......我们不能有多个提供者。所以我不能使用另一个 tf 文件。我想我必须有一个单独的模块?即便如此,我不确定我们是否能够拥有另一个提供商。Error: provider.google: multiple configurations present; only one configuration is allowed per provider
  • 用新的提供者创建另一个文件夹,并使用这个文件夹在第二个项目中执行...
【解决方案2】:

正确的答案是在宿主项目中创建另一个本地模块来创建防火墙规则。

【讨论】:

    【解决方案3】:

    仅列出可能发生此问题Cross project referencing is not allowed for this resource. 的另一种情况!!

    假设您将云 shell 变量配置为使用 tf_project_123,并在您的 providers.tf 中提及您的项目为 tf_project_321。那么就会出现这个问题。

    在我的例子中,我使用的是来自 tf_project_321 项目的谷歌云 shell,并且在我的提供程序文件中使用了 tf_project_123。我所要做的就是更新我的 gcloud 项目详细信息(shell 命令 - gcloud config set project tf_project_123

    向 terraform 工具提供详细信息时,只需确保提供程序的项目详细信息、权限和 shell 变量同步即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2021-03-26
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      相关资源
      最近更新 更多