amazon-web-services - Terraform 数据结构:对象和对象列表
问题描述
我正在尝试使用 terraform 创建一些 aws 资源。这是我的问题:
我正在创建一些变量,所以我可以从资源中访问它们。这是variables.tf文件的内容:
变量.tf
variable "zones" {
type = "list"
default = ["us-east-1a", "us-east-1b"]
}
variable "init" {
type = object({
vpc-id=list(string),
public-subnet=string,
aws_region=string,
ami=string,
vpc-sec-group= list(string)
})
param = {
vpc-id = ["vpc-1111111"]
public-subnet = "subnet-98e4567"
aws_region = "${element(var.zones,0)}"
ami = "ami-09d95fab7fff3776c",
vpc-sec-group = ["sg-d60bf3f5"]
}
}
variable "instances" {
type = list(object({ type=string, count=string, tags=map(string) }))
t2-micro ={
type = "t2.micro"
count = 4
tags = { Name = "Test T2"}
}
m4-large ={
type = "m4-large"
count = 2
tags = { Name = "Test M4"}
}
}
我的计划是使用这些变量来创建一些 ec2 实例,所以这里是ec2.tf
ec2.tf
resource "aws_instance" "Test-T2" {
type = lookup(var.insts["t2-micro"],"type")
ami = lookup(var.init.ami["ami"],var.init.aws_region["aws_region"] )
count = lookup(var.insts["t2-micro"],"count")
tags = lookup(var.insts["t2-micro"],"tags")
key_name = aws_key_pair.terraform-demo.key_name
vpc_security_group_ids = toset(lookup(var.init, "vpc-sec-group"))
subnet_id = lookup(var.init.params["public-subnet"])
}
问题
当我执行
terraform init
我收到以下错误:
Error: Unsupported argument
on variables.tf line 26, in variable "instances":
26: t2-micro ={
An argument named "t2-micro" is not expected here.
Error: Unsupported argument
on variables.tf line 32, in variable "instances":
32: m4-large ={
An argument named "m4-large" is not expected here.
Terraform has initialized, but configuration upgrades may be needed.
Terraform found syntax errors in the configuration that prevented full
initialization. If you've recently upgraded to Terraform v0.12, this may be
because your configuration uses syntax constructs that are no longer valid,
and so must be updated before full initialization is possible.
有人可以帮我纠正这些错误吗?
更多细节和我采取的一些行动
据我所知,我尝试了不同的方法来创建变量,但遵循 Terraform 文档无济于事。
我只是在模仿 Python:
- 对象列表(字典列表)和
- 一个东西
这是我的 terraform 版本
terraform -v
Terraform v0.12.26
+ provider.aws v2.65.0
更多细节
我将最新版本的 Visual Studio Code 1.45.1 与 Terraform 模块 HashiCop 1.4.0 一起用于“Hashicorp 的 Terraform 的语法突出显示、检查、格式化和验证”
解决方案
You need to separate your variable declarations and assignments. Those cannot co-exist within the same block.
Your declaration within the variables.tf
would look like (with some fixes and cleanup):
variable "instances" {
type = list(object({
type = string # removed commas since you specified object type
count = number # fixed from string type
tags = map(string)
}))
}
Your variable assignment should be moved to a .tfvars
file. Customarily this file would be named terraform.tfvars
:
instances = [ # you specified a list so we add the proper syntax here
{ # you specified an object, so we remove the keys and retain the values
type = "t2.micro"
count = 4
tags = { "Name" = "Test T2"} # you specified map(string) so Name becomes string
},
{
type = "m4-large"
count = 2
tags = { "Name" = "Test M4"}
}
}]
and that will be a valid input variable with proper assignment given your declaration. That will fix your error.
推荐阅读
- html - 内联边框半径属性不适用于生成的电子邮件
- asp.net - System.NullReferenceException: '对象引用未设置为对象的实例
- python-3.x - Tensorflow 亚当优化器 ValueError “错误:不支持无值。”
- git - 发展分行推荐晋升标准
- java - 使用自定义 Jar 时编译 Maven 项目会引发错误
- java - 解析参数后内联优化算法速度
- java - JPA NamedQuery 不在 Glassfish4 中(但在 Glassfish3 中有效)
- reactjs - isomorphic-style-loader - 如何添加“活动”类
- angular - Angular2+:从类(不是组件)调用提供者
- dynamics-crm - OneLogin + Dynamics 365 通过代码进行身份验证