AWS CodeBuild

Docker & CodeBuild Lab

  • Docker is an Open Source technology which allows you to create applications based on either Linux or Windows containers
  • A Container is a lightweight standalone executable software package which includes everything the software needs to run - code, runtime environments, libraries, environment settings etc.
  • AWS provides Elastic Container Service as a fully managed clustered platform which allows you to run your Docker images in the cloud
  • AWS CodeBuild is a fully managed build service which runs a set of commands that you define e.g. compiles code, runs tests and produces artifacts that are ready to deploy

Create Elastic Container Service (ECS) Cluster

Done via UI -> select option to enable with EC2. Under ECS UI -> Repositories -> Create Repository (this will show commands)

# retrieve login command to use to authenticate your Docker client to your ECS registry
# note requires permission AmazonEC2ContainerRegistryPowerUser on user
$(aws ecr get-login --no-include-email --region eu-central-1)

# Build docker image using following command
docker build -t mydockerrepo .

# after build completes, tag your image so you can push
docker tag mydockerrepo:latest numbers.dkr.ecr.eu-central-1.amazonaws..com/mydockerrepo:latest

# run following command to push this image to your newly created aws ecr registry
docker push numbers.dkr.ecr.eu-central-1.amazonaws.com/mydockerrepo:latest

Create new task definition. Task size: 512 MiB CPU (unit): 512

Add Container -> Image -> mydockerrepo URI (taken from ECS -> Repository) Port Mappings -> (maps host & container ports) -> 80:80 Actions -> Create Service (should find task definition & cluster by default)

Sample Dockerfile

FROM ubuntu:12.04
# Install dependencies
RUN apt-get update -y
RUN apt-get install -y apache2

# Install apache and write hello world message
RUN echo "Hello Cloud Gurus!!!! This web page is running in a Docker container!" > /var/www/index.html

# Configure apache
RUN a2enmod rewrite
RUN chown -R www-data:www-data /var/www
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

CMD ["/usr/sbin/apache2", "-D",  "FOREGROUND"]

Connecting to CodeCommit and cloning locally

# Use the following commands to connect to your codecommit repo and clone it locally:

# 1) Set Up the Credential Helper
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true

# 2) Clone the repository with the git clone command:
git clone https://git-codecommit.eu-central-1.amazonaws.com/v1/repos/mysourcecoderepo

# Make sure you replace my clone url with your own!

Buildspec.yaml

This tells CodeBuild how to build Docker Image

Services -> CodeBuild -> Create Project -> Source provider: CodeCommit -> Repository (the one containing your buildspec.yml) -> Managed Image -> OS Ubuntu: Image standard:2.0 -> Enable Privileged flag -> Use a buildspec file (this is default, otherwise you can insert build commands here) -> Create Build Project

IAM role may be missing all policies necessary - Needs access to AmazonEC2ContainerRegistryPowerUser

version: 0.2

#env:
  #variables:
     # key: "value"
     # key: "value"
  #parameter-store:
     # key: "value"
     # key: "value"

phases:
  install:
    runtime-versions:
        docker: 18     
    commands:
      - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2&
      - timeout 15 sh -c "until docker info; do echo .; sleep 1; done"
  pre_build:
    commands:
    - echo Logging in to Amazon ECR....
    - aws --version
    # update the following line with your own region
    - $(aws ecr get-login --no-include-email --region eu-central-1)
  build:
    commands:
    - echo Build started on `date`
    - echo Building the Docker image...
    # update the following line with the name of your own ECR repository
    - docker build -t mydockerrepo .
    # update the following line with the URI of your own ECR repository (view the Push Commands in the console)
    - docker tag mydockerrepo:latest 757250003982.dkr.ecr.eu-central-1.amazonaws.com/mydockerrepo:latest
  post_build:
    commands:
    - echo Build completed on `date`
    - echo pushing to repo
    # update the following line with the URI of your own ECR repository
    - docker push 757250003982.dkr.ecr.eu-central-1.amazonaws.com/mydockerrepo:latest
#artifacts:
    # - location
    # - location
  #discard-paths: yes
  #base-directory: location
#cache:
  #paths:
    # - paths

Exam Tips

  • Docker COmmands to build, tag (apply an alias) and push your Docker image to the ECR repository
    • docker build -d myimagerepo .
    • docker tag myimagerepo:latest number.dkr.ecr.eu-central-1.amazonaws.com/myimagerepo:latest
    • docker push myimagerepo:latest number.dkr.ecr.eu-central-1.amazonaws.com/myimagerepo:latest
  • Use buildspec.yml to define the build commands and settings used by CodeBuild to run your build
  • You can override the settings in buildspec.yml by adding your own commands in the console when you launch the build
  • If your build fails, check the build logs in the CodeBuil console and you can also view the full CodeBuild log in CloudWatch