위 네가지 요소에 AWS 를 결합하여 간단한 CI/CD 파이프라인을 구성해볼 수 있다.
파이프라인은 아래 그림과 같다.
-> 사용자가 visual code studio를 통해서 코드를 작성하고 이를 Github에 올리면,
-> 이를 AWS Elastic Container Registry에 올리고
-> Github Action 을 통하여 CI/CD를 구현하는 것이다.
#dockerfile -> dockerfile의 경우 확장자가 없습니다.
FROM ubuntu:latest
LABEL MAINTAINER="leosunghojung"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "nginx container"
WORKDIR /desktop/study
CMD [ "nginx", "-g", "daemon off;" ]
EXPOSE 80
docker build -t asc:v1 . # 맨 마지막에 있는 . 빠트리지 않을 것
docker run -p 8080:80 --name practice -d --rm asc:v1
- docker run: Docker 컨테이너를 실행하는 명령어입니다.
- -p 8080:80: 호스트의 8080 포트를 컨테이너의 80 포트에 매핑합니다. 이렇게 함으로써 호스트의 8080 포트를 통해 컨테이너 내부의 웹 서버에 접근할 수 있습니다.
- --name practice: 컨테이너에 practice라는 이름을 지정합니다.
- -d: 컨테이너를 백그라운드에서 실행합니다.
- --rm: 컨테이너가 종료될 때 컨테이너 자체를 자동으로 삭제합니다.
- asc:v1: 실행할 Docker 이미지의 이름과 태그입니다. asc:v1 이미지를 실행합니다.
도커 허브에 업로드하기 위해선 도커허브에 가입을 우선적으로 해야합니다.
# 도커허브의 계정으로 로그인
docker login
# 가입할때 지정한 username을 넣고 태그를 바꿔줘야합니다.
# username이 leo라면 이때는 leo/asc:v1입니다.
docker tag asc:v1 username/asc:v1
# docker image를 dockerhub에 업로드
docker push username/asc:v1
# dockerhub에 올라간 내 이미지 검색
docker search username/asc:v1
잘 올라갔다면 아래와 같이 확인 가능합니다.
# docker-compose.yml
services:
manager:
image: leosunghojung/asc:v1
ports:
- "8002:80"
- dockerfile, docker-compose.yml 파일이 존재하는 폴더를 깃허브와 연결하고,
- 해당 파일들을 레포지토리에 push 합니다.
git status
git add .
git commit -m "add files for CI/CD"
git status
git push
AWS 의 IAM 서비스에서 권한을 설정해줘야합니다.
계정의 보안 자격 증명 탭에서 권한 및 정책을 설정해줄 수 있습니다. 여기서는
-> AmazonEC2ContainerRegistryFullAccess
-> AmazonElasticContainerRegistryPublicAccess
위 두가지를 포함해주어야합니다.
이제 Elastic Container Registry 서비스를 찾아서 들어갑니다.
레포지토리 생성하기를 선택하고, 레포지토리 이름만 채워주고 생성해줍니다.
AWS_ACCESS_KEY
AWS_SECRET_ACCESS_KEY
AWS_REGION
위 세개는 사람마다 다르기때문에 따로 환경변수로 설정해주어야 합니다.
(3) New repository secret 를 선택하면 아래 존재하는 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY를 설정할 수 있습니다.
Variables 탭으로 바꿔주고 (2) New repository secret 를 선택하면 AWS_REGION을 설정할 수 있습니다.
각자의 REGION은 AWS 각자의 계정마다 다를 수 있습니다.
내 보안자격 증명에 들어가 엑세스 키 만들기를 통해 엑세스 키를 발급받을 수 있습니다.
이전에 생성한 Repository의 Action 탭에 들어가서 (2) Set up a workflow yourself 를 선택해줍니다.
workflow는 대부분 yml 파일로 정의됩니다.
ecr.yml
# This is a basic workflow to help you get started with Actions
name: Image push Amazon ECR
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the "main" branch
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
env:
AWS_REGION: us-east-1
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
deploy:
name: Deploy image
# The type of runner that the job will run on
runs-on: ubuntu-latest
environment: production
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Checkout
uses: actions/checkout@v3
- name: Config AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr-public
uses: aws-actions/amazon-ecr-login@v1
with:
registry-type: public
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
REGISTRY: ${{ steps.login-ecr-public.outputs.registry }}
REGISTRY_ALIAS: u2b2c2k9
REPOSITORY: asc_github_action
IMAGE_TAG: ${{ github.sha }}
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
docker build -t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG .
docker push $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG
echo "::set-output name=image::$REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG"
이제 빨간색 오류가 안뜨길 기도하면서 기다립니다.
소리를 질러봅니다!! 나이스!!