AWS: Pipeline

De TheNets Wiki
Ir para: navegação, pesquisa

Como criar um repositório no CodeCommit, construir uma imagem Docker com o CodeBuild e enviar a imagem para o ECR (Elastic Container Registry).


CodeCommit: Criar um repositório de código

Crie o repositório e adicione dois arquivos:

index.php

1 <?php
2 
3 echo "Hello World<br>";
4 
5 ob_start();
6 var_dump($_SERVER);
7 $server_data_dump = ob_get_clean();
8 
9 echo str_replace("\n", "<br>\n", $server_data_dump);

Crie o Dockerfile: Dockerfile

 1 FROM alpine
 2 
 3 RUN set -x \
 4     && apk add php
 5 
 6 ENV APP_PATH=/app
 7 
 8 WORKDIR  ${APP_PATH}
 9 
10 ADD index.php ${APP_PATH}/
11 
12 EXPOSE 8080
13 
14 CMD ["php", "-S", "0.0.0.0:8080"]


ECR: Criar um repositório no registry

...

CodeBuild: Construa a aplicação

Processo para construir a aplicação e enviar a imagem construída para o ECR.

IAM: Criar policy

Antes de se criar o build, é necessário criar permissões para permitir o CodeBuild acessar o ECR.

Crie a seguinte policy:

CodeBuildBasePolicy-generic

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "logs:CreateLogStream",
                "ecr:*",
                "codecommit:GitPull",
                "s3:GetBucketAcl",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "s3:GetBucketLocation",
                "s3:GetObjectVersion"
            ],
            "Resource": "*"
        }
    ]
}
IAM: Criar role

Agora crie um role que utilizará essa policy:

CodeBuild-generic:

  1. You'll you the CodeBuild, so select it in the "Create new role" page.
  2. Search and select the CodeBuildBasePolicy-generic in the permission page.
CodeCommit: Especificando a rotina de build

Depois de criar as permissões, adicione este arquivo na raiz do repositório ou coloque ele diretamente no "build project":

buildspec.yml

 1 version: 0.2
 2 
 3 phases:
 4   install:
 5     runtime-versions:
 6       docker: 18
 7   pre_build:
 8     commands:
 9       - echo Logging in to Amazon ECR...
10       - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
11   build:
12     commands:
13       - echo Build started on `date`
14       - echo Building the Docker image...          
15       - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
16       - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      
17   post_build:
18     commands:
19       - echo Build completed on `date`
20       - echo Pushing the Docker image...
21       - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
Finalizando a configuração

Alguns dados não devem ficar no repositório de código simplesmente por não fazer parte do código. Tais dados devem ser passados por variáveis de ambiente ou por maneiras mais seguras, no caso de senhas, por exemplo.

O arquivo buildspec.yml acima utiliza 4 variáveis que precisam ser preenchidas. Dentro do "build project", busque "environment" e adicione as 4 variáveis abaixo:

 1 ...
 2     "environmentVariables": [
 3       {
 4         "name": "AWS_DEFAULT_REGION",
 5         "value": "region-ID"
 6       },
 7       {
 8         "name": "AWS_ACCOUNT_ID",
 9         "value": "account-ID"
10       },
11       {
12         "name": "IMAGE_REPO_NAME",
13         "value": "Amazon-ECR-repo-name"
14       },
15       {
16         "name": "IMAGE_TAG",
17         "value": "latest"
18       }
19     ]
20 ...

Preencha essas variáveis durante a criação do projeto de build.