1

単一の SecurityGroup にアタッチされたすべての EC2 インスタンスが、PrivateIP の代わりに ElasticIP を使用して相互に通信できるようにするための適切なセキュリティ グループ ルールは何ですか?

ここに画像の説明を入力

上の図の説明 AmazonVPC に 1 つのパブリック サブネットがあります。サブネットには、3 つ以上の EC2 インスタンス (DevOps インスタンス、PHP インスタンス、Python インスタンス、その他いくつか) があります。DevOps インスタンスは、SG1 と SG2 の 2 つのセキュリティ グループにアタッチされています。PHP/Python インスタンスは、1 つのセキュリティ グループ SG2 のみにアタッチされています。表に示されている SG1 および SG2 ルールを考えると、DevOps インスタンスは SSH ポート 22 のみを介して世界中からアクセスできます。PHP/Python インスタンスは、HTTP ポート 80 のみを介して世界中からアクセスできます。すべての DevOps/PHP/Python インスタンスのすべてのポートは、同じセキュリティ グループにアタッチされているすべての EC2 インスタンスからのみアクセスできます。

ユースケース: ElasticIP 9.8.7.1 を使用して、インターネットから DevOps インスタンスに SSH 接続したいと考えています。次に、DevOps インスタンスから、ElasticIP 9.8.7.2 / 9.8.7.3 (PrivateIP を使用しない) を使用して、PHP/Python インスタンスに SSH で接続したいと考えています。また、私の PHP アプリは、ElasticIP を介して Python アプリと対話できる必要があります。また、その逆も可能です。これは、ElasticIP がアプリのソース コードに含まれているためです。

問題 1:表に示されているセキュリティ グループ ルールにより、現在、ElasticIP を使用せずに PrivateIP のみを使用して、DevOps インスタンスから PHP/Python インスタンスに SSH 接続できます。

問題 2: PHP/Python インスタンスも、ElasticIP を介して相互に通信できません。

制約:新しい/更新された AMI から、PHP/Python アプリの新しいインスタンスを定期的に起動します。新しいインスタンスを起動するたびに、PrivateIP が変更されます。しかし、変更されないもの (つまり、ElasticIP) を介して通常の通信を実行する必要があります。~/.ssh/config ファイルを DevOps インスタンスに保持して、アプリ インスタンスへの SSH を簡単に実行できるようにします。ssh 構成ファイルでは、ElasticIP を PHP/Python/その他のインスタンスの IP アドレスとして保持しています。アプリ インスタンスが新しいものに置き換えられるたびに、ssh 構成ファイルの IP アドレスを新しい PrivateIP アドレスに変更することはできません。

4

2 に答える 2

4

最も簡単な解決策は、IP アドレスを直接使用するのではなく、IP アドレスのホスト名を使用することです。これは、VPC が魔法のようなマッピングを行うためです。

たとえば、次のエラスティック IP を使用します。

$ nslookup 203.0.113.50

50.113.0.203.in-addr.arpa       name = ec2-203-0-113-50.compute-1.amazonaws.com.

同じ VPC 内から、このホスト名は Elastic IP に解決されません。代わりに、プライベート IP に解決されます。

$ nslookup  ec2-203-0-113-50.compute-1.amazonaws.com.

Name:   ec2-203-0-113-50.compute-1.amazonaws.com.
Address: 172.31.10.25 # returns the private IP of the attached instance

しかし、VPC の外部からは、期待どおりに解決されます。

$ nslookup ec2-203-0-113-50.compute-1.amazonaws.com.

Name:   ec2-203-0-113-50.compute-1.amazonaws.com.
Address: 203.0.113.50 # returns the elastic IP

さらに、devops マシンのエラスティック アドレスのホスト名を指すDNS CNAMEdevops.example.com を構成する場合、外部からアクセスした場合は外部 IP を取得しますが、アクセスした場合は内部 IP を取得します。それを内部的に。

内部要求はプライベート IP を使用するため、特別なセキュリティ グループの構成は必要ありません。

追加の動機: 同じアベイラビリティ ゾーン内で Elastic IP を使用して通信するようにインスタンスを構成する場合、VPC を出て戻ってくるトラフィックに対して料金がかかります。ただし、プライベート IP を使用する場合は、0.01 USD/GB です。データ転送料金を参照してください。おそらく違いは、より多くの AWS ネットワーク ハードウェアを使用してトラフィックを変換および再変換しているためです。エラスティック IP を使用すると、トラフィックはインターネット ゲートウェイを 2 回通過します。

上記の例は、私の EIP をRFC-5737のプレースホルダーに置き換えた、私のネットワークの実際の例です。

于 2015-10-28T17:51:57.777 に答える
0

1) 次のような SG2 の受信ルールを手動で追加できます: 1) AllPorts EIP1 2) AllPorts EIP2

2) 以下のようにスクリプトで同じことを行います:
aws cli または API を使用して、スクリプトがセキュリティ グループ内のインスタンスを取得するようにします。
例:
aws ec2 describe-instances --filter "Name=instance.group-name,Values=SG2"

これにより、セキュリティ グループ SG2 内のすべてのインスタンスが取得されます。インスタンス ID を SG2_Instances という dict に保存します。

次に実行します: aws ec2 describe-addresses.
これにより、エラスティック IP ごとに、関連付けられている場合はインスタンス ID を含む対応するフィールドが提供されます。EIP とともにすべてのインスタンス ID をリストに入れます。リストは
[(EIP1, instanceId1), (EIP2,InstanceId2),..] のようになります。
リストを反復処理し、リスト内の instanceId が dict SG2_Instances に存在するかどうかを確認します。はいの場合は、対応する EIP を使用して、1) で述べたようなルールを追加できます。

于 2015-10-28T14:16:31.553 に答える