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.
- 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
-
Abra o Cloud9 no seu ambiente AWS.
-
Crie uma pasta "lab3"
-
Na nova pasta (lab3) crie um template do CloudFormation chamado "ec2-jenkins.yaml"
-
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
Para o github fazer o deploy no CloudFormation é necessário cinfigurar as chaves de acesso a AWS no repositório
- Na tela de iniciar o laborátio no AWS Academy, clique no botão
AWS Details
- Clique no botão
Show
para ver as credenciais de acesso. Elas serão utilizadas no github
-
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
-
Abra o repositório
dataops-lab3
no Github e acesse a abaSettings
-
Clique em
Secrets and variables
e depois emActions
no menu lateral esquerdo -
Clique no botão
New repository secret
6.1. Em
Name
, coloqueAWS_ACCESS_KEY_ID
6.2. Em
Secret
coloque o valor do campoaws_access_key_id
que está no AWS Academy (veja passos 1 e 2 dessas seção)6.3. Clique em
Add secret
-
Faça o mesmo para os outros dois campos:
7.1. Name:
AWS_SECRET_ACCESS_KEY
; Secret: valor deaws_secret_access_key
no AWS Academy7.2. Name:
AWS_SESSION_TOKEN
; Secret: valor deaws_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.
-
Volte ao Cloud9 na AWS
-
Na pasta
dataops-lab3
crie uma nova pasta chamada.github
(preste atenção no ponto no início da pasta) -
Na pasta
.github
crie uma pastaworkflows
-
na pasta
workflows
clie um arquivoactions.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"
-
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
-
Pelo terminal do Cloud9, vincule a pasta
lab3
ao repositóriodataops-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 pastalab3
conforme as instruções deste lab, basta digitarcd lab3
no terminal para acessar a pasta. Vincule o git e envie os arquivos a partir daí -
Verifique se todos os arquivos estão salvos no Cloud9.
-
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.
- Ao fazer o pull request e juntar na branch
main
, aaction
configurada será executada. Você pode acompanhar a execução acessando a abaActions
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%'/>
- Acesse o Serviço do EC2 para ver a instância criada
-
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
-
Volte ao arquivo "ec2-jenkins.yaml" do seu projeto no Cloud9
-
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
- 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
-
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
-
Espere a finalização e tente acessar o Jenkins novamente pelo navegador. O IP continua o mesmo. O serviço deve funcionar
Last update: 2023-09-02 12:52:34