标签: terraform-provider-aws

Terraform EKS 标记

我遇到了 Terraform EKS 标记问题,似乎没有找到可行的解决方案来在创建新集群时标记所有 VPC 子网。

提供一些背景信息:我们有一个 AWS VPC,我们将多个 EKS 集群部署到子网中。我们不创建 VPC 或子网是 EKS 集群创建的一部分。因此,创建集群的 terraform 代码无法标记现有子网和 VPC。虽然 EKS 会添加所需的标签,但下次我们在 VPC 上运行 terraform apply 时,它们会自动删除。

我的解决方法是在 VPC 中提供一个 terraform.tfvars 文件,如下所示:

eks_tags = 
 [
 "kubernetes.io/cluster/${var.cluster-1}", "shared", 
 "kubernetes.io/cluster/${var.cluster-2}", "shared",
 "kubernetes.io/cluster/${var.cluster-2}", "shared",
]    
Run Code Online (Sandbox Code Playgroud)

然后在 VPC 和子网资源中,我们执行类似的操作

    resource "aws_vpc" "demo" {
      cidr_block = "10.0.0.0/16"

      tags = "${
        map(
         ${var.eks_tags}
        )
     }"
    }
Run Code Online (Sandbox Code Playgroud)

但是,上面的方法似乎不起作用。我已经尝试了https://www.terraform.io/docs/configuration-0-11/interpolation.html 中的各种 Terraform 0.11 功能,但没有任何帮助。

有没有人能够解决这个问题?

我们总是为每个 EKS 集群创建新的 VPC 和子网的想法是错误的。显然,必须是一种使用 Terraform 标记现有 VPC 和子网资源的方法吗?

terraform terraform-provider-aws amazon-eks

4
推荐指数
2
解决办法
1902
查看次数

terraform 中的“环境中至少有一个字段”错误

当我尝试应用 terraform 以创建 lambda 函数时,出现此错误:

 Error: At least one field is expected inside environment
Run Code Online (Sandbox Code Playgroud)

这是我的 terraform 模块:

resource "aws_lambda_function" "lambda" {
  function_name = var.lambda_filename
  description = var.description
  runtime = "python3.6"
  environment {
    variables = var.variables
  }
}
Run Code Online (Sandbox Code Playgroud)

var.variables设置为空时抛出此错误。

我该如何解决?

我正在使用 terraform 0.12.6 和 aws provider 2.25.0

terraform terraform-provider-aws terraform0.12+

4
推荐指数
1
解决办法
1622
查看次数

Terraform:将变量从一个模块传递到另一个模块

我正在为 AWS VPC 创建创建一个 Terraform 模块。

这是我的目录结构

?  tree -L 3
.
??? main.tf
??? modules
?   ??? subnets
?   ?   ??? main.tf
?   ?   ??? outputs.tf
?   ?   ??? variables.tf
?   ??? vpc
?       ??? main.tf
?       ??? outputs.tf
?       ??? variables.tf
??? variables.tf

3 directories, 12 files
Run Code Online (Sandbox Code Playgroud)

在子网模块中,我想获取 vpc(子)模块的 vpc id。

modules/vpc/outputs.tf我使用:

output "my_vpc_id" {
  value = "${aws_vpc.my_vpc.id}"
}
Run Code Online (Sandbox Code Playgroud)

这对我做以下事情就足够了modules/subnets/main.tf吗?

resource "aws_subnet" "env_vpc_sn" {
   ...
   vpc_id                  = "${aws_vpc.my_vpc.id}"
}
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform-provider-aws

4
推荐指数
1
解决办法
3900
查看次数

Terraform 0.12 aws_lambda_permission 资源替换了每个应用

我在 Terraform v0.12 模块中动态创建以下资源:

变量.tf:

variable "stages" {
  type = list(string)
  default = ["v1", "v2"]
}

variable "rest_api_id" {
  description = "The ID of the associated REST API"
}

variable "api_root_resource_id" {
  description = "The API resource ID"
}

