标签: terraform

AWS Terraform:通过匹配标签名称中的子字符串来过滤特定子网

我有 6 个子网,我想从中过滤 3 个子网匹配子字符串internal并在 rds 中使用。

标签名称有内部词,并希望以此为基础进行过滤。

有人可以帮我吗?

data "aws_vpc" "vpc_nonprod-sctransportationops-vpc" {
  tags {
    Name = "vpc_nonprod-sctransportationops-vpc"
  }
}
    
data "aws_subnet_ids" "all" {
  vpc_id = "${data.aws_vpc.vpc_nonprod-sctransportationops-vpc.id}"
}
    
output "aws_subnet_ids" {
  value = "${data.aws_subnet_ids.all.ids}"
}
# 6 subnets
# Now look up details for each subnet
     

data "aws_subnet" "filtered_subnets" {
  count = "${length(data.aws_subnet_ids.all.ids)}"
  id    = "${data.aws_subnet_ids.all.ids[count.index]}"

  filter {
    name   = "tag:Name"
    values = ["*internal*"]
  }
}
Run Code Online (Sandbox Code Playgroud)

一些标签名称有internal子串

需要获取标签名称具有内部子字符串的所有子网ID

values = ["*"]6但是,返回IDvalues = ["any …

amazon-web-services terraform

13
推荐指数
2
解决办法
8807
查看次数

在不同订阅下拥有 Terraform azure 状态文件

我在 Azure 中有两个订阅。我们称它们为 sub-dev 和 sub-prod。在 sub-dev 下,我有用于开发的资源(在资源组 rg-dev 中)和用于生产的 sub-prod 资源(在资源组 rg-prod 中)。

现在,我只想为开发和生产只有一个状态文件。我可以这样做,因为我使用 Terraform 工作区(开发和生产)。在 sub-dev (rg-dev) 下有一个名为 tfsate 的存储帐户。它有一个容器等。Azure 后端配置如下:

terraform {
  backend "azurerm" {
    resource_group_name  = "rg-dev"
    storage_account_name = "tfstate"
    container_name       = "tfcontainer"
    key                  = "terraform.tfstate" 
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我想申请开发环境,我必须将 Az Cli 切换到子开发环境。同样,对于生产,我将不得不使用 sub-prod。我使用 az cli 切换默认订阅:

az account set -s sub-prod
Run Code Online (Sandbox Code Playgroud)

问题是状态的存储帐户在 sub-dev 而不是 sub-prod 下。terraform init当默认订阅设置为 sub-prod 时,我会在尝试(或应用)时遇到访问错误。

Error: Failed to get existing workspaces: Error retrieving keys for Storage Account "tfstate": storage.AccountsClient#ListKeys: Failure …
Run Code Online (Sandbox Code Playgroud)

azure terraform terraform-provider-azure

13
推荐指数
2
解决办法
8568
查看次数

Terraform 在应用时从远程 URL 下载本地文件并在销毁时删除文件

在创建实际的 lambda 资源之前,我需要从 URL 下载 lambda 存档文件,并且在运行 terraform destroy 时需要删除该文件。基本上是从远程 URL 创建的本地文件资源。我目前已使用如下所示的配置程序完成此null_resource操作local-exec。但是,当我运行 terraform destroy 时,这不会删除该文件。有没有更好的办法?

resource "null_resource" "lambda_jar" {
  triggers = {
    on_version_change = "${var.lambda_archive_version}"
  }

  provisioner "local-exec" {
    command = "curl -o lambda.jar ${var.server_url}/${var.lambda_archive_version}.jar"
  }
}
Run Code Online (Sandbox Code Playgroud)

terraform

13
推荐指数
1
解决办法
2万
查看次数

将单个配置文件挂载到 ECS 服务上

我有 Kubernetes 背景,正在尝试学习 AWS/ECS。在 Kubernetes 中,您可以使用ConfigMap资源快速轻松地将简单的一次性配置文件挂载到容器上,而无需经历设置卷的所有麻烦。这也使得从 Terraform 配置服务变得非常容易,这正是我正在尝试做的。

AWS ECS 服务是否具有类似于 Kubernetes 配置映射的功能?我只需要最简单的方法在启动时将任意文本文件插入到我的服务中,并且可以使用 Terraform 快速更新。我想避免每次该文件更改时都必须重建整个图像。

这是可能的还是我需要为此创建卷?如果是这样,为此目的最好的卷配置类型是什么?我可以轻松地存储和更新 S3 中的文件,这些只是简单的配置文件,只需要读取访问权限,那么这是仅挂载 S3 存储桶的可接受情况吗?

amazon-web-services amazon-ecs terraform

13
推荐指数
1
解决办法
5359
查看次数

如何使用terraform将ssh密钥添加到GCP实例?

所以我有一个在Google Cloud Platform中创建实例的terraform脚本,我希望能够让我的terraform脚本也将我的ssh密钥添加到我创建的实例中,以便我可以通过ssh配置它们.这是我目前的terraform脚本.

#PROVIDER INFO
provider "google" {
  credentials = "${file("account.json")}"
  project     = "myProject"
  region      = "us-central1"
}


#MAKING CONSUL SERVERS
resource "google_compute_instance" "default" {
  count    =  3
  name     =  "a-consul${count.index}"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  disk {
    image = "ubuntu-1404-trusty-v20160627"
  }

  # Local SSD disk
  disk {
    type    = "local-ssd"
    scratch = true
  }

  network_interface {
    network = "myNetwork"
    access_config {}
  }
}
Run Code Online (Sandbox Code Playgroud)

为了让我的terraform脚本添加我的ssh密钥,我需要添加/Users/myUsername/.ssh/id_rsa.pub什么?

ssh google-cloud-platform terraform

12
推荐指数
5
解决办法
1万
查看次数

创建 aws_db_subnet_group 与 terraform throw 创建数据库子网组时出错:InvalidParameterValue

我正在使用 terraform 创建 RDS 实例,为此我需要有一个aws_db_subnet_group资源。我可以使用 Amazon 网站创建的 aws_db_subnet_group 创建 RDS,但是当我尝试从 terraform 脚本创建 aws_db_subnet_group 时,我收到错误 InvalidParameterValue。

这是地形脚本:

resource "aws_db_subnet_group" "default" {
  name        = "cse-cr"
  description = "Private subnets for RDS instance"
  subnet_ids  = ["subnet-0c8764fcb28b04c8c", "subnet-0ca53ff9b621e2c89"]
}
Run Code Online (Sandbox Code Playgroud)

这是错误:

 Error: Error applying plan:

1 error(s) occurred:

* aws_db_subnet_group.default: 1 error(s) occurred:

* aws_db_subnet_group.default: Error creating DB Subnet Group: InvalidParameterValue: Some input subnets in :[subnet-0ca53ff9b621e2c89, subnet-0c8764fcb28b04c8c] are invalid.
        status code: 400, request id: 66166ec8-9b79-41d3-bdf7-a5cdb66f5f95

Terraform does not automatically rollback in the face …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform

12
推荐指数
1
解决办法
5844
查看次数

在Terraform工作空间之间共享资源

我有要在AWS中使用Terraform部署的基础架构。该基础架构可以部署到我正在使用工作空间的不同环境中。

应该为每个工作区分别创建部署中的大多数组件,但是我希望在它们之间共享几个关键组件,主要是:

  • IAM角色和权限
  • 他们应使用相同的API网关,但每个工作区应部署到不同的路径和方法

例如:

resource "aws_iam_role" "lambda_iam_role" {
  name = "LambdaGeneralRole"
  policy = <...>
}

resource "aws_lambda_function" "my_lambda" {
  function_name = "lambda-${terraform.workspace}"
  role = "${aws_iam_role.lambda_iam_role.arn}"
}
Run Code Online (Sandbox Code Playgroud)

第一个资源是IAM角色,应在该Lambda的所有实例之间共享,并且不应重复创建一次。

第二个资源是Lambda函数,其名称取决于当前工作空间,因此每个工作空间都将部署并跟踪不同Lambda的状态。

如何在不同的Terraform工作空间之间共享资源及其状态?

amazon-web-services terraform devops terraform-provider-aws

12
推荐指数
1
解决办法
1902
查看次数

Terraform AWS EKS ALB Kubernetes Ingress 不会创建侦听器或目标组

我正在尝试使用 Terraform 资源创建一个带有 ALB 入口的 AWS EKS 集群。

该文档表明入口将自动创建一个带有关联侦听器和目标组的负载均衡器。

Kubernetes Ingress 创建 ALB 负载均衡器、安全组和规则,但不创建目标组或侦听器。我曾尝试使用网关或应用程序子网,但没有任何区别。我尝试设置安全组,但 ALB 设置并使用了它自己的自我管理的安全组。

我依赖本指南

ALB 的卷曲让我感到

无法连接到 de59ecbf-default-mainingre-8687-1051686593.ap-southeast-1.elb.amazonaws.com 端口 80:连接被拒绝

我分别创建了 IAM 角色和 ACM 证书,因为 AWS 对这些有配额限制。我的 EKS 集群和节点角色是标准的,节点角色附加了最新的策略。

我曾经kubectl单独应用 kubernetes 入口,但结果相同。它创建 ALB 和一个安全组,其中包含端口规则,但没有目标组或侦听器。

当我将集群端点粘贴aws eks describe-cluster --name my-tf-eks-cluster --query "cluster.endpoint"到浏览器中时,我得到以下信息:

{ "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "forbidden: User "system:anonymous" cannot get path "/ "", "reason": "Forbidden", "details": { }, "code": 403 }

此外,入口没有 IP 地址。 …

terraform kubernetes-ingress terraform-provider-aws amazon-eks

12
推荐指数
1
解决办法
2930
查看次数

aws_acm_certificate 似乎已经改变了它的状态输出,可能是由于提供者更新——我做错了吗?

Terraform v0.12.12
+ provider.aws v3.0.0
+ provider.template v2.1.2
Run Code Online (Sandbox Code Playgroud)

在我这样做之前:

resource "aws_route53_record" "derps" {
  name    = aws_acm_certificate.mycert[0].resource_record_name
  type    = aws_acm_certificate.mycert[0].resource_record_type
  zone_id = var.my_zone_id
  records = aws_acm_certificate.mycert[0].resource_record_value
  ttl     = 60
}
Run Code Online (Sandbox Code Playgroud)

大约一周前,这对我来说效果很好。

我刚刚做了一个计划,却出现了错误:

records = [aws_acm_certificate.mycert.domain_validation_options[0].resource_record_value]

This value does not have any indices.
Run Code Online (Sandbox Code Playgroud)

现在我不固定提供者版本,所以我假设我拉了一个更新的版本并且资源发生了变化。

在与这个斗争并意识到它不是一个列表(即使这样做show state时看起来确实像一个列表)我现在这样做是为了使它成为一个列表:

resource "aws_route53_record" "derps" {
  name    = sort(aws_acm_certificate.mycert.domain_validation_options[*].resource_record_name)[0]
  type    = sort(aws_acm_certificate.mycert.domain_validation_options[*].resource_record_type)[0]
  zone_id = var.my_zone_id
  records = [sort(aws_acm_certificate.mycert.domain_validation_options[*].resource_record_value)[0]]
  ttl     = 60
} 
Run Code Online (Sandbox Code Playgroud)

这导致没有变化,这是好的。但是,如果我使用他们现在使用 for_each 的文档中的示例来执行此操作:https : //registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acm_certificate_validation

resource "aws_route53_record" "example" {
  for_each = {
    for …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-route53 terraform

12
推荐指数
2
解决办法
3180
查看次数

Switch terraform 0.12.6 to 0.13.0 给了我 provider["registry.terraform.io/-/null"] 是必需的,但它已被删除

我在远程 terraform-cloud 中管理状态

我已经下载并安装了最新的 terraform 0.13 CLI

然后我删除了.terraform

然后我跑terraform init了,没有错误

然后我做了

? terraform apply -var-file env.auto.tfvars

Error: Provider configuration not present

To work with
module.kubernetes.module.eks-cluster.data.null_data_source.node_groups[0] its
original provider configuration at provider["registry.terraform.io/-/null"] is
required, but it has been removed. This occurs when a provider configuration
is removed while objects created by that provider still exist in the state.
Re-add the provider configuration to destroy
module.kubernetes.module.eks-cluster.data.null_data_source.node_groups[0],
after which you can remove the provider configuration again.

Releasing state lock. …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws amazon-eks

12
推荐指数
3
解决办法
7379
查看次数