私は単純な2層配置を持っています-1つのWebサーバー(WindowsでホストされているWebsphere)と1つのOracleデータベースサーバー。 WebサーバーはOracleデータベースサーバーに接続する必要があります。
私はそのスクリプトを書こうとしています
私は#3で立ち往生しています。スクリプトを実行するたびに、DBサーバーは異なるIPアドレスを取得します。 Websphereインスタンスに「DBにこのIPアドレスを使用する」と伝えるにはどうすればよいですか?
私が検討したいくつかの解決策-
これらの各ソリューションは、通常よりも機能しているようです。足りないものはありますか?この問題を解決するための標準的な方法は何ですか?
バウンティの編集 Elastic IPアドレスソリューションは機能しますが、インターネットに接続してはならないサーバーでパブリックIPアドレスを無駄にするのは好きではありません。この問題を解決するためにあなたが採用した他の解決策を聞いてみたいです。
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 を参照してください。
このジョブにはDHCPのようなブロードキャスト応答メカニズムを使用できないと想定する必要があります。つまり、残っている唯一のオプションは、どこかのディレクトリを更新してクエリすることです。
ダイナミックDNS(例:DNS UPDATE; RFC 2136 )は明らかな解決策です。すでにネームサーバーをお持ちの場合、このソリューションのセットアップには約5分かかります。動的更新用にbind
を設定し、nsupdate
コマンドを使用するためのクイックスタートチュートリアルについては、 http://linux.yyz.us/nsupdate/ を参照してください。 Route 53でのDDNSの使用については、 このブログエントリ を参照してください。
または、Webサーバー上の単純なプライベートPHPスクリプトのようなものを使用して、IP登録の更新とクエリ応答メカニズムを処理する独自のソリューションをロールすることもできます。明らかに、このソリューションは少し柔軟性がありますが、 DDNSのシンプルなエレガンスが欠けています。
1つの解決策は、Amazonの仮想プライベートクラウド(VPC)を使用することです。これはその良いユースケースのように思えます。 (さらに、このシナリオでは、VPCに追加コストはありません)。
基本的に、新しいVPCとそのVPC内にパブリックサブネット(通常は10.0.0.0/24)を作成できます。次に、両方のインスタンスをサブネットで起動します。
PrivateIpAddress
パラメータを渡します。もちろん、このセットアップまたはNATを使用しないセットアップでは、あらゆる種類のインターネットアクセスを持つ各インスタンスにパブリックIPが割り当てられます(エラスティックIPアドレスでなくても)。 NATインスタンスがルーティング用に構成されているプライベートサブネットとパブリックサブネットの両方を使用して、インスタンスにパブリックIPをまったく持たせずに、インターネットにアクセスできるようにすることはできますか(もちろん欠点) 、小規模なセットアップ(たとえば、2つのインスタンス)の場合、NATを実行するには3番目のインスタンスが必要ですが、これは実用的ではありません)。
参考文献:
起動時にデータベースサーバーに動的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サーバーを常に用意しておく必要がありますよね?)、このソリューションが役立つ可能性があります。
標準的な方法は、Chef、Puppetなどの構成管理ツールを使用することです。
Chefの使用経験が豊富なので、ここではChefの使用について説明します。
あなたの場合、これはあるべき姿です。 1)サーバーの起動時に、各サーバー(ノードとも呼ばれます)は自分自身をchefサーバーに登録する必要があります。 2)各ノードには実行リストが割り当てられます。実行リストには、多くの役割(db、webなど)やレシピが含まれています。 3)各役割には、bootstrap)のレシピがあり、そのソフトウェアコンポーネントを構成します。
Puppetの世界でも多かれ少なかれ似ています。
これらはすべてオープンソースであることに注意してください。 Opcodeは、ホストされたバージョンのChefServerも提供します。あなたはそれを試すことができます。
考えられる解決策は3つしかなく(EIPがオプションではない場合)、すでに一般的なハンドルを持っているようです。
ダイナミックDNSを使用します。データベースに、Route53でホストされているゾーンをプライベートIPアドレスで更新させることができます。 Route53は非常に低いTTLを許可します。 Websphereサーバーは、指定されたroute53Aレコードに接続することを常に知っている必要があります。 mydb.internal.mydomain.com
タグを使用して、データベースインスタンスの役割とIPアドレスにタグを付けます。次に、Websphereサーバーで、データベースサーバーとしてタグ付けされたインスタンスをクエリし、そのIPアドレスを検出します。
VPCを使用し、起動時にDBインスタンスのプライベートIPを指定します。 Websphereインスタンスは、常に同じ指定されたIPに接続します。
必要がない場合はVPCを避け、上記の説明を踏まえると、私が理解していることからは保証されていないようです。
見てください http://www.exapark.com/product.html このツールは、実行中のインスタンスの現在の内部IPでhostsファイルを更新します
私がやりたい簡単なことの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