我在使用 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
我需要以 ["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
我想知道是否可以知道用户数据中的脚本何时完全执行?
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
我定义了许多子网资源:
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。
我正在账户的每个 AWS 区域中部署 Lambda 函数,但遇到了奇怪的问题:某些 AWS 区域的应用失败并显示以下错误消息
\nTerraform 应用时出错
\nError: 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}\nRun Code Online (Sandbox Code Playgroud)\n上述 Lambda 函数刚刚由失败的同一个 Terraform Apply 创建。
\nterraform plan 和 init 不会抛出任何有关 TF 配置问题的错误。
\nplan 和 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\nRun Code Online (Sandbox Code Playgroud)\n下面是我的providers.tf文件
provider "aws" {\n region = "us-east-1"\n version = "3.9.0"\n}\nprovider "aws" {\n …Run Code Online (Sandbox Code Playgroud) 我有 EC2 实例与 Web 应用程序一起运行,这是我的 POC 环境计算机。这个实例是通过 terraform 自动化的,但是当我不需要它时它一直在运行,如果我不想使用它,我想编写 terraform 脚本来关闭这台机器,这样我就可以节省成本。
bash amazon-ec2 amazon-web-services terraform terraform-provider-aws
我想知道如何将 terraform 表达式分成多行,因为它们有时在 1 行中太长。
$ 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.
有没有办法将一个表达式分成多行?
正如您在下面看到的,我尝试将特定的提供程序传递给模块,然后该模块将其作为主提供程序传递(aws = aws.some_profile)给第二个嵌套模块。
我收到terraform plan以下错误:
Error: missing provider module.module_a.provider["registry.terraform.io/hashicorp/aws"].some_profile
我一定是犯了一些基本错误,或者假设该语言以一种它不工作的方式工作。有想法吗?
\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\nRun Code Online (Sandbox Code Playgroud)\nmain.tf(顶层):
\nmodule "module_a" {\n source = "./module_a"\n providers = {\n aws.some_profile = aws.some_profile\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nmain.tf(在 module_a 内):
\nmodule "module_b" {\n source = "./module_b"\n providers = {\n aws = aws.some_profile\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nmain.tf(模块 b 内部):
\nresource "null_resource" "null" {}\nRun Code Online (Sandbox Code Playgroud)\n提供商.tf:
\nterraform {\n required_providers {\n …Run Code Online (Sandbox Code Playgroud) 使用 terraform 或 eksctl 生成新的 AWKS EKS 集群有什么好处吗?
与另一种相比,是否有一些长期维护的好处?
我正在尝试在 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
terraform ×10
amazon-ec2 ×2
amazon-eks ×2
amazon-s3 ×1
bash ×1
eksctl ×1
kubernetes ×1
syntax ×1