Terraform: как отделить файловый ресурс от экземпляра и RDS


У меня есть стандартное 2-уровневое приложение, которое я развертываю в AWS. В рамках этого развертывания мне нужно записать конфигурационный файл в экземпляр EC2. Этот конфигурационный файл содержит параметры базы данных (RDS). Прямо сейчас у меня есть этот файл, определенный как поставщик в экземпляре EC2. Таким образом, terraform делает то, что он даже не начнет строить экземпляр EC2, пока RDS не будет на 100% запущен и запущен (что занимает около 5 минут). Это делает вещи очень медленными.

Есть ли способ, которым я могу сделать файл ресурс вне контекста экземпляра 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
 ...
}
1 2

1 ответ:

Вы могли бы использовать null_resource для выполнения шага provisioner, который копирует конфигурацию в экземпляр.

В вашем случае вы можете использовать что-то вроде следующего:

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 одновременно, а затем файл шаблона может быть сгенерирован, и тогда, наконец, будет запущен шаг provisioner для копирования шаблонной конфигурации.

Помните, что ваше приложение теперь будет запущено за достаточно долгое время до база данных готова, и прежде чем у нее появится доступная конфигурация, убедитесь, что она будет в порядке с повторной попыткой подключения к базе данных (и чтением конфигурации).

В качестве альтернативы вы можете рассмотреть некоторую структуру шаблонов конфигурации, такую какconfd илиConsul Template .