web-dev-qa-db-ja.com

Dockerコンテナー内からRDSにアクセスしても、セキュリティグループを通過しませんか?

Dockerコンテナー内のEC2でRDSデータベースを使用するWebサーバーを実行しようとしています。

EC2ホストのロールがRDSにアクセスできるようにセキュリティグループを設定しました。ホストマシンから直接アクセスしようとすると、すべてが正しく機能します。

ただし、ホスト上で単純なコンテナを実行してRDSにアクセスしようとすると、セキュリティグループが許可していないかのようにブロックされます。何度も試行錯誤を繰り返した結果、実際にはコンテナのリクエストがEC2ホストから送信されているようには見えないため、ファイアウォールはノーと言っています。

Dockerコンテナーで--net = Hostを設定することにより、短期間にこれを回避することができましたが、これにより、ポートをマップできるなど、多くの優れたDockerネットワーク機能が壊れます(つまり、それぞれを確認する必要があります)コンテナのインスタンスは手動で別のポートでリッスンします)。

誰かがこれを回避する方法を見つけましたか? AWSリソースを実際に使用している場合、AWSでコンテナーを実行することはかなり大きな制限のようです。

18
Alex Schokking

何が起こっているのかを把握し、他の人を助けるためにここに投稿しました。

コンテナー内からの要求は、プライベートではなく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"
9
Alex Schokking

はい、コンテナはRDSのパブリックIPにヒットします。ただし、コンテナがRDSと通信できるようにするために、低レベルのDockerオプションを調整する必要はありません。 ECSクラスターとRDSインスタンスは同じVPCにある必要があり、セキュリティグループを介してアクセスを構成できます。これを行う最も簡単な方法は、次のとおりです。

  1. RDSインスタンスページに移動します。
  2. DBインスタンスを選択し、ドリルインして詳細を表示します
  3. セキュリティグループIDをクリックします
  4. [受信]タブに移動し、[編集]を選択します
  5. そして、ソースカスタムのMySQL/Auroraタイプのルールがあることを確認します。
  6. カスタムソースを入力するときは、ECSクラスターの名前を入力するだけで、セキュリティグループ名が自動的に入力されます

このチュートリアルにはスクリーンショットがあります どこへ行くかを示しています。

完全な開示:このチュートリアルでは、Bitnamiのコンテナーを取り上げ、私はBitnamiで働いています。しかし、ここで表明された考えは私自身のものであり、Bitnamiの意見ではありません。

25
Neal

@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
1
Joe Lawson

RDSの受信ルールは、パブリックIPv4ではなく、EC2インスタンスのプライベートIPに設定する必要があります。

0