Você está na página 1de 11

Provisionando instancias AWS com cloudinit e codedeploy

Quando falamos de provisionar , estamos falando de praticamente fazer um deploy, enfim,


deixar sua instancia (ou máquina virtual) pronta para uso imediato, com todos os softwares,
usuários e serviços necessários para atender uma demanda.

Para isso podemos usar algumas ferramentas do AWS. Na realidade existem muitas, mas hoje
vou falar de apenas duas: cloudinit e codedeploy.

CloudInit

O CloudInit mais simples e fácil de usar, já é configurada no momento da criação da instancia.


Ao iniciar uma instancia temos a opção de passar comandos Linux, obviamente para uma
máquina Linux.

Você pode dizer, mas só isso, um simples script Linux. Sim. Neste momento veremos esses dois
caras, mas saiba que existem soluções bem mais completas como CloudFormation, AWS
OPsWorks, entre outras.

Bem, voltando ao CloudInit, no momento que forma dar um Lauch na instancia, devemos
especificar os dados de usuário da instancia na execução.

No item Configurar detalhes da instancia (passo 3), expanda o item Advanced Details, e a
partir dai, basta digitar seu código shell em User data.

Simples, fácil e rápido. É para ser somente isso mesmo.

Mas quando falamos de deploy, podemos usar o AWS para criar uma rotina para fazer deploy
de uma aplicação, por exemplo, clicando apenas em um botão, podemos usar o CodeDeploy
da AWS.
CodeDeploy e GitHub

O CodeDeploy é um serviço que automatiza implantações de software em diversos serviços,


como por exemplo as instancias EC2.

Ele facilita de forma rápida de novos recursos, evita erros humanos, automatiza implantação
de software automaticamente. E pode atingir varias instancias com a mesma implantação.

Imagine o cenário: Um LoadBalance com 4 Servidores WEB rodando nas instancias EC2. Sua
aplicação está localizado no github e você gostaria que quando você fizer atualizações no git,
seja feito deploy em todos os servidores com as atualizações.

Obs: Obviamente esse não seria o processo correto. Primeiramente iriamos mandar para
homologação, testar e posteriormente em produção. E para fazer tudo isso
automaticamente, toda vez que houver atualização no github, é feito deploy automático,
poderíamos usar o Jekins, utilizado para fazer este processo de entrega continua.

Em nossa caso, não iremos fazer deploy automático, quando o projeto for alterado no github,
e sim pedir para o CodeDeploy, fazer deploy desse novo código em todas nossas máquinas em
LoadBalance.

O primeiro passo é a criação das Roles. Para as instancias crie um role com as seguintes
permissões:

 AutoScaling:Describe
 cloudFormation:Describe
 cloudFormation:GetTemplate
 s3.Get
 s3.List

Essa role será aplicada diretamente em cada instancia, que abaixo chamei de WEBTOTAL.
Já para o nosso CodeDeploy precisamos de uma permissão do serviço AWSCodeDeployRole.
Veja abaixo:

Com isso pronto podemos já iniciar nossa instancias. Caso você use a Instancia Linux do
próprio AWS, não será necessário instalar o agente do codedeploy. Mas se optar, por exemplo,
por uma instancia Ubuntu ou Centos, será necessário instalar o agente. Veja o processo
abaixo:

sudo apt-get update

sudo apt-get install python-pip

sudo apt-get install ruby2.0

sudo apt-get install wget

cd /home/ubuntu

wget https://aws-codedeploy-us-east-1.s3.amazonaws.com/latest/install

chmod +x ./install

sudo ./install auto


Note que o agente deve ser baixando de sua própria área. Acima estamos baixando de Virginia
então o caminho usa o valor us-east-1, caso seja São Paulo o caminho para o agente seria:
https://aws-codedeploy-sa-east-1.s3.amazonaws.com/latest/install. E também seria possível
usar o cloudinit para fazer todo esse processo de instalação do agente, sem termos que
realmente logar na máquina e fazer todo procedimento.

Bem, como usaremos github para armazenamento de nossa aplicação, então será necessária a
criação do repositório, bem como envio da aplicação para o git. Em nosso exemplo, ou se você
quiser usar para teste, use o https://github.com/blogstato/codedeploy.git

Neste git, termos os seguintes arquivos e pastas:

 index.html Página que será exibida em nosso servidor


 appspec.yml Esse é o código que será responsável pelas ações BeforeInstall,
