DevSecOpsARTIGO

Executando o Docker no AWS OpsWorks

Este artigo mostrará como criar uma camada personalizada para o Docker, que permite definir com precisão o ambiente de tempo de execução e fazer o deploy do código da aplicação.

O AWS OpsWorks permite o deploy e gerenciamento de aplicações de todas as formas e tamanhos. Camadas OpsWorks possibilitam a criação de blueprints para instâncias EC2 para instalar e configurar o software que o usuário deseja. Este artigo mostrará como criar uma camada personalizada para o Docker. Para uma visão geral do Docker, acesse este link. O Docker permite definir com precisão o ambiente de tempo de execução para uma aplicação e fazer o deploy do código da aplicação e seu tempo de execução como um container do Docker. Você pode usar containers do Docker para suportar novas linguagens como Go ou para incorporar workflows de teste e desenvolvimento de forma integrada com o AWS OpsWorks.

A camada Docker usa receitas do chef para instalá-lo e fazer o deploy de containers para as instâncias EC2 em execução nessa camada. Basta fornecer um Dockerfile e o OpsWorks irá executar as receitas automaticamente para compilar e executar o container. Uma pilha pode ter várias camadas Docker e podemos fazer o deploy de vários containers Docker para cada camada. Podemos ampliar ou alterar as receitas de exemplo do chef para usar o Docker da maneira que funcione melhor para nossos usuários. Se não estiver familiarizado com as receitas do Chef, consulte o Cookbooks 101 para uma introdução a respeito.

Passo 1: criar as receitas

Primeiro crie um repositório para armazenar as receitas do Chef. O OpsWorks suporta Git e Subversion, ou você pode armazenar um pacote de arquivos no Amazon S3. A estrutura de um repositório de cookbook é descrito na documentação do OpsWorks.

A fórmula docker::install instala o software Docker necessário sobre as instâncias:

Bloco-1

A fórmula docker::docker-deploy faz o deploy dos containers do Docker (especificado por um Dockerfile):

bloco-2

Em seguida, crie um repositório para armazenar seu Dockerfile. Abaixo, um Dockerfile de exemplo:

Bloco-3

Passo 2: criar uma pilha OpsWorks

Agora você está pronto para usar essas receitas com o OpsWorks. Abra o console do OpsWorks:

  1. Selecione Add a Stack para criar uma pilha OpsWorks;
  2. Dê a ela um nome e selecione Advanced;
  3. Defina Use custom Chef Cookbooks para Yes;
  4. Defina o Repository type para Git;
  5. Configure o Repository URL para o repositório onde você armazenou as receitas criadas na etapa anterior;
  6. Clique no botão Add Stack na parte inferior da página para criar a pilha.
 Passo 3: adicionar uma camada
  1. Selecione Add Layer;
  2. Escolha Custom Layer, defina o nome para “Docker”, abrevie para “docker” e clique em Add Layer;
  3. Clique em Recipes para editar a camada e role a página até a seção Custom Chef recipes. Você observará que há vários headings — Setup, Configure, Deploy, Undeploy e Shutdown — que correspondem a eventos do ciclo de vida do OpsWorks. O OpsWorks desencadeia esses eventos nos pontos chave do ciclo de vida da instância, que executa as fórmulas associadas;
  4. Entre com docker::install na setup box e clique + para adicioná-lo à lista;
  5. Entre com docker::docker-deploy na caixa de deploy e clique + para adicioná-lo à lista;
  6. Clique no botão Save na parte inferior para salvar a configuração atualizada.

docker-layer

Passo 4: adicionar uma instância

A página Layer deve agora mostrar a camada Docker. No entanto, a camada apenas controla como configurar as instâncias. Agora precisamos adicionar algumas instâncias à camada. Clique em Instances no painel de navegação e, em Docker layer, clique em + Instance. Para este passo a passo, basta aceitar as configurações padrão e clicar em Add Instance para adicionar a instância à camada. Clique em start na coluna da linha Actions para iniciar a instância. O OpsWorks irá, então, iniciar uma nova instância EC2 e executar as fórmulas de Setup para configurar o Docker. O status da instância mudará para online quando estiver tudo pronto.

Passo 5: adicionar um aplicativo & deploy

Uma vez iniciadas as instâncias:

  1. No painel de navegação, clique em Apps e, na página Apps, clique em Add an app;
  2. Na página App, forneça-lhe um nome;
  3. Defina o tipo de aplicativo para other;
  4. Especifique o tipo de repositório do aplicativo;
  5. Especifique o URL do repositório do aplicativo. Aqui é onde reside o seu Dockerfile e é geralmente um repositório separado do repositório cookbook especificado no passo 2.
  6. Defina as seguintes variáveis de ambiente:
    » container_port – Defina esta variável para a porta especificada pelo parâmetro EXPOSE no Dockerfile.
    » service_port – Defina esta variável para a porta que o container explorará na instância para o mundo exterior. Nota: certifique-se que seus grupos de segurança permitam tráfego de entrada para a porta especificada em service_port.
    » layer – Defina esta variável para o nome abreviado da camada que deseja que o container faça o deploy (do passo 3). Isso permite ter múltiplas camadas docker com diferentes aplicativos passando por deploy, como o front-end de um app web e um back-end.» Para o nosso exemplo, defina container_port=80, service_port=80 e layer=docker. Também podemos definir variáveis de ambiente adicionais que são automaticamente passadas para o container Docker, por exemplo, um endpoint de banco de dados com o qual o aplicativo se conecta.
  7. Mantenha os valores padrão para as definições restantes e clique em Add App.
  8. Para instalar o código no servidor, é preciso fazer o deploy da aplicação. Levará algum tempo até que as instâncias passem pelo boot completo. Uma vez que surjam como “online” na visualização de instâncias, navegue até Apps e clique em deploy na coluna Actions. Se criar várias camadas docker, note que embora a implementação seja padrão a todas as instâncias na pilha, os containers só serão implementados na camada especificada na variável de ambiente layer.
  9. Uma vez que a implementação esteja completa, você poderá ver seu app clicando no endereço IP público do servidor. Você pode atualizar seu Dockerfile e refazer o deploy a qualquer momento.

docker-app

Passo 6: tornando os atributos dinâmicos

As fórmulas escritas para este artigo passam variáveis de ambiente dentro do container Docker quando ele é iniciado. Se você precisa atualizar a configuração enquanto o aplicativo é executado, como uma senha de banco de dados, soluções como etcd podem criar atributos dinâmicos. Um servidor etcd pode ser executado em cada instância e ser populado por atributos da instância OpsWorks. Você pode atualizar atributos do OpsWorks (logo, os valores armazenados na etcd também), a qualquer momento. E esses valores ficam imediatamente disponíveis para aplicativos rodando em containers Docker. Um artigo futuro abordará como criar fórmulas para instalar o etcd e passar atributos OpsWorks, incluindo variáveis de ambiente de aplicação para os containers do Docker.

Resumo

Estas instruções demonstraram como usar o OpsWorks AWS e o Docker para fazer o deploy de aplicativos, representado por Dockerfiles. Também é possível usar camadas Docker com outros recursos OpsWorks, incluindo o escalonamento de instância automática e integração com o Elastic Load Balancing e o Amazon RDS.

***

Artigo escrito por Chris Barclay. 

Este artigo faz parte do AWSHUB, rede de profissionais AWS gerenciado pelo iMasters.

Chef Evangelist na Amazon Web Services.

Ver perfil