1

创建 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。

没有错误,它工作正常,但很少。如果没有找到,调用模块将处理它。最有问题的情况是只有一个结果(我希望我的实例位于多个可用区,而不仅仅是一个)。

有没有人找到更好的设计?

4

0 回答 0