标签: terraform-provider-aws

使用 terraform 部署 EKS 节点组时出错

我在使用 Terraform 部署 EKS 集群中的节点组时遇到问题。该错误看起来像是一个插件有问题,但我不知道如何解决它。

如果我在 AWS 控制台(Web)中看到 EC2,我可以看到集群的实例,但集群中出现此错误。

该错误显示在我的管道中:

错误:等待 EKS 节点组 (UNIR-API-REST-CLUSTER-DEV:node_sping_boot) 创建:NodeCreationFailure:实例未能加入 kubernetes 集群。资源 ID:[i-05ed58f8101240dc8]
在 EKS.tf 第 17 行,资源“aws_eks_node_group”“nodes”中:
17:资源“aws_eks_node_group”“nodes”
2020-06-01T00:03:50.576Z [DEBUG]插件:插件进程退出:路径=/home/ubuntu/.jenkins/workspace/shop_infraestucture_generator_pipline/shop-proyect-dev/.terraform/plugins/linux_amd64/terraform-provider-aws_v2.64.0_x4 pid=13475
2020-06-01T00:03:50.576Z [DEBUG]插件:插件已退出

并且错误打印在AWS控制台中:

关联

这是我用来创建项目的 Terraform 中的代码:

EKS.tf用于创建集群和节点

resource "aws_eks_cluster" "CLUSTER" {
  name     = "UNIR-API-REST-CLUSTER-${var.SUFFIX}"
  role_arn = "${aws_iam_role.eks_cluster_role.arn}"
  vpc_config {
    subnet_ids = [
      "${aws_subnet.unir_subnet_cluster_1.id}","${aws_subnet.unir_subnet_cluster_2.id}"
    ]
  }
  depends_on = [
    "aws_iam_role_policy_attachment.AmazonEKSWorkerNodePolicy",
    "aws_iam_role_policy_attachment.AmazonEKS_CNI_Policy",
    "aws_iam_role_policy_attachment.AmazonEC2ContainerRegistryReadOnly",
  ]
}


