创建 VPC 时,我会在每个可用区中创建一个子网。
然后,当我创建我的应用程序时,我想输入 ami 和实例类型(例如 t3a.nano)。
我想避免出现此错误:
错误:启动源实例时出错:不支持:您请求的可用区 (us-west-2b) 不支持您请求的实例类型 (a1.medium)。请通过不指定可用区或选择 us-west-2a、us-west-2c 来重试您的请求。
我正在寻找一个 terraform 模块,它可以告诉我是否可以在给定我的 ami 和实例类型的情况下在此子网上创建我的实例。
我没有找到一个 terraform 模块,所以我创建了自己的模块。它正在做我想做的事,但我想知道是否有更好的方法。
我把我的代码放在这里。 https://gitlab.com/korrident/terraform_calculate_ami_by_availability_zone
很快,我只是使用 a data "external"
来调用 bash
data "external" "subnet_available_for_ami" {
count = "${length(var.subnets_id)}"
program = ["bash", "${path.module}/check_subnet_ami.bash"]
query = {
ami = "${data.aws_ami.latest_ami.id}"
type = "${var.instance_type}"
subnet = "${var.subnets_id[count.index]}"
region = "${var.aws_region}"
profile = "${var.aws_profile}"
}
}
此脚本将通过试运行调用 AWS CLI
aws --region=${REGION} ec2 run-instances \
--instance-type ${INSTANCE_TYPE} \
--image-id ${AMI} \
--subnet-id ${SUBNET_ID} \
--profile ${PROFILE} \
--dry-run
最后我过滤结果以返回一个干净的子网列表
locals {
uniq_answers = "${distinct(data.external.subnet_available_for_ami.*.result)}"
uniq_answers_filtered = [
for a in local.uniq_answers :
a if length(a) != 0
]
uniq_subnet_filtered = [
for a in local.uniq_answers_filtered :
a.subnet
]
}
请注意,在同一个脚本中,我还使用了组件 aws_ami。
data "aws_ami" "latest_ami" {
理想情况下,我希望这个组件返回我的子网上可用的 ami。
没有错误,它工作正常,但很少。如果没有找到,调用模块将处理它。最有问题的情况是只有一个结果(我希望我的实例位于多个可用区,而不仅仅是一个)。
有没有人找到更好的设计?