web-dev-qa-db-ja.com

EC2 IPアドレス:Webサーバーは起動時にdbサーバーのIPアドレスをどのように識別できますか?

私は単純な2層配置を持っています-1つのWebサーバー(WindowsでホストされているWebsphere)と1つのOracleデータベースサーバー。 WebサーバーはOracleデータベースサーバーに接続する必要があります。

私はそのスクリプトを書こうとしています

  1. OracleデータベースでEC2インスタンスを起動します
  2. WebsphereでEC2インスタンスを起動します
  3. データベースと通信するようにWebsphereインスタンスを構成します

私は#3で立ち往生しています。スクリプトを実行するたびに、DBサーバーは異なるIPアドレスを取得します。 Websphereインスタンスに「DBにこのIPアドレスを使用する」と伝えるにはどうすればよいですか?

私が検討したいくつかの解決策-

  1. ホスト名に接続するようにWebsphereを構成します。 DBサーバーが起動し、IPアドレスが割り当てられたら、DNSレコード(おそらくRoute 53)を更新します。
  2. Websphereインスタンスを起動するときに、DBサーバーのIPアドレスをユーザーデータとして渡し、起動スクリプトを実行して構成を更新します
  3. Elastic IPアドレスを使用します-しかし、それにはインターネット経由でdbトラフィックをルーティングする必要がありますよね?

これらの各ソリューションは、通常よりも機能しているようです。足りないものはありますか?この問題を解決するための標準的な方法は何ですか?

バウンティの編集 Elastic IPアドレスソリューションは機能しますが、インターネットに接続してはならないサーバーでパブリックIPアドレスを無駄にするのは好きではありません。この問題を解決するためにあなたが採用した他の解決策を聞いてみたいです。

5

Elastic IPを使用できますが、そのドメイン名を介して接続すると、内部アドレスに解決されます。したがって、明らかに、DNS名はエラスティックIPから派生します。 ec2-46-147-161-187.eu-west-1.compute.amazonaws.comはeu-west-1の46.147.161.187に対応します。ドメインは修正されるため、必要に応じてハードコーディングできます。

https://forums.aws.Amazon.com/message.jspa?messageID=299889 を参照してください。

8
James Little

このジョブにはDHCPのようなブロードキャスト応答メカニズムを使用できないと想定する必要があります。つまり、残っている唯一のオプションは、どこかのディレクトリを更新してクエリすることです。

ダイナミックDNS(例:DNS UPDATE; RFC 2136 )は明らかな解決策です。すでにネームサーバーをお持ちの場合、このソリューションのセットアップには約5分かかります。動的更新用にbindを設定し、nsupdateコマンドを使用するためのクイックスタートチュートリアルについては、 http://linux.yyz.us/nsupdate/ を参照してください。 Route 53でのDDNSの使用については、 このブログエントリ を参照してください。

または、Webサーバー上の単純なプライベートPHPスクリプトのようなものを使用して、IP登録の更新とクエリ応答メカニズムを処理する独自のソリューションをロールすることもできます。明らかに、このソリューションは少し柔軟性がありますが、 DDNSのシンプルなエレガンスが欠けています。

4
tylerl

1つの解決策は、Amazonの仮想プライベートクラウド(VPC)を使用することです。これはその良いユースケースのように思えます。 (さらに、このシナリオでは、VPCに追加コストはありません)。

基本的に、新しいVPCとそのVPC内にパブリックサブネット(通常は10.0.0.0/24)を作成できます。次に、両方のインスタンスをサブネットで起動します。

  • Websphereインスタンスをサブネットで起動し、ElasticIPをサブネットに関連付けます[.____]
    • 注:特別なVPC Elastic IPが必要です(通常のIPはVPCでは機能しません)。それらを割り当てるときは、ドメインを「vpc」として指定します。
  • Oracleインスタンスを起動し、サブネットからの有効なIPアドレスを使用してPrivateIpAddressパラメータを渡します。
    • これにより、リクエストされたプライベートIPがインスタンスに割り当てられ、VPC内の他のインスタンスで利用できるようになり(ただし、VPCにエラスティックIPがないとインターネットアクセスはできません)、パブリックIPアドレスを無駄にすることはありません。 VPCアドレスはインスタンスの存続期間中保持されることに注意してください。インスタンスが停止しても、アドレスは分離されません。また、エラスティックIPを使用してVPC内のインスタンス間でトラフィックをルーティングすることはできません。