ApplicationStop. Existem outras possibilidade como Install, AfterInstall, entre outros,
veja mais opções e informações em
https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-
structure-hooks.html#appspec-hooks-lambda.
 Pasta scripts Contendo os arquivos:
o installdependencies responsável por verificar e instalar o apache2
caso necessário.
o start_server Iniciar o apache
o stop_server Para o apache.

Veja abaixo o conteúdo do arquivos appspec, onde serão tomadas as decisões do ciclo de vida
desse deploy:

version: 0.0
os: linux
files:
- source: /index.html
destination: /var/www/html/
hooks:
BeforeInstall:
- location: scripts/install_dependencies
timeout: 300
runas: root
- location: scripts/start_server
timeout: 300
runas: root
ApplicationStop:
- location: scripts/stop_server
timeout: 300
runas: root

Abaixo os arquivos installdependencies, start_server e stop_server.

 installdependencies

#!/bin/bash

if which apache2 > /dev/null ; then


exit 0
fi

apt-get install apache2

 start_server

#!/bin/bash
service apache2 start

 stop_server

#!/bin/bash
isExistApp = `pgrep apache2`
if [ -e /var/www/html/index.html ];then
rm -rf /var/www/html/index.html
fi

if [[ -n $isExistApp ]];then
service apache2 stop
fi

Enfim tudo pronto para iniciarmos a configuração do nosso codedeploy.


Faça as seguintes etapas:

1. Vá para o menu AWS | CodeDeploy


2. Se não existirem projetos clique em Get Start para iniciar um novo projeto, caso
contrario vá em Create Application.
3. De um nome para aplicação e para o grupo de deploy.
4. Selecione In-place deployment.
5. Em Envoriment configuration, selecione Amazon EC2 instances, em Key selecione
Name, e Value informe o nome de sua instancia.

6. Em Deployment Configuration, selecione CodeDeployDefault. OneaTime.


7. Em ServiceRole, selecione a role criada anteriormente para o serviço CodeDeploy. Em
meu caso chamado de CODEDEPLOY.

8. Clique em Save para Salvar.


Obs: A instancia já deve ter sido configurado com sua Role no momento do iniciar a instancia.

Deployment Configuration trata-se da forma que ele irá atuar para fazer deploy em várias
instancias. Em nosso caso não faz muita diferença pois não temos outras instancias e o
comportamento escolhido não trará alterações.

Vemos acima duas aplicações. A Deploy-WEB e WEBDEPLOY, que foi criada neste momento.

Uma vez finalizado, basta agora fazer o deploy.

Selecione sua aplicação, clicando nela. Após seleciona-la, marque-a e em Actions selecione
Deploy ou Deploy new revision.

Em repository Type, selecione My application is stored in GitHub.


Informe a conta do GitHub em GitHub account, em seguida clique em Connect to
GitHub.

Após conectar informe o nome do repositório, seu usou o git do blog basta informar
blogstato/codedeploy em Repository Name, e
d65d3244710541bd5106a236c480fc659254ea2c em CommitID.
Todas outras opções podem ficam padrõa sem alteração, mas tratam por exemplo de
RoolBack . Uma opção interessante seria Overwrite the contente, em Content
Options. Esse opção sobrescreve qualquer arquivo que já existe na instancia que tenha
o mesmo nome de nossa aplicação.

Enfim.... clique em Deploy.

Ao Final do processo, você terá uma saída parecida com a abaix:

Você pode visualizar os eventos, clicando no link do código do Deploy (Acime d-


DJRGARCQU) e depois View events.
Como podemos ver acima, todas etapas tiveram sucesso. E partir do IP da instancia
poderemos ver a página do projeto que foi provisionada.

Conclusão

Temos muitas ferramentas de provisionamento e deploy como Vagrant, Puppet, Terraform,


CloudForm e etc. Mas essa é mais uma opção. Se usarmos cloudinit e codedeploy juntos
podemos ter resultados muito bons.

Com outras ferramentas, como jekins o resultado pode ser melhor ainda. Abaixo links para
consulta:

 aws.amazon.com/codedeploy
 aws.amazon.com/pt/codedeploy/
 https://aws.amazon.com/pt/codedeploy/pricing/
 https://aws.amazon.com/pt/documentation/codedeploy/
Espero que gostem.

André Stato Filho

Você também pode gostar