variable "region" {
  description = "The AWS region"
}

variable "method" {
  description = "The HTTP method"
  default     = "GET"

variable "lambda" {
  description = "The lambda name to invoke"
}

variable "account_id" {
  description = "The AWS account ID"
} …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform-provider-aws

4
推荐指数
1
解决办法
1463
查看次数

从 terraform 中的安全组名称中提取安全组 ID

我正在尝试在 terraform 中编写一个通用脚本来创建 ALB(在 AWS 中)。安全组已创建 (sg_alb) 但不在同一脚本中。它是预先创建的,我想提取安全组的 id 并将其传递给 security_groups = ["${aws_security_group.lb_sg.id}"]

我看过上面提到的例子,但假设安全组是与 ALB 一起创建的

我怎样才能做到这一点?

谢谢库马尔

amazon-web-services terraform-provider-aws

4
推荐指数
1
解决办法
2096
查看次数

Terraform 似乎不接受手动更改

我有一个非常令人沮丧的 Terraform 问题,我对我的 terraform 脚本进行了一些更改,但在应用该计划时失败了。我经历了一堆阴谋,可能使情况变得更糟,因为我最终手动删除了一堆 AWS 资源来尝试解决这个问题。
所以现在我根本无法使用 Terraform(刷新、计划、销毁)都得到相同的错误。

情况

我有一个 Fargate 服务列表,以及一组关联 Fargate 服务不同功能的地图,例如负载均衡器的“目标组”(我在下面提供了一些代码)。问题似乎是 Terraform 没有发现这些资源已被手动删除,或者因为它们不存在而不知何故变得混乱。此时,如果我运行刷新、计划或销毁,我会收到一个错误,指出特定列表为空,即使它不是(或不应该是)。
在失败的运行中,我在下面的列表中添加了一个新服务以及一个新的 url(参见下面的代码)

客观的

在这一点上,我会满足于破坏整个环境(这是我的开发环境),但是;理想情况下,我只想让系统正常工作,以便 Terraform 能够检测到更改并正常工作。

Terraform 脚本有效

我已将我的 Terraform 脚本恢复到最后一个已知的良好版本。我已经在我们的临时环境中运行了好的版本,它运行良好。

配置信息

MacOS 莫哈韦沙漠 10.14.6 (18G103)

Terraform v0.12.24。

  • provider.archive v1.3.0
  • provider.aws v2.57.0
  • provider.random v2.2.1
  • provider.template v2.1.2

Terraform 状态文件存储在 S3 存储桶中,并terraform init --reconfigure已被调用。

我所做的

我最初遇到类似的错误,但它位于不同的位置,经过几个小时的谷歌搜索和尝试(我没有写下来),我决定手动删除与有问题的代码(ALB、目标组)相关的 AWS 资源, 安全组)

Terraform 脚本示例

不幸的是,我无法发布实际的脚本,因为它是私人的,但我已经发布了我认为相关的部分,但已编辑了一些信息。我提到这一点的原因是您可能会看到的任何语法类型错误都是由这种编辑引起的,正如我上面所说的,脚本在我们的登台环境中运行时可以正常工作。

全局变量.tf

在根目录中。在 Terraform 运行失败的情况下,我向service_names( edd = "edd") 列表添加了一个新名称(我添加为第一个元素)。在service_name_map_2_url我添加了新条目 ( edd = "edd") 作为最后一个条目。我不确定我以不同的“顺序”添加这些元素的事实是否是问题,尽管它确实不应该,因为我通过名称而不是索引访问地图 …

terraform terraform-provider-aws

4
推荐指数
1
解决办法
2531
查看次数

Terraform API Gateway HTTP API - 获取错误 Insufficient permissions to enable logging

我用于部署 HTTP API 的 terraform 脚本如下所示。运行此程序时出现以下错误 -

创建 API Gateway v2 阶段时出错:BadRequestException:权限不足,无法启用日志记录

我需要添加其他东西才能使它工作吗?

