Dockerコンテナー内のEC2でRDSデータベースを使用するWebサーバーを実行しようとしています。
EC2ホストのロールがRDSにアクセスできるようにセキュリティグループを設定しました。ホストマシンから直接アクセスしようとすると、すべてが正しく機能します。
ただし、ホスト上で単純なコンテナを実行してRDSにアクセスしようとすると、セキュリティグループが許可していないかのようにブロックされます。何度も試行錯誤を繰り返した結果、実際にはコンテナのリクエストがEC2ホストから送信されているようには見えないため、ファイアウォールはノーと言っています。
Dockerコンテナーで--net = Hostを設定することにより、短期間にこれを回避することができましたが、これにより、ポートをマップできるなど、多くの優れたDockerネットワーク機能が壊れます(つまり、それぞれを確認する必要があります)コンテナのインスタンスは手動で別のポートでリッスンします)。
誰かがこれを回避する方法を見つけましたか? AWSリソースを実際に使用している場合、AWSでコンテナーを実行することはかなり大きな制限のようです。
何が起こっているのかを把握し、他の人を助けるためにここに投稿しました。
コンテナー内からの要求は、プライベートではなくRDSのパブリックIPにヒットしていました(セキュリティグループが機能する方法です)。 Dockerコンテナー内のDNSが8.8.8.8 google dnsを使用していたようで、AWSのブラックマジックでrdsエンドポイントをプライベートIPに変換することはできません。
たとえば:
DOCKER_OPTS="--dns 10.0.0.2 -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock -g /mnt/docker"
はい、コンテナはRDSのパブリックIPにヒットします。ただし、コンテナがRDSと通信できるようにするために、低レベルのDockerオプションを調整する必要はありません。 ECSクラスターとRDSインスタンスは同じVPCにある必要があり、セキュリティグループを介してアクセスを構成できます。これを行う最も簡単な方法は、次のとおりです。
このチュートリアルにはスクリーンショットがあります どこへ行くかを示しています。
完全な開示:このチュートリアルでは、Bitnamiのコンテナーを取り上げ、私はBitnamiで働いています。しかし、ここで表明された考えは私自身のものであり、Bitnamiの意見ではありません。
@adamneilsonが言及しているように、Dockerオプションの設定が最善の策です。 VPCでAmazon DNSサーバーを検出する方法 を以下に示します 。また、「Amazon EC2コンテナサービス開発者ガイドのトラブルシューティング」のセクション 有効にするDockerデバッグ出力 では、Dockerオプションファイルの場所について説明しています。
10.0.0.0/24のVPCブロックを実行していると仮定すると、DNSは10.0.0.2になります。
CentOS、Red Hat、Amazonの場合:
sed -i -r 's/(^OPTIONS=\")/\1--dns 10.0.0.2 /g' /etc/sysconfig/docker
UbuntuおよびDebianの場合:
sed -i -r 's/(^OPTIONS=\")/\1--dns 10.0.0.2 /g' /etc/default/docker
RDSの受信ルールは、パブリックIPv4ではなく、EC2インスタンスのプライベートIPに設定する必要があります。