Criando Pipeline CI/CD Nginx na AWS

Curso teórico e prático
Voltar

Material complementar:


Conceito:

Curso teórico e prático para criação de Pipeline CI/CD na AWS free tier, para automatizar implantação de projeto Nginx. Etapas via console AWS, e acessos via AWS CloudShell e máquina terceira.


Objetivo:

O objetivo do curso é criar Pipeline para automatizar processo de capturar código em repositório do GitHub e publicar em cloud AWS. Primeiramente, será criado o repositório no GitHub contendo o arquivo .home, também os arquivos de configuração do nginx na máquina virtual disponibilizada via instância EC2 na AWS. Após a criação do repositório no GitHub, será criada uma instância EC2 na AWS do tipo Ubuntu Server, onde será habilitado todo o tipo de tráfego de entrada para acesso ao projeto nginx, criando-se funções IAM com permissões de acesso a serviços de CodeDeploy e S3. Após finalização de preparo da máquina EC2 Ubuntu na AWS, será criado aplicativo CodeDeploy que receberá função de permissão em grupo de implementação, que servirá para deploy da pipeline na captura do código via CodeCommit e armazenamento do código em bucket S3, além do vínculo em instância EC2. Por fim, será criada pipeline, via CodePipeline na AWS, que vinculará source como provedor GitHub e repositório em que encontram-se arquivos para publicação. As etapas de compilação e testes serão ignoradas nesse exemplo. Após isso, na etapa de implementação, provedor CodeDeploy usará aplicativo CodeDeploy criado, e grupo de implantação criado para realizar implantação dos arquivos em bucket S3, vinculados no EC2, para a pasta do nginx e, consequentemente, disponibilizá-los publicamente nas portas e protocolos com permissões de acesso externo. Para finalizar, será realizada alteração no arquivo index do nginx que, automaticamente, disparará gatilho ao CodeCommit da pipeline, fazendo com que pipeline seja reexecutada, onde CodeCommit capturará novos arquivos do source GitHub, os enviará para pasta zip em bucket S3, que consequentemente está vinculado à instância EC2 e, devidas suas configurações, disponibilizadas, alterações disponibilizadas em hospedagem de serviço nginx ao público.


Pré-requisitos:

O curso será desenvolvido via ambiente Windows, utilizando recursos nativos do sistema operacional, como WSL. Porém, pode-se também utilizar outros ambientes desktop, dadas devidas especificidades de cada sistema operacional. As etapas desenvolvidas no console AWS serão as mesmas para todos sistemas operacionais.

  • Conhecimentos de Git e GitHub, programação web básica e comandos básicos Linux;
  • Git local;
  • Conta gratuita no GitHub;
  • Conta gratuita na AWS (necessário cartão de crédito, sem custos dentro do limite gratuito Free Tier).

Passo a passo:


--- CRIAR REPOSITÓRIO GITHUB ---
GitHub / New repository
- Nome: nginx-aws-pipeline
- Marcar como público
Criar repositório
- Fazer clone do repositório localmente: git clone urlRepositorio
- Acessar pasta do repositório localmente: cd nginx-aws-pipeline
- Criar arquivo .gitattributes, com conteúdo: *.sh text eol=lf
- Criar arquivo index.html com conteúdo: <h1>Ola mundo</h1>
- Criar arquivo appspec.yml com conteúdo:
version: 0.0
os: linux

files:
  - source: /
    destination: /var/www/html

hooks:
  BeforeInstall:
    - location: scripts/install_nginx.sh
      timeout: 300
      runas: root

  ApplicationStart:
    - location: scripts/start_nginx.sh
      timeout: 300
      runas: root

- Criar pasta "scripts", com arquivos:
- install_nginx.sh, com conteúdo:
#!/bin/bash
apt update -y
apt install nginx -y

- start_nginx.sh,com conteúdo:
#!/bin/bash
systemctl restart nginx

