使用Terraform获取AMI的动态数据源

时间:2018-01-24 03:54:51

标签: amazon-web-services terraform

因此,以下数据源将获取标记为component:web的最新AMI。让我们说我有一些带有自己AMI的组件。有没有一种方法可以让我更加动态,我可以传递component的值?我似乎无法想到我可以传递的唯一值。我是否需要重构一下我的代码?

data "aws_ami" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["web"]
  }

  most_recent = true
}

我有一个defaults模块作为元数据查找,它可以获取并输出AMI ID和VPC ID等基本内容。

默认模块

# defaults/main.tf

data "aws_ami" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["web"]
  }

  most_recent = true
}

output "web_ami" {
  value = "${data.aws_ami.web.id}"
}

主要代码

# service_name/main.tf

module "defaults" {
  source      = "../defaults"
  region      = "${var.region}"
  environment = "${var.environment}"
}

module "ftpserver" {
  source .    = "../ec2_instance"
  ami_id      = "${module.defaults.web_ami}"
  ...
}

1 个答案:

答案 0 :(得分:2)

我将aws_ami数据源移动到模块中,让它直接查找AMI,而不是从外部传入。

所以我会将ec2_instance模块更改为:

variable "ami_component" {}

data "aws_ami" "selected" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["${var.ami_component"]
  }

  most_recent = true
}

resource "aws_instance" "instance" {
  ami           = "${data.aws_ami.selected.id}"
  instance_type = "t2.micro"

  tags {
    Name = "HelloWorld"
  }
}

如果您觉得您需要能够覆盖ec2_instance模块中的AMI,则可以将其更改为:

variable "ami_component" {}

variable "override_ami" {
  default = ""
}

data "aws_ami" "selected" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["${var.ami_component"]
  }

  most_recent = true
}

resource "aws_instance" "instance" {
  ami           = "${var.override_ami != "" ? var.override_ami : data.aws_ami.selected.id}"
  instance_type = "t2.micro"

  tags {
    Name = "HelloWorld"
  }
}

这使用条件来检查override_ami变量是否已被设置为其他情况,在这种情况下它将使用它,否则它将使用ami_component变量来查找适当的AMI并使用相反。

这有利于将AMI选择逻辑移动到Terraform模块中,使得到该模块的接口更加简单。

相关问题