fesousa / dataops-lab3

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

DataOps - Laboratório 3

GitHub e CodePipeline

Controlar versões com GitHub e implantar utilizando CodePipeline e CloudFormation para criar uma instância EC2 com Jenkins.

As instruções do laboratório estão em português. Para alterar o idioma, procure a opção na barra inferior do console AWS.

Objetivos

  • Utilização básica dos comandos git para clonar o repositório, enviar e atualizar arquivos
  • Utilizar Github Actions para provisionar EC2 utilizando entrega contínua (CD)
  • Configurar uma instância EC2 com Jenkins para utilizar com CI/CD

Arquitetura da solução

Template CloudFormation

  1. Abra o Cloud9 no seu ambiente AWS.

  2. Crie uma pasta "lab3"

  3. Na nova pasta (lab3) crie um template do CloudFormation chamado "ec2-jenkins.yaml"

  4. No template, provisione um Security Group que possibilita a conexão por SSH na instância EC2 (porta 22) e uma instância EC2 com as seguintes características (código a seguir):

    a. Nome: ec2-jenkins

    b. Imagem: Amazon Linux 2 (ami-0dc2d3e4c0f9ebd18)

    c. Tipo de instância: t2.micro

    d. User data: bash script para instalar e iniciar o Jenkins

# Versão do template - não alterar
AWSTemplateFormatVersion: "2010-09-09"

# Descrição que será utilizada na stack
Description:
  Provisiona maquina EC2 com jenkins

# parâmetro para chave de acesso ao EC2
Parameters:
  key:
    Type: String
  iamprofile:
    Type: String

# Recursos que serão provisionados
Resources:  
  # Security Group para provisionar EC2
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties: 
      GroupDescription: Porta 22
      GroupName: ec2-jenkins-sg
      SecurityGroupIngress: 
        - CidrIp: 0.0.0.0/0
          FromPort: 22
          ToPort: 22
          IpProtocol: tcp  
  # Provisionar EC2
  EC2:
    Type: AWS::EC2::Instance
    Properties:        
      ImageId: ami-0dc2d3e4c0f9ebd18
      InstanceType: t2.micro
      KeyName: !Sub ${key}
      SecurityGroupIds:
        - !Ref SecurityGroup
      IamInstanceProfile: !Sub ${iamprofile}
      Tags:
        - Key: Name
          Value: ec2-jenkins
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum update –y
          wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
          rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
          yum upgrade -y
          amazon-linux-extras install java-openjdk11 -y
          sudo yum install jenkins -y
          sudo systemctl enable jenkins
          sudo systemctl start jenkins

Configurar Github

Para o github fazer o deploy no CloudFormation é necessário cinfigurar as chaves de acesso a AWS no repositório

  1. Na tela de iniciar o laborátio no AWS Academy, clique no botão AWS Details

  1. Clique no botão Show para ver as credenciais de acesso. Elas serão utilizadas no github

  1. Acesse o Github, crie uma conta (se ainda não tiver) e crie um repositório chamadoo dataops-lab3

    • Veja o material de aula para revisar como criar uma conta no Github e como criar o repositório
  2. Abra o repositório dataops-lab3 no Github e acesse a aba Settings

  1. Clique em Secrets and variables e depois em Actions no menu lateral esquerdo

  2. Clique no botão New repository secret

    6.1. Em Name, coloque AWS_ACCESS_KEY_ID

    6.2. Em Secret coloque o valor do campo aws_access_key_id que está no AWS Academy (veja passos 1 e 2 dessas seção)

    6.3. Clique em Add secret

  3. Faça o mesmo para os outros dois campos:

    7.1. Name: AWS_SECRET_ACCESS_KEY; Secret: valor de aws_secret_access_key no AWS Academy

    7.2. Name: AWS_SESSION_TOKEN; Secret: valor de aws_session_token no AWS Academy

Você deve ver o seguinte resultado no Github

IMPORTANTE

Essas credenciais mudam a cada vez que inicia o ambiente da AWS. Portanto, voc~e deve atualizá-las na tela anterior sempre que iniciar ambiente novamente.

Script Github Action

  1. Volte ao Cloud9 na AWS

  2. Na pasta dataops-lab3 crie uma nova pasta chamada .github (preste atenção no ponto no início da pasta)

  3. Na pasta .github crie uma pasta workflows

  4. na pasta workflows clie um arquivo actions.yml e coloque o seguinte conteúdo:

name: 'Deploy para AWS CloudFormation'