- Marcar scripts como executáveis (via Git Bash): chmod +x scripts/*.sh
- Enviar ao GitHub:
-- git add .
-- git commit -m "Arquivos iniciais"
-- git push

--- CRIAR INSTANCIA EC2 ---
EC2 / Instâncias / Executar instâncias
- Nome: nginx-pipeline-ec2
- AMI: Ubuntu Server (nível gratuito)
- Criar par de chaves:
-- Nome: curso-pipeline-aws-key1
-- Tipo: RSA
-- Formato: conforme SO de sua máquina (.pem)
-- Baixar par de chaves e salvar em local seguro
- Rede:
-- Atribuir IP público: habilitado
-- Grupo de segurança: criar novo grupo
--- Permitir tráfego SSH (porta 22) de qualquer local (0.0.0.0/0)
--- Permitir tráfego HTTP de qualquer local
--- Permitir tráfego HTTPS de qualquer local
Executar instância (Copiar IPv4 público e testar no browser http://ipv4Publico)

--- CRIAR FUNÇÃO IAM ---
IAM / Funções / Criar perfil
- Tipo de entidade confiável: Serviço AWS
- Caso de uso: EC2
- Permissões: anexar políticas existentes
-- AWSCodeDeployFullAccess
-- AmazonS3FullAccess
- Nome da função: EC2-CodeDeploy-Role
Criar perfil

EC2 / Instâncias / Selecionar instância criada / Ações de instância / Segurança / Modificar função IAM
- Atribuir função: EC2-CodeDeploy-Role
Atualizar função do IAM

--- ACESSAR INSTÂNCIA EC2 ---
EC2 / Instâncias / Selecionar instância criada / Conectar
- Conecte-se usando um IP público (IPv4)
Conectar

- Instalar dependências, via comando: sudo apt update -y && sudo apt install -y ruby wget
- Instalar CodeDeploy Agent, via comando: wget https://aws-codedeploy-sa-east-1.s3.sa-east-1.amazonaws.com/latest/install && chmod +x install && sudo ./install auto
- Verificar se CodeDeploy Agent está active, via comando: sudo systemctl status codedeploy-agent

--- CRIAR CODEDEPLOY ---
CodeDeploy / Aplicativos / Criar aplicativo
- Nome do aplicativo: nginx-app
- Plataforma de computação: EC2/On-Premises
Criar aplicativo

--- CRIAR FUNÇÃO IAM ---
IAM / Funções / Criar perfil
- Tipo de entidade confiável: Serviço AWS
- Caso de uso: CodeDeploy
- Permissões: anexar políticas existentes
-- AWSCodeDeployRole
-- AWSCodeDeployFullAccess
- Nome da função: CodeDeploy-Service-Role
Criar perfil

--- CRIAR GRUPO DE IMPLEMENTAÇÃO CODEDEPLOY ---
CodeDeploy / Aplicativos / Selecionar aplicativo criado / Aba grupo de implantação / Criar grupo de implantação
- Nome do grupo de implantação: nginx-deploy-group
- Função de serviço: selecionar CodeDeploy-Service-Role
- Tipo de implantação: No local
- Configuração de ambiente: selecionar instância do Amazon EC2
- Grupo de tags: selecionar tags existentes
-- Chave: Name
-- Valor: nginx-pipeline-ec2
- Instalar o agente do AWS CodeDeploy: Nunca
- Configuração de implantação: CodeDeployDefault.AllAtOnce
- Balanceamento de carga: Desabilitar
Criar grupo de implantação

--- CRIAR PIPELINE CODEPIPELINE ---
AWS / CodePipeline / Pipelines / Criar pipeline
- Category: Criar pipeline personalizado
Avançar
- Nome: nginx-github-pipeline
- Função de serviço: Nova função de serviço
- Nome da função: nginx-github-pipeline-role
Avançar
- Origem (provedor): GitHub (por meio do aplicativo OAuth)
- Conectar ao GitHub / Autorizar AWS CodePipeline
- Repositório: selecionar nginx-aws-pipeline
- Ramificação: selecionar main
Avançar
- Compilação: ignorar etapa de compilação
- Teste: ignorar etapa de teste
- Implantação (Provedor): AWS CodeDeploy
- Nome do aplicativo: selecionar nginx-app
- Grupo de implantação: selecionar nginx-deploy-group
Avançar / Criar pipeline

--- ACESSAR PROJETO PIPELINE ---
- Conferir no browser: http://ipv4Publico
- Conferir no Ubuntu Server: curl http://ipv4Publico

--- FAZER ALTERAÇÕES NO PROJETO ---
- Alterar arquivo index.html, com conteúdo: <h1>Ola mundo - Atualizado</h1>
- Enviar ao GitHub:
-- git add .
-- git commit -m "Atualização do index.html"
-- git push
- Verificar execução automática do Pipeline CodePipeline
- Conferir alterações no browser: http://ipv4Publico
- Conferir alterações no Ubuntu Server: curl http://ipv4Publico

--- Exclusões ---
- EC2 / Instâncias / Selecionar instância criada / Ações de instância / Estado da instância / Encerrar instâncias
- EC2 / Par de chaves / Selecionar par de chaves criado / Ações / Excluir par de chaves
- EC2 / Grupos de segurança / Selecionar grupo de segurança criado / Ações / Excluir grupo de segurança
- S3 / Buckets / Selecionar bucket criado / Esvaziar e Excluir
- CodePipeline / Pipelines / Selecionar pipeline criado / Ações / Excluir
- CodeDeploy / Aplicativos / Selecionar aplicativo criado / Ações / Excluir aplicativo
- IAM / Funções / Selecionar funções criadas / Ações / Excluir
- IAM / Políticas / Selecionar políticas criadas / Ações / Excluir
- GitHub / Repositórios / Selecionar repositório criado / Configurações / Opções avançadas / Excluir este repositório

Elaborado por Mateus Schwede
ubsocial.github.io