从私有子网管理Route53私有DNS条目,无法访问Internet

时间:2018-04-28 13:25:22

标签: amazon-web-services amazon-route53 amazon-vpc

我目前在AWS中使用Terraform作为站立式基础架构,作为每个计算实例实例化的一部分,它调用AWS元服务和EC2 API来设置其主机名。

在配置squid代理实例(可能由Ansible处理)之前,放置在我的VPC私有子网中的任何实例都无法访问Internet。

要允许我的VPC中的所有实例与EC2 API通信,我已配置了VPC端点。不幸的是,没有这样的端点可以与Route53通信。这意味着我无法在创建每个实例时为其设置私有DNS记录。

我不确定如何管理每个主机的DNS条目设置。私有子网最终将通过反向代理(squid代理)与互联网通信,但我想避免使反向代理成为初始设置的依赖。

我唯一的想法是使用"配置"生活在公有子网中的实例,私有子网中的每个实例都可以将其主机名报告给"配置"实例,然后可以调用Route53 API。

值得注意的是,其中一些实例的主机名将是动态的,因此无法通过Terraform进行设置。

3 个答案:

答案 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