EC2 IP地址:Web服务器在启动时如何识别数据库服务器IP地址?

我有一个简单的2层安排 – 一个Web服务器(在Windows上托pipe的Websphere)和一个Oracle数据库服务器。 Web服务器需要连接Oracle数据库服务器。

我正在试图写一个脚本

  1. 用Oracle数据库提供一个EC2实例
  2. 用Websphere带来一个EC2实例
  3. configurationWebsphere实例以与数据库进行通信

我被困在#3。 每次运行脚本时,数据库服务器都会获得不同的IP地址。 我如何告诉我的Websphere实例“使用这个IP地址的数据库”?

我考虑过的一些解决scheme –

  1. configurationWebsphere以连接到主机名。 当数据库服务器启动并被分配IP地址时,更新DNSlogging(可能是Route 53)
  2. 在启动websphere实例时,将DB服务器IP地址作为用户数据传递,并运行启动脚本来更新configuration
  3. 使用弹性IP地址 – 但这将需要通过互联网路由数据库stream量,对吧?

这些解决scheme中的每一个似乎比平常更多的工作 有什么我失踪? 解决这个问题的标准方法是什么?

赏金弹性IP地址解决scheme编辑工作,但我不喜欢在永远不应该连接到互联网的服务器上使用浪费公共IP地址。 我很好奇听到你用来解决这个问题的其他解决scheme。

您可以使用弹性IP,但通过其域名连接,并将parsing为内部地址。 所以显然你从弹性IP派生DNS名称,例如ec2-46-147-161-187.eu-west-1.compute.amazonaws.com对应于欧盟西部1的46.147.161.187。 该域名将被固定,所以你可以硬编码,如果你想。

请参阅https://forums.aws.amazon.com/message.jspa?messageID=299889

你必须假设你不能使用DHCP这样的广播响应机制来完成这个任务,这意味着剩下的唯一select就是更新和查询某个目录。

dynamicDNS(如DNS更新; RFC 2136 )是一个明显的解决scheme。 如果您已经拥有名称服务器,则此解决scheme需要大约5分钟的时间才能设置。 有关为dynamic更新设置bind并使用nsupdate命令的快速入门教程,请参阅http://linux.yyz.us/nsupdate/ 。 有关在Route 53中使用DDNS的信息,请参阅此博客条目 。

或者,您可以使用某个Web服务器上的简单私有PHP脚本来处理您自己的解决scheme,以处理IP注册更新和查询响应机制。 很显然这个解决scheme更加灵活一些,但是它缺lessDDNS的简单优雅。

我build议一个解决scheme是使用亚马逊的虚拟私有云(VPC) – 这听起来像是一个很好的用例。 (另外,在这种情况下,VPC没有额外的成本)。

本质上,您可以在该VPC中创build新的VPC和公有子网(通常为10.0.0.0/24)。 然后将这两个实例启动到子网中。

  • 将websphere实例启动到子网中,然后将弹性IP与其关联
    • 注意:您需要特殊的VPC弹性IP(常规的IP地址在VPC中不起作用)分配时,请将域指定为“vpc”。
  • 启动Oracle实例,并从子网传递PrivateIpAddress参数和一个有效的IP地址。
    • 这会将请求的私有IP分配给您的实例,它将可用于VPC中的其他实例(但在VPC中没有没有弹性IP的Internet访问),您不会浪费公共IP地址。 值得注意的是,VPC地址在实例生命周期中保留 – 即使实例停止,地址也不会分离。 另外,您无法使用弹性IP在VPC中的实例之间路由stream量。

当然,在这个设置或任何不使用NAT的设置中,每个具有任何types互联网访问的实例都将被分配一个公共IP(即使它不是弹性IP地址)。 只有使用configuration了路由的NAT实例的私有和公有子网,才能让一个实例根本没有公有IP,但仍然能够访问互联网。 (不利的一面是,对于一个小的设置 – 例如2个实例 – 你需要第三个实例来执行NAT,这是不实际的)。

进一步阅读:

  • AWS新闻稿:IP地址分配
  • EC2-run-instances参考 (请注意VPC特定的选项)
  • VPC上的公共子网

您可以让数据库服务器在启动时注册一个dynamic的DNS CNAMElogging。

我为一个我们称之为mydb的服务器做类似的事情。 (主机名和IP被更改以保护身份。)

从AWS外部的“dig mydb.example.net”输出

 mydb.example.net. 108 IN CNAME ec2-123-45-6-7.compute-1.amazonaws.com. ec2-123-45-6-7.compute-1.amazonaws.com. 258 IN A 123.45.6.7 