on:
  push:
    branches: [main]
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Fazer checkout da branch
        uses: actions/checkout@v2

      - name: Configurar AWS
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }}
          aws-region: us-east-1

      - name: Deploy no CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with: 
          name: dataops-lab3
          template: ec2-jenkins.yaml
          parameter-overrides: "key=vockey,iamprofile=LabInstanceProfile"

  1. Identifique o terminal de linha de comando no CLou9

    a. O terminal de linha de comando fica na parte inferior da IDE.

    b. caso não esteja vendo o terminal, clique em na parte inferior da IDE e depois em New Terminal

  2. Pelo terminal do Cloud9, vincule a pasta lab3 ao repositório dataops-lab3. Revise o material de aula para instruções de como fazer.

    a. Você deve estar na pasta lab3 no terminal para fazer isso. Se você criou a pasta lab3 conforme as instruções deste lab, basta digitar cd lab3 no terminal para acessar a pasta. Vincule o git e envie os arquivos a partir daí

  3. Verifique se todos os arquivos estão salvos no Cloud9.

  4. Envie o código para seu repositório do Github da forma como fizemos em aula

    a. Execute os comandos add, commit e push na branch develop

    b. No Github faça o pull request e junte (merge) na branch main

OBS: Será solicitado o usuário e senha do github. O usuário é o seu username definido quando criou a conta. A senha deve ser um personal access token. Veja como criar aqui: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic. Verifique se está criando o Tokens (classic). Pode colocar todas as permissões. Guarde este token para utilizar posteriormente em outros laboratórios.

  1. Ao fazer o pull request e juntar na branch main, a action configurada será executada. Você pode acompanhar a execução acessando a aba Actions no repositório do Github. Quano o pipeline terminar com sucesso, você verá a seguinte tela:

<img src="https://raw.github.com/fesousa/dataops-lab3/master/images/Imagem24.png"width='100%'/>

  1. Acesse o Serviço do EC2 para ver a instância criada

  1. Verifique se a serviço do Jenkins está funcionando

    a. No painel do EC2, selecione a instância que foi criada clicando no checkbox

    b. Abaixo, em "Detalhes", copie o IP da instância clicando em abaixo de "Endereço IPv4 público"

    c. Abra uma nova do navegador, cole o IP copiado e complete com a porta 8080. Pressione "Enter" para abrir o Jenkins

    Por exemplo: 12.345.67.890:8080

    d. A instância não responde. É preciso adicionar a regra de entrada no Security Group para possibilitar o acesso a porta 8080

  2. Volte ao arquivo "ec2-jenkins.yaml" do seu projeto no Cloud9

  3. Coloque uma nova regra de entrada na propriedade "SecurityGroupIngress" do Securi-tyGroup para possibilitar a conexão via HTTP na porta 8080, conforme exemplo abaixo (2 trechos entre ##### NOVO - INÍCIO ##### e ##### NOVO - FIM #####). Vamos aproveitar e criar um IP Elástico para a instância, assim quando a ins-tância for reiniciada o IP não vai mudar

# Versão do template - não alterar
AWSTemplateFormatVersion: "2010-09-09"

# Descrição que será utilizada na stack
Description:
  Provisiona maquina EC2 com jenkins

# parâmetro para chave de acesso ao EC2
Parameters:
  key:
    Type: String
  iamprofile:
    Type: String  

# Recursos que serão provisionados
Resources:  
  # Security Group para provisionar EC2
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties: 
      GroupDescription: Porta 22
      GroupName: ec2-jenkins-sg
      SecurityGroupIngress: 
        - CidrIp: 0.0.0.0/0
          FromPort: 22
          ToPort: 22
          IpProtocol: tcp
        ##### NOVO - INÍCIO #####
        - CidrIp: 0.0.0.0/0
          FromPort: 8080
          ToPort: 8080
          IpProtocol: tcp
        ##### NOVO - FIM #####
  ##### NOVO - INÍCIO #####
  #provisionar IP Elástico
  IPAddress:
    Type: AWS::EC2::EIP
  IPAssoc:
    Type: AWS::EC2::EIPAssociation
    Properties:
      InstanceId: !Ref 'EC2'
      EIP: !Ref 'IPAddress'
  ##### NOVO - FIM #####
  # Provisionar EC2
  EC2:
    Type: AWS::EC2::Instance
    Properties:        
      ImageId: ami-0dc2d3e4c0f9ebd18
      InstanceType: t2.micro
      KeyName: !Sub ${key}
      SecurityGroupIds:
        - !Ref SecurityGroup
      IamInstanceProfile: !Sub ${iamprofile}
      Tags:
        - Key: Name
          Value: ec2-jenkins
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum update –y
          wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
          rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
          yum upgrade -y
          amazon-linux-extras install java-openjdk11 -y
          sudo yum install jenkins -y
          sudo systemctl enable jenkins
          sudo systemctl start jenkins
  1. Faça o push da atualização para o repositório do GitHub como feito anteriormente para atualizar o arquivo no repositório

a. add, commit, push, pull request e merge

  1. A atualização do arquivo no GitHub vai disparar a execução do Github Actions para fazer o deploy no CloudFormation. Acesse o CloudFormation na AWS e verifique a atualização em andamento

  2. Espere a finalização e tente acessar o Jenkins novamente pelo navegador. O IP continua o mesmo. O serviço deve funcionar

© 2023 Fernando Sousa

Last update: 2023-09-02 12:52:34

About

License:MIT License