AWS EC2 インスタンスが特定のポート上の別のインスタンスを認識できない

AWS EC2 インスタンスが特定のポート上の別のインスタンスを認識できない

CloudFormation を使用して 2 つの EC2 インスタンスを作成しました。1 つは Apache Web サーバー用、もう 1 つは PostgreSQL DB 用です。何らかの理由で、DB インスタンスはポート 80 で Web サーバー インスタンスに telnet できるのに、Web サーバーはポート 5432 で DB インスタンスに telnet できません。ローカルホストから DB インスタンスを確認すると、正常に動作しており、ローカルホスト 5432 に正常に telnet しています。各インスタンスには 2 つのセキュリティ グループがあります。

 "TheWebServerSecurityGroup" : {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription" : "Security Group for The web-server instance",
      "SecurityGroupIngress" : [
        { "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0" },
        { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" }
      ],
      "VpcId" : { "Ref": "TheVPC" },
      "Tags" :  [ { "Key": "Name", "Value":  "TheWebServerSecurityGroup" } ]
    }
  },
  "TheDBSecurityGroup" : {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription" : "Security Group for The DB instance",
      "SecurityGroupIngress" : [
        { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" },
        { "IpProtocol" : "tcp", "FromPort" : "5432", "ToPort" : "5432", "CidrIp" : "0.0.0.0/0" }
      ],
      "VpcId" : { "Ref": "TheVPC" },
      "Tags" :  [ { "Key": "Name", "Value":  "TheDBSecurityGroup" } ]
    }
  },

設定に何が問題なのでしょうか? ご協力いただければ幸いです。

UPD: 次のインバウンド/アウトバウンド ルールを追加しようとしましたが、これにより yum 経由でパッケージをインストールできなくなります。

"TheOutboundRule": {
      "Type": "AWS::EC2::SecurityGroupEgress",
      "Properties":{
          "IpProtocol": "tcp",
          "FromPort": 0,
          "ToPort": 5432,
          "DestinationSecurityGroupId": {
              "Fn::GetAtt": [
                  "TheDBSecurityGroup",
                  "GroupId"
              ]
          },
          "GroupId": {
              "Fn::GetAtt": [
                  "TheWebServerSecurityGroup",
                  "GroupId"
              ]
          }
      }
  },
  "TheInboundRule": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties":{
          "IpProtocol": "tcp",
          "FromPort": 0,
          "ToPort": 5432,
          "SourceSecurityGroupId": {
              "Fn::GetAtt": [
                  "TheWebServerSecurityGroup",
                  "GroupId"
              ]
          },
          "GroupId": {
              "Fn::GetAtt": [
                  "TheDBSecurityGroup",
                  "GroupId"
              ]
          }
      }
  },

受信ルールのみ(送信ルールなし)を追加してみましたが、これも機能しません。

答え1

セキュリティ グループの出力が定義されていません。デフォルトの出力は無制限ですか? CIDR 範囲を持つ SG はあまり使用しません。コンソールの SG の入出力のスクリーンショットを含めるように質問を編集することをお勧めします。

AWS 内アクセスには、CIDR ベースではなく、セキュリティ グループ間のルールを使用することを好みます。そのため、次の操作を実行します。

  • TheWebServerSecurityGroup はポート 5432 で TheDBSecurityGroup への出力を許可します。
  • TheDBSecurityGroup は、ポート 5432 で TheWebServerSecurityGroup からの進入を許可します。
  • WebServerSecurityGroupは、ポート443の0.0.0.0/0からの進入を許可します。必要な場合は80も許可します。

ポート22を許可するのではなく、セッションマネージャーログイン後に AWS コンソールから SSH を効果的に取得できるため、SSH よりも安全ですが、ポート 22 を開く必要はありません。記憶が正しければ、サーバーは VPC エンドポイント (送信) にポート 443 を開き、SSH を中継します。設定は少し面倒ですが、CloudFormation で一度設定すれば、さまざまな状況で再利用できます。

関連情報