标签: terraform-provider-aws

Terraform提供程序/模块中的变量共享

有没有一种方法可以为项目中定义的所有模块抽象提供程序。

例如,我有这个项目

??? modules
?   ??? RDS
?   ??? VPC
??? stacks
    ??? production
    ?   ??? main.tf
    ??? staging
        ??? main.tf
Run Code Online (Sandbox Code Playgroud)

而且工作正常...问题在于模块的定义

??? RDS
?   ??? README.md
?   ??? main.tf
?   ??? providers.tf
?   ??? variables.tf
??? VPC
    ??? README.md
    ??? main.tf
    ??? providers.tf
    ??? variables.tf
Run Code Online (Sandbox Code Playgroud)

这两个模块中的提供者完全相同

# providers.tf
provider "aws" {
  region = "${var.region}"
  version = "~> 1.26"
}
Run Code Online (Sandbox Code Playgroud)

并且每个模块中的变量都不同,但是它们都有region变量。

# variables.tf
variable "region" {
  default     = "eu-central-1"
  description = "AWS region."
}
# other module dependent …
Run Code Online (Sandbox Code Playgroud)

terraform terragrunt terraform-provider-aws

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

在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 import ?

我正在学习 terraform,并希望使用该工具设置 AWS 基础设施。

我们有 3 个 AWS 环境:沙箱、暂存和生产,并且拥有支持这些环境的现有基础设施。例如,我们为每个环境有 3 个独立的 VPC。

我想terraform import根据我尝试设置的环境来导入这些资源的状态。所以我本质上想这样做,虽然我知道这在语法上不正确,但你明白了。

$ terraform import aws_vpc.my_vpc -var 'environment=sandbox'
Run Code Online (Sandbox Code Playgroud)

因此我的模块设置如下

vpc/main.tf
-----------
provider "aws" {
  region = "us-east-1"
}
resource "aws_vpc" "my_vpc" {
  cidr_block = ""
}

vpc/variables.tf
----------------
variable "environment" {
  type map = map(string)
  default {
    sandbox    = "vpc-1234"
    staging    = "vpc-2345"
    production = "vpc-3456"
  }
}
Run Code Online (Sandbox Code Playgroud)

所以这意味着我本质上想做

$ terraform import aws_vpc.my_vpc vpc-1234
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个目标?

terraform terraform-provider-aws

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

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
查看次数

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
查看次数

Terraform 简单脚本显示“错误:启动源实例时出错:VPCIdNotSpecified:此用户没有默认 VPC”

开始使用 Terraform。我正在尝试使用以下 .tf 文件配置 EC2 实例。我在尝试配置 EC2 实例的可用区的账户中已经有一个默认 VPC。

# Terraform Settings Block
 terraform {
      required_providers {
         aws = {
             source  = "hashicorp/aws"
             #version = "~> 3.21" # Optional but recommended in production
        }
     }
 }

  # Provider Block
  provider "aws" {
        profile = "default"
        region  = "us-east-1"
  }

  # Resource Block
  resource "aws_instance" "ec2demo" {
           ami           = "ami-c998b6b2" 
           instance_type = "t2.micro"
  }
Run Code Online (Sandbox Code Playgroud)

我执行以下 Terraform 命令。

  1. 地形初始化
  2. 地形计划
  3. 地形应用

aws_instance.ec2demo:正在创建...

错误:启动源实例时出错:VPCIdNotSpecified:此用户没有默认 VPC。仅 EC2-Classic 和默认 VPC 支持 GroupName。状态代码:400,请求 ID:04274b8c-9fc2-47c0-8d51-5b627e6cf7cc

在 ec2-instance.tf …

terraform terraform-provider-aws

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

如何使用 terraform 添加 lambda 环境变量?

我希望我的 lambda 调用 API,这需要一个 API 令牌。我想将 API 令牌放入 lambda 环境变量中。我怎样才能让 terraform 做到这一点?还是我以错误的方式接近这个?

aws-lambda terraform terraform-provider-aws

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

