我正在尝试使用 terraform v0.14.3 部署一个 bitbucket 管道以在谷歌云中创建资源。运行 terraform 命令后,管道失败并显示以下错误:
Error: Invalid legacy provider address
This configuration or its associated state refers to the unqualified provider
"google".
You must complete the Terraform 0.13 upgrade process before upgrading to later
versions.
Run Code Online (Sandbox Code Playgroud)
我们将 terraform 的本地版本更新为 v.0.13.0,然后运行:terraform 0.13upgrade
如本指南中所述:https ://www.terraform.io/upgrade-guides/0-13.html 。生成的 versions.tf 文件需要 terraform 版本 >=0.13,我们所需的提供程序块现在如下所示:
terraform {
backend "gcs" {
bucket = "some-bucket"
prefix = "terraform/state"
credentials = "key.json" #this is just a bitbucket pipeline variable
}
required_providers {
google = { …
Run Code Online (Sandbox Code Playgroud) google_logging_metric
我正在Terraform 中声明资源(使用 version 0.11.14
)
我有以下声明
resource "google_logging_metric" "my_metric" {
description = "Check for logs of some cron job\t"
name = "mycj-logs"
filter = "resource.type=\"k8s_container\" AND resource.labels.cluster_name=\"${local.k8s_name}\" AND resource.labels.namespace_name=\"workable\" AND resource.labels.container_name=\"mycontainer-cronjob\" \nresource.labels.pod_name:\"my-pod\""
project = "${data.terraform_remote_state.gke_k8s_env.project_id}"
metric_descriptor {
metric_kind = "DELTA"
value_type = "INT64"
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使filter
字段多行?
local
变量的存在"${local.k8s_name}
使得它有点具有挑战性。
我对使用 terraform 的 GCP 非常陌生,我想使用集中式工具部署我的所有模块。
有没有什么办法可以去掉每次启用google API的步骤,这样部署就不会中断?
Terraform 有没有办法在尝试创建资源之前检查 Google Cloud 中的资源是否存在?
我想检查作业期间我的 CircleCI CI/CD 管道中是否存在以下资源。我可以访问终端命令、bash 和 gcloud 命令。如果资源确实存在,我想使用它们。如果它们不存在,我想创建它们。我在 CircleCI 的 config.yml 中执行此逻辑,作为我可以访问终端命令和 bash 的步骤。我的目标是在需要时在 GCP 中创建必要的基础设施(资源),否则在创建后使用它们,而不会在 CI/CD 构建中出现 Terraform 错误。
如果我尝试创建已存在的资源,Terraform apply 将导致错误,提示“您已经拥有此资源”,现在我的 CI/CD 作业失败。
下面是描述我想要获取的资源的伪代码。
resource "google_artifact_registry_repository" "main" {
# this is the repo for hosting my Docker images
# it does not have a data source afaik because it is beta
}
Run Code Online (Sandbox Code Playgroud)
对于我的google_artifact_registry_repository资源。我的一种方法是使用数据源块执行 Terraform 应用并查看是否返回值。问题在于 google_artifact_registry_repository 没有数据源块。因此,我必须使用资源块创建此资源一次,之后的每个 CI/CD 构建都可以依赖它的存在。有没有解决方法可以读取它的存在?
resource "google_storage_bucket" "bucket" {
# bucket containing the folder below
}
resource "google_storage_bucket_object" …
Run Code Online (Sandbox Code Playgroud) googleapi:错误403:资源项目shared_vpc_host_name的权限被拒绝。,禁止
我正在尝试使用 Terraform 项目 facotry 模块创建共享 vpc 和服务项目,但我遇到了错误,不确定它是否真的与权限相关。这是我收到的错误
Error: googleapi: Error 403: Permission denied on resource project shared_vpc_host_name., forbidden
on .terraform/modules/project_factory/terraform-google-project-factory-8.1.0/modules/core_project_factory/main.tf line 136, in resource "google_compute_shared_vpc_service_project" "shared_vpc_attachment":
136: resource "google_compute_shared_vpc_service_project" "shared_vpc_attachment" {
Error: Error retrieving IAM policy for compute subnetwork "projects/shared_vpc_host_name/regions/us-central1/subnetworks/10.128.0.0": googleapi: Error 403: Permission denied on resource project shared_vpc_host_name., forbidden
Run Code Online (Sandbox Code Playgroud) google-api google-cloud-platform terraform devops terraform-provider-gcp
我有一个全新的 GCP 帐户,我是该帐户的唯一所有者,这是一个个人/干净的全新项目。
\n我专门使用 terraform 管理基础设施,并尝试创建一个 HTTPS 负载均衡器来将请求路由到固定 ip,然后我想将其转发到我有 web 应用程序的存储桶,我过去通过以下方式设置了这种类型的基础设施UI 但不是通过 terraform。
\n当尝试创建这个基础设施时:
\nresource "google_compute_global_address" "main" {\n name = "main"\n}\n\nresource "google_compute_forwarding_rule" "lb" {\n name = "lb"\n provider = google-beta\n region = "europe-west2"\n project = "owlee-software"\n ip_protocol = "TCP"\n load_balancing_scheme = "EXTERNAL_MANAGED"\n port_range = "443"\n target = google_compute_global_address.main.address\n network_tier = "PREMIUM"\n}\n
Run Code Online (Sandbox Code Playgroud)\n这会抛出
\n\xe2\x94\x82 Response: {\n\xe2\x94\x82 "error": "invalid_grant",\n\xe2\x94\x82 "error_description": "Account has been deleted"\n\xe2\x94\x82 }\n
Run Code Online (Sandbox Code Playgroud)\n对于全新的服务帐户 - 我已删除该帐户并创建了另一个帐户 - 使用另一个文件,如果我删除此资源,则所有内容都会通过 GCP 帐户中的服务帐户进行实例化。这也是我在该项目中拥有的唯一“谷歌测试版”提供商。
\n我不确定这是因为资源配置错误还是服务帐户发生了一些问题。
\n当我尝试检查我刚刚创建并在项目上创建编辑器的服务帐户时,我不能,它显示为灰色,并显示以下文本: …
google-cloud-platform terraform google-iam terraform-provider-gcp gcp-load-balancer
我在 GCP 上设置了一个带有远程后端的 terraform 项目。现在,当我想要部署基础设施时,我遇到了凭据问题。我有一个凭据文件
\home\mike\.config\gcloud\credentials.json
Run Code Online (Sandbox Code Playgroud)
在我的 terraform 项目中,我有以下涉及远程状态的数据:
data "terraform_remote_state" "project_id" {
backend = "gcs"
workspace = "${terraform.workspace}"
config {
bucket = "${var.bucket_name}"
prefix = "${var.prefix_project}"
}
}
Run Code Online (Sandbox Code Playgroud)
我用我的凭据文件的详细信息指定云提供商。
provider "google" {
version = "~> 1.16"
project = "${data.terraform_remote_state.project_id.project_id}"
region = "${var.region}"
credentials = "${file(var.credentials)}"
}
Run Code Online (Sandbox Code Playgroud)
然而,这会遇到
data.terraform_remote_state.project_id: data.terraform_remote_state.project_id:
error initializing backend:
storage.NewClient() failed: dialing: google: could not find default
credentials.
Run Code Online (Sandbox Code Playgroud)
如果我添加
export GOOGLE_APPLICATION_CREDENTIALS=/home/mike/.config/gcloud/credentials.json
Run Code Online (Sandbox Code Playgroud)
我确实让它按预期运行。我的问题是,我想在 terraform 文件中指定凭据,因为我从无法设置环境变量的 python 脚本中以自动方式运行 terraform 命令。如何在不设置环境变量的情况下让 terraform 知道凭据在哪里?
有没有其他方法可以直接使用 terraform 启用这些规则,而无需在 GCP 中创建单独的防火墙规则,然后将标签附加到计算引擎
目前我正在这样做
resource "google_compute_firewall" "allow_http" {
name = "allow-http-rule"
network = "default"
allow {
ports = ["80"]
protocol = "tcp"
}
target_tags = ["allow-http"]
priority = 1000
}
Run Code Online (Sandbox Code Playgroud)
然后使用这个标签
resource "google_compute_instance" "app" {
...
tags = ["allow-http"]
}
Run Code Online (Sandbox Code Playgroud) google-compute-engine google-cloud-platform terraform terraform-provider-gcp
我试图在https://www.terraform.io/docs/providers/google/r/google_service_account_iam.html上了解GCP terraform 提供程序之间google_service_account_iam_binding
和之间的区别。google_service_account_iam_member
我知道 google_service_account_iam_binding 用于向成员列表授予角色,而 google_service_account_iam_member 用于向单个成员授予角色,但是我不清楚这些定义中“权威”和“非权威”的含义:
google_service_account_iam_binding:给定角色的权威。更新 IAM 策略以向成员列表授予角色。服务帐号的 IAM 策略中的其他角色将被保留。
google_service_account_iam_member:非权威。更新 IAM 策略以向新成员授予角色。保留服务帐户角色的其他成员。
谁能为我详细说明一下?
我正在使用 terraform 在 GCP 中构建基础设施。我正在尝试将角色分配给service account
使用 terraform 的人,但无法这样做。下面是我的代码:
sa.tf:
resource "google_service_account" "mojo-terra" {
account_id = "mojo-terra"
description = "Service account used for terraform script"
}
resource "google_project_iam_member" "mojo-roles" {
count = length(var.rolesList)
role = var.rolesList[count.index]
member = "serviceAccount:${google_service_account.mojo-terra.email}"
}
Run Code Online (Sandbox Code Playgroud)
dev.tfvars:
rolesList = [
"roles/iam.serviceAccountUser"
]
Run Code Online (Sandbox Code Playgroud)
云构建日志:
Step #2: Error: Error when reading or editing Resource "project \"poc-dev\"" with IAM Policy: Error retrieving IAM policy for project "poc-dev": googleapi: Error 403: The caller does not have permission, forbidden
Step …
Run Code Online (Sandbox Code Playgroud) google-cloud-platform terraform google-cloud-iam terraform-provider-gcp