我有一个标准的2层应用程序,我正在部署到AWS。作为此部署的一部分,我需要将配置文件写入EC2实例。此配置文件包含数据库(RDS)设置。现在我将此文件定义为EC2实例中的提供程序。所以terraform所做的是,在RDS 100%启动并运行(大约需要5分钟)之前,它甚至不会开始构建EC2实例。这使事情变得非常缓慢。
有没有办法可以在EC2实例的上下文之外执行文件资源,以便并行创建RDS实例和EC2实例?或者我应该使用另一种模式吗?
这是一些代码位:
resource "aws_instance" "foo" {
ami = "${lookup(var.AMIS, var.AWS_REGION)}"
instance_type = "t2.micro"
//setup the config file
provisioner "file" {
destination = "foo/config.json"
content = "${data.template_file.config_file.rendered}"
...
}
data "template_file" "config_file" {
template = "${file("config.json.tmpl")}"
vars {
mysql_pass = "${var.MYSQL_PASSWORD}"
mysql_addr = "${aws_db_instance.mysql.endpoint}"
}
}
resource "aws_db_instance" "mysql" {
allocated_storage = 20
...
}
答案 0 :(得分:3)
您可以使用null_resource
运行配置程序步骤,将配置复制到实例。
在您的情况下,您可能会使用以下内容:
resource "null_resource" "db_config" {
# Recreating the instance requires the config to be redeployed
triggers {
instance_ids = "${aws_instance.foo.id}"
}
connection {
host = "${aws_instance.cluster.public_ip}"
}
provisioner "file" {
destination = "foo/config.json"
content = "${data.template_file.config_file.rendered}"
}
}
然后,这将允许您同时创建EC2和RDS实例,然后生成模板文件,然后最终配置器步骤复制模板化配置将运行。
请记住,您的应用程序现在将在数据库启动之前以及它有任何可用配置之前启动相当长的时间,因此请确保重试与数据库的连接(以及配置的读取) )。
作为替代方案,您可能需要考虑一些配置模板结构,例如confd或Consul Template。