resource "aws_eks_node_group" "nodes" {
  cluster_name    = "${aws_eks_cluster.CLUSTER.name}"
  node_group_name = "node_sping_boot"
  node_role_arn   = "${aws_iam_role.eks_nodes_role.arn}" …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services kubernetes terraform terraform-provider-aws amazon-eks

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

在 terraform 中连接字符串和列表变量

我需要以 ["0.0.0.0/23","0.0.0.1/23",...] 等形式将 cidr 块列表传递给模块。

我有两个从子网数据源获取的 cidr 块,我可以将其作为示例引用:

cidr_blocks = [data.aws_subnet.subnet1.id,data.aws_subnet.subnet2.id]
Run Code Online (Sandbox Code Playgroud)

我还有一个变量,根据环境,有一个特定的 cidr_blocks 列表要传入,设置为例:

custom_cidrs = [""0.0.0.0/23","0.0.0.1/23","0.0.0.2/23"]
Run Code Online (Sandbox Code Playgroud)

我想要做的是在模块中,将所有这些 cidr 连接在一起以创建一个列表。我尝试了一些不同的方法,包括 concat 和 list()。我只是无法正确理解语法。

对于某些情况,它们不会设置自定义 cidr 块,只有子网 cidrs,因此在这种情况下,我的自定义 cidr 将设置为:

custom_cidrs = []
Run Code Online (Sandbox Code Playgroud)

任何有关如何将两个输出和自定义列表合并为一个输出的帮助将不胜感激。

我想我可能必须首先从两个输出创建一个列表,然后将两个列表连接在一起,但并不完全确定。我可以用一个命令来完成吗?

我正在使用 terraform 版本 0.12.28

terraform terraform-provider-aws

6
推荐指数
1
解决办法
8318
查看次数

有没有办法确认 user_data 使用 Terraform for EC2 成功运行?

我想知道是否可以知道用户数据中的脚本何时完全执行?

data "template_file" "script" {
  template = file("${path.module}/installing.sh")
}

data "template_cloudinit_config" "config" {
  gzip          = false
  base64_encode = false

  # Main cloud-config configuration file.
  part {
    filename     = "install.sh"
    content      = "${data.template_file.script.rendered}"
  }
}

resource "aws_instance" "web" {
  ami           = "ami-04e7b4117bb0488e4"
  instance_type = "t2.micro"
  key_name = "KEY"
  vpc_security_group_ids = [aws_default_security_group.default.id]
  subnet_id = aws_default_subnet.default_az1.id
  associate_public_ip_address = true
  iam_instance_profile = "Role_S3"
  user_data = data.template_cloudinit_config.config.rendered
  tags = {
    Name = "Terraform-Ansible"
  }
}
Run Code Online (Sandbox Code Playgroud)

在脚本的内容中我有这个。它告诉我 Terraform 成功应用了更改,但脚本仍在运行,有没有办法可以监控它?

#!/usr/bin/env bash
exec > >(tee /var/log/user-data.log|logger -t …
Run Code Online (Sandbox Code Playgroud)

amazon-ec2 amazon-web-services terraform terraform-provider-aws

6
推荐指数
1
解决办法
4240
查看次数

Terraform 从使用 count 创建的资源中获取 ID 列表

我定义了许多子网资源:

resource "aws_subnet" "my_subnets" {
  count = 8
  cidr_block = cidrsubnet(var.cidr_block, 3, count.index)
  vpc_id = var.vpc
}
Run Code Online (Sandbox Code Playgroud)

然后,我必须将这些子网 ID 的列表传递给另一个资源。我知道 ID 可以在 上访问aws_subnet.my_subnets[count].id,但是如何循环遍历这些 ID 并将所有值附加到列表中以便将其传递给其他资源?我看到的建议是标记子网,然后使用数据属性来查找这些子网,它们将以列表格式返回,但我在资源的输出上有 ID。

terraform terraform-provider-aws

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

Terraform 创建 Lambda 函数时出错:ResourceConflictException 与 Terraform apply 刚刚创建的资源有关

我正在账户的每个 AWS 区域中部署 Lambda 函数,但遇到了奇怪的问题:某些 AWS 区域的应用失败并显示以下错误消息

\n

Terraform 应用时出错

\n
Error: Error creating Lambda function: ResourceConflictException: Function already exist: log-forwarder\n{\n  RespMetadata: {\n    StatusCode: 409,\n    RequestID: "8cfd7260-7c4a-42d2-98c6-6619c7b2804f"\n  },\n  Message_: "Function already exist: log-forwarder",\n  Type: "User"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

上述 Lambda 函数刚刚由失败的同一个 Terraform Apply 创建。

\n

terraform plan 和 init 不会抛出任何有关 TF 配置问题的错误。

\n

plan 和 init 均成功运行。

\n

下面是我的目录结构

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 log_forwarder.tf\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 log_forwarder_lambdas\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 providers.tf\n
Run Code Online (Sandbox Code Playgroud)\n

下面是我的providers.tf文件

\n
provider "aws" {\n  region  = "us-east-1"\n  version = "3.9.0"\n}\nprovider "aws" {\n …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

6
推荐指数
1
解决办法
9428
查看次数

如何通过 terraform 停止/开始运行 ec2 实例

我有 EC2 实例与 Web 应用程序一起运行,这是我的 POC 环境计算机。这个实例是通过 terraform 自动化的,但是当我不需要它时它一直在运行,如果我不想使用它,我想编写 terraform 脚本来关闭这台机器,这样我就可以节省成本。

bash amazon-ec2 amazon-web-services terraform terraform-provider-aws

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

有什么方法可以将 terraform 的表达式分成多行吗?

我想知道如何将 terraform 表达式分成多行,因为它们有时在 1 行中太长。

  • 我使用的terraform版本
$ terraform version
Terraform v0.14.2
Run Code Online (Sandbox Code Playgroud)
  • 长表达式示例:如果未指定存储桶名称,则创建新的存储桶名称。如果指定,请使用它。
locals {
  bucket_name = var.bucket_name == "" ? "hoge-${formatdate("YYYYMMDDHHmmss", timestamp())}" : var.bucket_name
}
Run Code Online (Sandbox Code Playgroud)
  • 我想更改示例表达式,如下所示
locals {
  bucket_name = var.bucket_name == "" ? \
                "hoge-${formatdate("YYYYMMDDHHmmss", timestamp())}" : \
                 var.bucket_name
}

Run Code Online (Sandbox Code Playgroud)

但这引发了Error: Invalid expression.

有没有办法将一个表达式分成多行?

amazon-web-services terraform terraform-provider-aws

6
推荐指数
1
解决办法
616
查看次数

缺少 Terraform 提供程序?我究竟做错了什么?(地形 v0.13.5)

正如您在下面看到的,我尝试将特定的提供程序传递给模块,然后该模块将其作为主提供程序传递(aws = aws.some_profile)给第二个嵌套模块。

\n

我收到terraform plan以下错误:

\n

Error: missing provider module.module_a.provider["registry.terraform.io/hashicorp/aws"].some_profile

\n

我一定是犯了一些基本错误,或者假设该语言以一种它不工作的方式工作。有想法吗?

\n

文件结构:

\n
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 module_a\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module_b\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 providers.tf\n
Run Code Online (Sandbox Code Playgroud)\n

main.tf(顶层):

\n
module "module_a" {\n    source = "./module_a"\n    providers = {\n        aws.some_profile = aws.some_profile\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

main.tf(在 module_a 内):

\n
module "module_b" {\n    source = "./module_b"\n    providers = {\n        aws = aws.some_profile\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

main.tf(模块 b 内部):

\n
resource "null_resource" "null" {}\n
Run Code Online (Sandbox Code Playgroud)\n

提供商.tf:

\n
terraform {\n  required_providers {\n …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws terraform0.12+

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

从头开始 AWS EKS - terraform 还是 eksctl?

使用 terraform 或 eksctl 生成新的 AWKS EKS 集群有什么好处吗?

与另一种相比,是否有一些长期维护的好处?

terraform terraform-provider-aws amazon-eks eksctl

6
推荐指数
1
解决办法
2542
查看次数

Terraform 错误:引用未声明的资源

我正在尝试在 terraform 中运行跨区域的 s3 复制。我的大部分代码都很好,但我只收到两个我似乎无法解决的错误。

我的主要 s3.tf 的一部分是

resource "aws_kms_key" "s3_replica-us-west-2" {
  description             = "S3 master key replica us-west-2"
  deletion_window_in_days = 30
  enable_key_rotation     = "true"
}

module "s3_replica" {
  source = "git@github.com:xxx"

  providers = {
    aws     = "aws.us-west-2"
  }

  name                  = "s3_replica"
  logging_bucket_prefix = "s3_replica"
  versioning            = var.versioning
  bucket_logging        = var.bucket_logging
  logging_bucket_name   = var.logging_bucket_name

  kms_key_id    = aws_kms_key.s3_replica-us-west-2.key_id
  sse_algorithm = var.sse_algorithm
}

module "s3" {
  source                = "git@github.com:xxxx"
  name                  = "s3"
  logging_bucket_prefix = "s3"
  versioning            = var.versioning
  bucket_logging        = var.bucket_logging
  logging_bucket_name …
Run Code Online (Sandbox Code Playgroud)

syntax amazon-s3 amazon-web-services terraform terraform-provider-aws

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