从AWS内部的“dig mydb.example.net”输出

 mydb.example.net. 108 IN CNAME ec2-123-45-6-7.compute-1.amazonaws.com. ec2-123-45-6-7.compute-1.amazonaws.com. 258 IN A 10.2.2.2 

请注意该CNAMElogging的相对较低的超时时间(108秒)。

当mydb服务器启动时,它会将CNAMElogging更改为指向NEWdynamicAWS名称。

另一件不错的事情是,如果你在AWS外部或内部,你会得到不同的回应。 (最具成本效益的回应)

使用弹性IP放弃了等待DNS TTL超时的需要,所以这很好,但是如果您可以使用DNS TTL超时来启动新的数据库服务器(您应该在mydb2.example.net上有一个故障转移数据库服务器无论如何,无论如何,对吧?),那么这个解决scheme可能适合你。

只有三种可能的解决scheme(当EIP不是一种select时),你似乎已经对它们有一个总体的把握:

  1. 使用dynamic的DNS。 您可以让数据库使用私有IP地址更新在Route53中托pipe的区域。 Route53将允许非常低的TTL。 您的web服务器应该总是知道连接到您指定的路由53logging,例如mydb.internal.mydomain.com

  2. 使用标签来标记您的数据库实例angular色和IP地址。 然后让您的websphere服务器查询标记为数据库服务器的实例,并发现它是IP地址

  3. 使用VPC并在启动时为您的数据库实例指定私有IP。 你的websphere实例总是连接到同一个指定的ip。

如果没有必要的话,我会避免使用VPC,并在上面给出您的描述,但是从我的理解来看,这似乎并不合理。

标准的方法是使用像Chef,Puppet这样的configurationpipe理工具。

因为,我有很多使用厨师的经验,我会在这里谈论使用厨师。

就你而言,这是应该的。 1)服务器启动后,每个服务器(或者称为节点)都应该向厨师服务器注册。 2)每个节点将被分配一个运行列表。 运行列表包含许多angular色(例如:db,web等)和/或配方。 3)每个angular色将有配方引导和configuration该软件组件。

在Puppet世界也是差不多的。

链接: 厨师 木偶

请注意,所有这些都是OpenSource。 Opcode也提供Chef Server的托pipe版本。 你可以试试。

一个简单的事情,我喜欢做的是添加一个标签到服务器

ec2-create-tags <instance-id> --tag Purpose=DB

然后,您可以使用AWSSDKforNET根据PowerShell脚本中的标记查询服务器。 New-GenericList方法,我刚刚在PowerShell中使用reflection创build一个新的列表。

 $client = Create-EC2-Client # Request a list of all the current AmazonEC2 Instances $request = New-Object -TypeName Amazon.EC2.Model.DescribeInstancesRequest $filterList = New-GenericList Amazon.EC2.Model.Filter # Create a new filter to only get servers with a purpose of webserver $filter = New-Object -TypeName Amazon.EC2.Model.Filter $filter = $filter.WithName("tag:Purpose"); $filter = $filter.WithValue("DB"); $filterList.Add($filter); # Add the filter to the request $request = $request.WithFilter($filter); $response = $client.DescribeInstances($request) $servers = @() foreach ($instance in $response.DescribeInstancesResult.Reservation) { if($instance.RunningInstance[0].InstanceState.Name -eq "running") { $servers += $instance.RunningInstance[0].PrivateIpAddress.ToString() } } $servers 

您可以使用vCider ,它可以为您提供虚拟专用networking,甚至跨云提供商(例如,您可以在数据中心,EC2或Rackspace上拥有第2层广播域)。 您还可以完全控制IP地址分配,这意味着您的主机将拥有固定的地址。 基本上,它允许你创build你自己的VPC(虚拟私有云),但让你独立于特定的提供者,并给你完整的第2层function。

你可以在这里注册。 多达8个主机的使用是免费的。 vCider还提供了一些您可能感兴趣的安全function。

啊,关于你的赏金:你可以在你的虚拟networking中使用私有IP地址,这样你就不必浪费公共地址,甚至不需要通过公共地址来暴露你的服务器。 要知道,一台EC2机器总是有一个公共IP地址,但是vCider你实际上可以做一些叫做“云遮天”的东西,它完全closures了这个公共地址上的所有stream量,从而使得你的主机从公共互联网上消失。

我应该在这里提到,我为vCider工作,但请不要让这阻止你考虑vCider。 如果您有任何问题,请告诉我。