当使用Terraform进行配置时,代码如何获得对机器ID的引用(例如,数据库机器地址)



假设我使用Terraform在AWS中提供两台机器:

  • 运行NodeJS的EC2机器
  • RDS实例

NodeJS代码是如何获取RDS实例的地址的?

这里有几个选项。最简单的方法是在Route53中为数据库创建一个CNAME记录,然后始终指向应用程序中的那个CNAME。

一个基本的例子看起来像这样:

resource "aws_db_instance" "mydb" {
  allocated_storage    = 10
  engine               = "mysql"
  engine_version       = "5.6.17"
  instance_class       = "db.t2.micro"
  name                 = "mydb"
  username             = "foo"
  password             = "bar"
  db_subnet_group_name = "my_database_subnet_group"
  parameter_group_name = "default.mysql5.6"
}
resource "aws_route53_record" "database" {
   zone_id = "${aws_route53_zone.primary.zone_id}"
   name = "database.example.com"
   type = "CNAME"
   ttl = "300"
   records = ["${aws_db_instance.default.endpoint}"]
}

备选选项包括从aws_db_instance获取endpoint输出,并在创建实例时将其传递到用户数据脚本中,或将其传递给Consul,并使用Consul Template控制应用程序使用的配置。

您可以尝试Sparrowform-一种用于基于Terraform实例的轻量级供应工具,它能够清点Terraform资源和供应相关主机,并传递所有必要的数据:

$ terrafrom apply # bootstrap infrastructure
$ cat sparrowfile # this scenario
                  # fetches DB address from terraform cache 
                  # and populate configuration file 
                  # at server with node js code:
#!/usr/bin/env perl6
use Sparrowform;
$ sparrowfrom --ssh_private_key=~/.ssh/aws.pem --ssh_user=ec2 # run provision tool
my $rdb-adress; 
for tf-resources() -> $r {
  my $r-id = $r[0]; # resource id
  if ( $r-id 'aws_db_instance.mydb') {
    my $r-data = $r[1];                
    $rdb-address = $r-data<address>;
    last;
  }
}
# For instance, we can 
# Install configuration file
# Next chunk of code will be applied to  
# The server with node-js code: 
template-create '/path/to/config/app.conf', %(
  source => ( slurp 'app.conf.tmpl' ),
  variables => %(
    rdb-address => $rdb-address
  ),
);
# sparrowform --ssh_private_key=~/.ssh/aws.pem --ssh_user=ec2 # run provisioning 

PS。披露-我是工具作者

最新更新