创建 CloudFront 分配时出错:NoSuchOrigin:

我正在尝试使用 Terraform 部署 Cloudfront 发行版,但在指定 origin_id 时出现错误

Cloudfront 通过 Route53 查找指向负载均衡器。

resource "aws_cloudfront_distribution" "my-app" {
  origin {
    custom_origin_config {
      http_port              = 443
      https_port             = 443
      origin_protocol_policy = "https-only"
      origin_ssl_protocols   = ["TLSv1.2"]
    }

    domain_name = "${var.domain_name}"
    origin_id   = "Custom-${var.domain_name}"
  }

...

  default_cache_behavior {
    allowed_methods  = ["GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "DELETE"]
    cached_methods   = ["GET", "HEAD"]
    target_origin_id = "${local.origin_id}"

...
Run Code Online (Sandbox Code Playgroud)

其中var.domain_name是 route53 记录,local.origin_id是唯一 ID。

执行 terraform apply 时,出现此错误:

aws_cloudfront_distribution.my-app: error creating CloudFront Distribution: NoSuchOrigin: One or more …

amazon-web-services terraform terraform-provider-aws

11
推荐指数
1
解决办法
4573
查看次数

如何在本地变量中存储 Terraform 配置器“local-exec”输出并在“remote-exec”中使用变量值

我正在使用 Terraform proparar。在一种情况下,我需要执行“local-exec”配置并将命令的输出 [这是 IP 地址数组] 用于下一个“远程执行”配置。

而且我无法将“local-exec”临时输出存储在本地变量中以供以后使用。我可以将它存储在本地文件中,但不能存储在中间变量中

count = "${length(data.local_file.instance_ips.content)}" 
Run Code Online (Sandbox Code Playgroud)

这是行不通的。


resource "null_resource" "get-instance-ip-41" {
    provisioner "local-exec" {
         command = "${path.module}\\scripts\\findprivateip.bat  > ${data.template_file.PrivateIpAddress.rendered}"
    }
}


data "template_file" "PrivateIpAddress" {
    template = "/output.log"
}

data "local_file" "instance_ips" {
    filename = "${data.template_file.PrivateIpAddress.rendered}"
    depends_on = ["null_resource.get-instance-ip-41"]
}

output "IP-address" {
    value = "${data.local_file.instance_ips.content}"
}



# ---------------------------------------------------------------------------------------------------------------------
# Update the instnaces by installing newrelic agent using remote-exec
# ---------------------------------------------------------------------------------------------------------------------

resource "null_resource" "copy_file_newrelic_v_29" {

  depends_on = ["null_resource.get-instance-ip-41"]

  count = "${length(data.local_file.instance_ips.content)}"

  triggers = {
    cluster_instance_id …
Run Code Online (Sandbox Code Playgroud)

variables terraform terraform-provider-aws

11
推荐指数
1
解决办法
6504
查看次数

Terraform 如何获取 aws_lb 的 IP 地址

如果有一种方法可以在 Terraform 创建 aws_lb 时获取 aws_lb 资源的分配 IP 地址?

AWS 文档 - NLB - 要找到要列入白名单的私有 IP 地址,我们可以找出与 ELB 关联的 IP 地址。

  1. 通过https://console.aws.amazon.com/ec2/打开 Amazon EC2 控制台。
  2. 在导航窗格中,选择网络接口。
  3. 在搜索字段中,输入您的网络负载均衡器的名称。每个负载平衡器子网有一个网络接口。
  4. 在每个网络接口的详细信息选项卡上,从 Primary private IPv4 IP 复制地址

背景

为了能够设置安全组以将 ELB IP 地址列入白名单,因为网络负载均衡器不能没有安全组,因为网络负载均衡器没有安全组

考虑过aws_network_interface但它不会出现错误。

错误:找不到匹配的网络接口

另外我认为 datasource 假设资源已经存在并且不能用于 Terraform 创建的资源。

amazon-elb terraform terraform-provider-aws

11
推荐指数
3
解决办法
6567
查看次数