Docker コンテナのログをプロキシ経由で Amazon CloudWatch にパブリッシュしたいと考えています。どうすればできますか?
簡単な説明
Docker コンテナのログを CloudWatch にプッシュするときにプロキシを使用できます。このステップでは、Docker インスタンスとインターネット経由のトラフィックの間に追加のセキュリティレイヤーが追加されます。
解決方法
開始する前に、特定のユースケースに合わせて、基本的な Docker インフラストラクチャを必要に応じて設定してください。
この例では、インフラストラクチャには次のものが含まれます。
- Docker コンテナインスタンスとして動作するプライベートサブネットの一部である Amazon Elastic Compute Cloud (Amazon EC2) インスタンス。
- プロキシインスタンスとして動作するパブリックサブネットの一部である Amazon EC2 インスタンス。
- プライベートサブネットの Amazon EC2 インスタンスの上部にインストールされた Docker デーモン。このデーモンは、すべてのコンテナタスクが標準出力ログを CloudWatch にプッシュするように設定されています。
- オペレーティングシステム (OS) 用の Amazon Linux 2。
Docker インスタンスを準備する
1. Linux 環境変数を設定して、Docker コンテナインスタンスからすべてのトラフィックをプロキシインスタンスにルーティングします。例:
$ export https_proxy=http://192.0.2.86:8888/
$ export http_proxy=http://192.0.2.86:8888/
$ export no_proxy=localhost,169.254.169.254
注意: この変数は、no_proxy 設定の最小要件です。クライアントがプロキシ経由で移動しないようその他の送信先 IP アドレスを必ず含めてください。
2. Docker インスタンスに Docker コンテナをインストールします。例:
$ sudo yum update -y
$ sudo yum install docker -y
$ sudo docker –version
3. Docker インスタンスを最新バージョンに更新します。
4. Docker のインストールを確認します。
$ docker run hello-world
5. 出力を確認します。次のようなインストール確認メッセージが表示されていることを確認してください。
"Hello From Docker!"
"This message shows that your installation appears to be working correctly."
Docker にプロキシ設定を追加する
Docker エンジンが Linux init (Amazon Linux、RHEL 6、または CentOS 6 ディストリビューションを含む) にインストールされている設定の場合:
1. 任意のテキストエディタを使用して設定ファイル /etc/sysconfig/docker を開きます。
2. プロキシ設定をファイルに追加します。例:
# Setup proxy
export http_proxy="http://192.0.2.86:8888/"
export https_proxy="http://192.0.2.86:8888/"
export no_proxy="/var/run/docker.sock,localaddress,localhost,169.254.169.254"
注意: これらは、no_proxy 設定の最小要件です。クライアントがプロキシ経由で移動しないようその他の送信先 IP アドレスを必ず含めてください。
3. 設定ファイルを保存します。
4. Docker サービスを再起動します。
$ sudo service docker restart
Docker エンジンが Linux systemd のシステム管理デーモン (Amazon Linux 2 および RHEL 7 ディストリビューションを含む) にインストールされている設定の場合:
1. Docker サービスの systemd ディレクトリを作成します。例:
$ sudo mkdir -p /etc/systemd/system/docker.service.d
2. 設定に応じて、HTTP または HTTPS プロキシファイルを作成します。例:
$ vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.0.2.86:8888/" "NO_PROXY=localhost,127.0.0.1,169.254.169.254"
$ vim /etc/systemd/system/docker.service.d/https-proxy.conf
[Service]
Environment="HTTPS_PROXY=http://192.0.2.86:8888/" "NO_PROXY=localhost,127.0.0.1,169.254.169.254"
注意: これらは、no_proxy 設定の最小要件です。クライアントがプロキシ経由で移動しないようその他の送信先 IP アドレスを必ず含めてください。
3. 変更をフラッシュします。
$ sudo systemctl daemon-reload
4. Docker の再起動:
$ sudo systemctl restart docker
5. 設定を確認する:
$ systemctl show --property=Environment docker
6. 出力を確認します:
Environment="HTTPS_PROXY=http://192.0.2.86:8888/" "NO_PROXY=localhost,127.0.0.1,169.254.169.254"
Docker ログが CloudWatch にプッシュされていることをテストします
1. Docker で nginx イメージを実行します。
2. Docker の awslogs ログドライバーを使用して、タスクの標準出力ログを CloudWatch Logs にプッシュします。例:
$ sudo docker run -d --name nginx --log-driver=awslogs --log-opt awslogs-region=eu-west-1 --log-opt awslogs-group=DockerLogGroupWithProxy --log-opt awslogs-create-group=true -p 8112:80 nginx
3. curl を使用して最初の Docker タスクのログを生成します。例:
curl localhost:8112
4. CloudWatch コンソールのロググループに送信されたデータを表示します。
5. Docker タスクのログイベントが CloudWatch Logs グループにプッシュされていることを確認します。例えば、次のようなログイベントを探します。
198.51.100.100 - - [19/Sep/2018:10:13:38 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.53.1" "-"
関連情報
コンテナインスタンスでの CloudWatch Logs の使用
Amazon ECS の Docker の基本