我正在尝试设置 Terraform 以与 GCP 一起使用,但在从 gcloud cli 创建新项目时遇到问题:Terraform Lab
我正在使用的命令是
gcloud projects create testproject
Run Code Online (Sandbox Code Playgroud)
我一遍又一遍的错误是:
ERROR: (gcloud.projects.create) Project creation failed. The project ID you specified is already in use by another project. Please try an alternative ID.
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所做的:
这是我尝试从“gcloud init”命令创建新项目时遇到的错误:
Enter …Run Code Online (Sandbox Code Playgroud) google-cloud-platform gcloud terraform terraform-provider-gcp
我已经用 Terraform 创建了一个 GKE 集群,我也想用 Terraform 管理 Kubernetes。但是,我不知道如何将 GKE 的凭据传递给kubernetes提供者。
我按照数据源文档中的示例进行操作google_client_config,我得到了
data.google_container_cluster.cluster.endpoint为空
这是我失败的尝试https://github.com/varshard/gke-cluster-terraform/tree/title-terraform
cluster.tf 负责创建一个 GKE 集群,工作正常。
kubernetes.tf 负责管理Kubernetes,未能获得GKE凭证。
kubernetes google-kubernetes-engine terraform terraform-provider-gcp
我正在尝试使用 Terraform从 Google Sheets 摄取数据创建 BQ 表,这里是我的external_data_configuration块
resource "google_bigquery_table" "sheet" {
dataset_id = google_bigquery_dataset.bq-dataset.dataset_id
table_id = "sheet"
external_data_configuration {
autodetect = true
source_format = "GOOGLE_SHEETS"
google_sheets_options {
skip_leading_rows = 1
}
source_uris = [
"https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxx",
]
}
Run Code Online (Sandbox Code Playgroud)
我将文件设为公开,但是当我尝试创建表时出现错误:
错误:googleapi:错误 400:读取表格时出错:工作表,错误消息:无法读取电子表格。错误:未找到具有 Google Drive 范围的 OAuth 令牌。,无效
我阅读了 Terraform文档,似乎我需要在我的provider.tf文件中指定access_token和scopes我只是不知道该怎么做,因为我认为它会与我当前的身份验证方法(服务帐户)冲突
将 scopes 参数添加到您的provider.tf
provider "google" {
credentials = "${file("${var.path}/secret.json")}"
scopes = ["https://www.googleapis.com/auth/drive","https://www.googleapis.com/auth/bigquery"]
project = "${var.project_id}"
region = "${var.gcp_region}"
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 required_providers 中以新的方式设置我的提供程序的版本,如下所示
\nterraform {\n required_providers {\n cloudflare = {\n source = "cloudflare/cloudflare"\n version = "~> 2.11.0"\n }\n google = {\n source = "hashicorp/google"\n version = "~> 3.39.0"\n }\n kubernetes = {\n source = "hashicorp/kubernetes"\n version = "~> 1.13.2"\n }\n vault = {\n source = "hashicorp/vault"\n version = "~> 2.14.0"\n }\n }\n required_version = "~> 0.13.2"\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当我运行时,terraform init我仍然得到以下输出。
The following providers do not have any version constraints in configuration,\nso the …Run Code Online (Sandbox Code Playgroud) 我的队友正在使用 terraform v0.12.28,我开始与他一起工作,但我使用的是 v0.13.x 并做了一些更改,我们使用存储在 GCS 存储桶中的状态文件。
现在我的队友让我降级,因为他写了一些与v0.12.28兼容的模块,我确实降级了我的版本,但远程状态仍然是v0.13.x。
现在我们陷入了具有更高版本的远程状态。解决这个问题最安全的方法是什么?我们处于初始阶段,因此我们可以破坏整个基础设施,但仍然想知道解决方法。
如何将 terraform 输出分配给环境变量?
假设我在main.tf中定义了以下输出
output "gce_public_ip" {
value = element(concat(google_compute_instance.vm_instance.*.network_interface.0.access_config.0.nat_ip, list("")), 0)
}
Run Code Online (Sandbox Code Playgroud)
我想导出gce_public_ip,因此它将作为环境变量提供GCE_PUBLIC_IP
我一直在使用 kubernetes 入口配置文件来分配 GCP 创建的静态外部 IP 地址。入口和部署由 GKE 管理。
入口.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: test-address
spec:
backend:
serviceName: test-service
servicePort: 80
Run Code Online (Sandbox Code Playgroud)
使用此 yaml 文件,已创建的静态 IP 地址已成功附加到入口。
在 VPC 网络上的外部 IP 地址菜单上,该 IP 已被转发规则使用。
Name External Address Region Type Version In use by
test-address 12.34.56.78 asia-northeast2 Static IPv4 Forwarding rule k8s2-ab-blablablabla
然而,最近我尝试测试 Terraform 将基础设施部署到 GCP,并制作了一个与上述 ingress.yaml 完全相同的 Terraform 配置文件。
入口.tf
resource "kubernetes_ingress" "test_ingress" {
metadata {
name = "test-ingress"
annotations = {
"kubernetes.io/ingress.global-static-ip-name" = "test-address"
} …Run Code Online (Sandbox Code Playgroud) kubernetes terraform kubernetes-ingress terraform-provider-gcp
请帮助了解如何使用 Terraform 启用 GCP IAM API。
\n$ terraform --version\nTerraform v1.0.4\non linux_amd64\n+ provider registry.terraform.io/hashicorp/google v4.6.0\n+ provider registry.terraform.io/hashicorp/time v0.7.2\nRun Code Online (Sandbox Code Playgroud)\nresource "google_project_service" "iam" {\n project = data.google_project.project.project_id\n service = "iam.googleapis.com"\n timeouts {\n create = "20m"\n update = "20m"\n }\n disable_dependent_services = false\n disable_on_destroy = false\n}\nRun Code Online (Sandbox Code Playgroud)\n运行terraform apply但它不断重复错误消息。
Error: Error creating service account: googleapi: Error 403: Identity and Access Management (IAM) API has not been used in project 450605631931 before or it …Run Code Online (Sandbox Code Playgroud) 在GCP上,我尝试使用下面的Terraform代码启用“身份和访问管理(IAM)API”:
provider "google" {
credentials = file("myCredentials.json")
project = "myproject-173831"
region = "asia-northeast1"
}
resource "google_project_service" "project" {
service = "iam.googleapis.com"
}
Run Code Online (Sandbox Code Playgroud)
但我收到了这个错误:
读取或编辑 Project Service 时出错:请求
List Project Services myproject-173831返回错误:无法列出项目 myproject-173831 启用的服务:googleapi:错误 403:列出使用者容器服务的权限被拒绝 [projects/335478934851]
然后我就无法启用它
所以现在,我尝试添加一个角色来解决上面的这个错误,但是有太多角色可供选择:
我需要选择什么角色?
google-cloud-platform terraform devops google-cloud-iam terraform-provider-gcp
嗨,地球伙伴们
我想自动化 Google Cloud Platform 上服务帐号和用户的角色分配流程。我实际上正在考虑创建 IAM 自定义角色,以获得不同服务的细粒度角色 terraform 资源,并将该角色分配给我想要的用户或服务帐户。
检查关联哪些成员将获得哪些角色的方式,我实际上想知道使用 google_project_iam_binding和使用google_project_iam_member资源之间有什么区别。
我目前的理解可能在于使用google_project_iam_binding向服务帐户和用户帐户授予角色google_project_iam_member,但我不确定,因为在文档中它们使用两者来关联用户帐户。
我还发现这篇有趣的文章https://binx.io/nl/2021/12/16/how-to-name-your-google-project-iam-resources-in-terraform/
如您所知,Terraform 中的 Google IAM 资源分为三种类型:
- google_project_iam_policy为项目定义完整的政策。
- google_project_iam_binding定义单个角色的所有成员。
- google_project_iam_member为单个主体定义单个角色绑定。
我不知道前一句话,我想深入了解如何使用策略和 IAM 角色,以更好地实现我的目的。