我正在尝试设置 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}\n
Run 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\n
Run 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}\n
Run 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 角色,以更好地实现我的目的。