我目前在AWS中使用Terraform作为站立式基础架构,作为每个计算实例实例化的一部分,它调用AWS元服务和EC2 API来设置其主机名。
在配置squid代理实例(可能由Ansible处理)之前,放置在我的VPC私有子网中的任何实例都无法访问Internet。
要允许我的VPC中的所有实例与EC2 API通信,我已配置了VPC端点。不幸的是,没有这样的端点可以与Route53通信。这意味着我无法在创建每个实例时为其设置私有DNS记录。
我不确定如何管理每个主机的DNS条目设置。私有子网最终将通过反向代理(squid代理)与互联网通信,但我想避免使反向代理成为初始设置的依赖。
我唯一的想法是使用"配置"生活在公有子网中的实例,私有子网中的每个实例都可以将其主机名报告给"配置"实例,然后可以调用Route53 API。
值得注意的是,其中一些实例的主机名将是动态的,因此无法通过Terraform进行设置。
答案 0 :(得分:0)
如果我正确理解您的问题,您想要使用Terraform创建的EC2实例在R53中注册吗?
根据您运行TF的位置,您可以在站立实例的同时创建Route53记录吗?我不会想到您需要互联网访问来呼叫AWS API,但可能是错误的。
如果你从公共子网中的堡垒运行TF会解决问题吗?
答案 1 :(得分:0)
你可能会用一种更复杂的方法来解决这个问题。 Terraform(TF)可以使用您在其他资源中使用的任何资源中的数据。
resource "aws_instance" "foo" {}
resource "aws_route53_zone" "example_private" {}
可以通过路径调用
引用resource "aws_route53_record" "foo" {
zone_id = "${aws_route53_zone.example_private.zone_id}"
name = "foo"
type = "A"
ttl = 300
record = [ "${aws_instance.foo.private_ip}" ]
}
这将使用 instance foo 的私有IP地址在 example_private 域中创建记录。您的私有实例也将在内部与AWS进行通信。没有要求它可以访问公共互联网。
答案 2 :(得分:0)
最好的办法是通过实例角色或API密钥和用户数据来实现它。 使用此过程,您可以执行任何操作 - 例如触发Jenkins,更新任何AWS信息。由于它将是terraform的模板,您可以使用其变量自定义更多。
请告诉我它是怎么回事。
#!/bin/bash
export http_proxy=X.X.X.X:3128
export https_proxy=X.X.X.X:3128
# Configure API Keys here if you don't have instance role.
# Gathering information about the instance
AZ=`curl http://169.254.169.254/latest/meta-data/placement/availability-zone`
REGION="`echo \"$AZ\" | sed 's/[a-z]$//'`"
INSTANCEID=`curl http://169.254.169.254/latest/meta-data/instance-id`
# NAME=`curl http://169.254.169.254/latest/meta-data/local-hostname`
NAME = test.example.com
# Setting the hostname of the instance
aws ec2 create-tags --region $REGION --resources $INSTANCEID --tags Key=Name,Value=$NAME