假设我使用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。披露-我是工具作者