resource "aws_cloudwatch_log_group" "api_gateway_log_group" {
  name              = "/aws/apigateway/${var.location}-${var.custom_tags.Layer}-demo-publish-api"
  retention_in_days = 7
  tags = var.custom_tags
}

resource "aws_apigatewayv2_api" "demo_publish_api" {
  name = "${var.location}-${var.custom_tags.Layer}-demo-publish-api"
  description = "API to publish event payloads"
  protocol_type = "HTTP"
  tags = var.custom_tags
}

resource "aws_apigatewayv2_vpc_link" "demo_vpc_link" {
  name = "${var.location}-${var.custom_tags.Layer}-demo-vpc-link"
  security_group_ids = local.security_group_id_list
  subnet_ids = local.subnet_ids_list
  tags = var.custom_tags
}

resource "aws_apigatewayv2_integration" "demo_apigateway_integration" {
  api_id           = aws_apigatewayv2_api.demo_publish_api.id
  integration_type = "HTTP_PROXY"
  connection_type = "VPC_LINK"
  integration_uri = …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

4
推荐指数
2
解决办法
1057
查看次数

如何让 Terraform 读取 AWS 凭证文件?

我正在尝试使用 terraform 创建一个 AWS S3 存储桶,这是我的代码:

provider "aws" {
  profile = "default"
  region  = "ap-south-1"
}

resource "aws_s3_bucket" "first_tf" {
  bucket = "svk-pl-2909202022"
  acl    = "private"
}
Run Code Online (Sandbox Code Playgroud)

我使用记事本手动创建了“凭据”文件,并使用 Powershell 删除了“.txt”扩展名并将该文件存储在C:\Users\terraform\.aws.

[default]
aws_access_key_id=**************
aws_secret_access_key=************
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行时terraform plan,我收到一个错误消息

错误:配置 Terraform AWS Provider 时出错:找不到 Terraform AWS Provider 的有效凭证源

然后,我还尝试通过安装 AWS CLI 创建“凭据”文件,我运行了命令

aws configure --profile terraform
Run Code Online (Sandbox Code Playgroud)

terraform我的用户名在哪里。所以,它要求我输入aws_access_key_idaws_secret_access_key。输入所有凭据后,我运行了命令terraform init,该命令运行成功,但是当我运行时terraform plan,它再次显示错误,内容为:

错误:配置 Terraform AWS Provider 时出错:找不到 Terraform AWS Provider 的有效凭证源

amazon-s3 amazon-web-services terraform-provider-aws terraform-aws-modules aws-credentials

4
推荐指数
2
解决办法
6214
查看次数

Terraform 映射到字符串值

如何使用 Terraform12 将地图变量解析为资源值中的字符串?

我有这个变量:

variable "tags" {
  type                = map
  default = {
    deployment_tool   = "Terraform"
    code              = "123"
  }
}
Run Code Online (Sandbox Code Playgroud)

并且想要这个:{deployment_tool=Terraform, code=123}

我尝试了以下但没有成功:

resource "aws_ssm_parameter" "myparamstore" {
  ***
  value = {
    for tag in var.tags:
      join(",",value, join("=",tag.key,tag.values))
  }
}
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform-provider-aws

4
推荐指数
2
解决办法
1679
查看次数

在 Terraform 上的 aws_iam_policy 资源上包含标签

我正在尝试按照Terraform 文档创建策略

resource "aws_iam_policy" "policy" {
  name        = "test_policy"
  path        = "/"
  description = "My test policy"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "ec2:Describe*",
        ]
        Effect   = "Allow"
        Resource = "*"
      },
    ]
  })
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有关于如何包含标签的描述。即使我可以从 AWS 管理控制台手动提供,我也无法像使用其他资源那样完成它。

tags设置似乎不起作用。如果我尝试对IAM 角色执行相同操作,则会收到错误消息,包括:

  tags = {
    tag-key = "tag-value"
  }
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-iam terraform terraform-provider-aws aws-policies

4
推荐指数
1
解决办法
355
查看次数