もちろん、このセットアップまたはNATを使用しないセットアップでは、あらゆる種類のインターネットアクセスを持つ各インスタンスにパブリックIPが割り当てられます(エラスティックIPアドレスでなくても)。 NATインスタンスがルーティング用に構成されているプラ​​イベートサブネットとパブリックサブネットの両方を使用して、インスタンスにパブリックIPをまったく持たせずに、インターネットにアクセスできるようにすることはできますか(もちろん欠点) 、小規模なセットアップ(たとえば、2つのインスタンス)の場合、NATを実行するには3番目のインスタンスが必要ですが、これは実用的ではありません)。

参考文献:

4
cyberx86

起動時にデータベースサーバーに動的DNSCNAMEレコードを登録させることができます。

Mydbと呼ぶサーバーに対して同様のことを行います。 (IDを保護するためにホスト名とIPが変更されました。)

aWS外部からの「Digmydb.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内からの「Digmydb.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

そのCNAMEレコードのタイムアウトが比較的短い(108秒)ことに注意してください。

Mydbサーバーが起動すると、新しい動的AWS名を指すようにCNAMEレコードが変更されます。

もう1つの優れた点は、AWSの外部にいるのか内部にいるのかに応じて、異なる応答が得られることです。 (最も費用効果の高い対応)

Elastic IPを使用すると、DNS TTLタイムアウトを待つ必要がなくなるので、それは素晴らしいことですが、DNSを使用できる場合はTTLタイムアウトで起動します新しいDBサーバー(mydb2.example.netにフェイルオーバーDBサーバーを常に用意しておく必要がありますよね?)、このソリューションが役立つ可能性があります。

1
Joel K

標準的な方法は、Chef、Puppetなどの構成管理ツールを使用することです。

Chefの使用経験が豊富なので、ここではChefの使用について説明します。

あなたの場合、これはあるべき姿です。 1)サーバーの起動時に、各サーバー(ノードとも呼ばれます)は自分自身をchefサーバーに登録する必要があります。 2)各ノードには実行リストが割り当てられます。実行リストには、多くの役割(db、webなど)やレシピが含まれています。 3)各役割には、bootstrap)のレシピがあり、そのソフトウェアコンポーネントを構成します。

Puppetの世界でも多かれ少なかれ似ています。

リンク: ChefPuppet

これらはすべてオープンソースであることに注意してください。 Opcodeは、ホストされたバージョンのChefServerも提供します。あなたはそれを試すことができます。

1

考えられる解決策は3つしかなく(EIPがオプションではない場合)、すでに一般的なハンドルを持っているようです。

  1. ダイナミックDNSを使用します。データベースに、Route53でホストされているゾーンをプライベートIPアドレスで更新させることができます。 Route53は非常に低いTTLを許可します。 Websphereサーバーは、指定されたroute53Aレコードに接続することを常に知っている必要があります。 mydb.internal.mydomain.com

  2. タグを使用して、データベースインスタンスの役割とIPアドレスにタグを付けます。次に、Websphereサーバーで、データベースサーバーとしてタグ付けされたインスタンスをクエリし、そのIPアドレスを検出します。

  3. VPCを使用し、起動時にDBインスタンスのプライベートIPを指定します。 Websphereインスタンスは、常に同じ指定されたIPに接続します。

必要がない場合はVPCを避け、上記の説明を踏まえると、私が理解していることからは保証されていないようです。

1
Ameer Deen

見てください http://www.exapark.com/product.html このツールは、実行中のインスタンスの現在の内部IPでhostsファイルを更新します

0
Alexey

私がやりたい簡単なことの1つは、サーバーにタグを追加することです

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

次に、AWSSDKforNETを使用して、PowerShellスクリプトのタグに基づいてサーバーにクエリを実行できます。私が持っているNew-GenericListメソッドは、リフレクションを使用してPowerShellで新しいリストを作成するだけです。

$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
0
bwight