Breve descrição
Use um proxy ao enviar logs de contêiner do Docker para o Amazon CloudWatch. Essa etapa adiciona uma camada adicional de segurança entre suas instâncias do Docker e o tráfego vinculado à Internet.
Resolução
Primeiro, configure sua infraestrutura básica do Docker para seu caso de uso específico.
Neste exemplo, a infraestrutura inclui:
- Uma instância do Amazon Elastic Compute Cloud (Amazon EC2) que faz parte de uma sub-rede privada que atua como uma instância de contêiner do Docker.
- Uma instância do Amazon EC2 que faz parte de uma sub-rede pública que atua como uma instância de proxy.
- Um daemon do Docker instalado na parte superior da instância do Amazon EC2 em uma sub-rede privada. Esse daemon está configurado para permitir que todas as tarefas do contêiner enviem seus logs de saída padrão para o CloudWatch.
- Amazon Linux 2 para o sistema operacional (OS).
Além disso, verifique se sua função de AWS Identity and Access Management (AWS IAM) tem CloudWatchAgentAdminPolicy, CloudWatchAgentServerPolicy ou política parecida associada à sua instância privada. A política deve permitir a criação de um grupo de logs, a criação de um fluxo de logs e chamadas de PutLogEvents.
Prepare sua instância do Docker
1. Configure variáveis de ambiente Linux para direcionar todo o tráfego da instância do contêiner do Docker na instância de proxy. Neste exemplo, o endereço IP se aplica à instância do Amazon EC2 atuando como uma instância de proxy:
$ 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
Observação: essas variáveis são os requisitos mínimos da configuração no_proxy. Inclua outros endereços IP de destino que não você deseja que os clientes acessem pelo proxy.
2. Instale o contêiner do Docker em sua instância do Docker. Veja este exemplo:
$ sudo yum update -y
$ sudo yum install docker -y
$ sudo docker version
3. Atualize sua instância do Docker para a versão mais recente.
4. Inicie o daemon do Docker com este comando:
sudo systemctl start docker
5. Permita que o Docker seja executado sem privilégios sudo executando este comando:
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world
6. Verifique a instalação do Docker analisando a saída. Encontre uma mensagem de verificação da instalação como esta:
"Hello From Docker!"
"This message shows that your installation appears to be working correctly."
Adicione sua configuração de proxy ao Docker
Para configurações em que o Docker Engine está instalado no Linux init (incluindo as distribuições de Amazon Linux, RHEL 6 ou CentOS 6):
1. Abra o arquivo de configuração /etc/sysconfig/docker usando o editor de sua preferência.
2. Adicione sua configuração de proxy ao arquivo. Use o endereço IP privado da instância pública ou proxy. Veja este exemplo:
# 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"
Observação: esses são os requisitos mínimos da configuração no_proxy. Inclua outros endereços IP de destino que não você deseja que os clientes acessem pelo proxy.
3. Salve seu arquivo de configuração.
4. Reinicie o serviço Docker:
$ sudo service docker restart
Para configurações em que o Docker Engine está instalado no daemon de gerenciamento do sistema Linux systemd (incluindo as distribuições de Amazon Linux 2 e RHEL 7):
1. Crie um diretório systemd para o serviço Docker. Veja este exemplo:
$ sudo mkdir -p /etc/systemd/system/docker.service.d
2. Crie um arquivo de proxy HTTP ou HTTPS, dependendo de sua configuração. Veja estes exemplos:
$ sudo 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"
Observação: esses são os requisitos mínimos da configuração no_proxy. Inclua outros endereços IP de destino que não você deseja que os clientes acessem pelo proxy.
3. Para limpar suas alterações, use este comando:
$ sudo systemctl daemon-reload
4. Para reiniciar o Docker, use este comando:
$ sudo systemctl restart docker
5. Verifique sua nova configuração:
$ systemctl show --property=Environment docker
6. Revise a saída:
Environment="HTTPS_PROXY=http://192.0.2.86:8888/" "NO_PROXY=localhost,127.0.0.1,169.254.169.254"
Teste se seus logs do Docker são enviados para o CloudWatch
1. Execute a imagem nginx no Docker.
2. Use o driver de log awslogs do Docker para enviar os logs de saída padrão da tarefa para o Amazon CloudWatch Logs. Veja este exemplo:
$ 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. Gere logs de sua primeira tarefa do Docker usando curl. Veja este exemplo:
curl localhost:8112
4. Visualize os dados enviados a seu grupo de logs no console do CloudWatch.
5. Verifique se o evento de logs de sua tarefa do Docker foi enviado ao grupo de logs do CloudWatch. Por exemplo, procure um evento de logs como este:
198.51.100.100 - - [19/Sep/2018:10:13:38 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.53.1" "-"
Informações relacionadas
Monitorando suas instâncias de contêiner
Criar uma imagem de contêiner para uso no Amazon ECS