Django 프로젝트 배포 전 연습 3번째 웹 애플리케이션 및 CircleCI 준비

여기서 할 일



여기에서는 컨테이너에서 움직이는 웹 애플리케이션을 작성하고 애플리케이션의 CI 설정까지 수행한다. CI에서는 테스트, Docker 이미지의 빌드 이미지를 ECR에 푸시할 때까지 실시하여 준비를 확인한다.

이미지 빌드docker build -t djangoproject:ver1 .
8000 포트에서 컨테이너 시작docker run -itd --name djangoproject --mount type=bind,source="$(pwd)"/code/,target=/code/ djangoproject:ver1
장고 프로젝트 시작docker exec djangoproject djang-admin startproject djangoproject /code/project
helloapp 앱 시작docker exec djangoproject python3 /code/project/manage.py startapp helloapp /code/project/hello

작업용 Docker 관련 파일



이 작업용 Docker라고 하는 것은, 주로 Terraform에 의한 AWS에의 환경 구축에 사용한다. 나의 환경이 Windows이므로 Docker를 사용하고 있을 뿐이므로, 필요가 없으면 굳이 만들 필요는 없을지도.

Dockerfile
From python:3.7
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y \
    vim
RUN mkdir /terraform
WORKDIR /terraform
RUN mkdir .aws
ADD .aws .aws
RUN pip install awscli
RUN wget https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip && \
    unzip ./terraform_0.12.24_linux_amd64.zip -d /usr/local/bin/
RUN cp -r .aws ~

이미지 빌드docker build -t work:ver1 .
컨테이너 시작docker run -itd --name work --mount type=bind,source="$(pwd)"/terraform/,target=/terraform/ work:ver1

GitHub 준비



github에 리포지토리를 2개 작성(djangoproject용과 terraform용)

도중에 .gitignore에 terraform 플러그인이 제외되지 않고 100MB 이상의 파일로 튕겨져 버렸습니다. 아래의 명령으로 대응할 수 있었습니다. 참고로 해 주신 기사의 링크는 이쪽.
htps //w w. 왈리 x. 이 m/jp/bぉg/2013-10-기 갓 b-ぁr게-후ぇぇs. HTML
$ git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch でかいファイル.tar.gz' \
  --prune-empty --tag-name-filter cat -- --all
$ git commit --amend -CHEAD
$ git push

CircleCI에서 CI 설정



CircleCI에서는 Django 프로젝트의 빌드와 빌드한 Docker 이미지를 ECR에 push할 때까지 실시한다.

흐름으로는
1. Django 프로젝트 만들기 → GitHub로 push
2. CircleCI에서 CI 실행 → CircleCI에서 GitHub 프로젝트가 체크 아웃되고 Docker 이미지가 빌드됩니다.
3. 빌드가 끝나면 Docker 이미지가 ECR로 푸시됩니다.
라는 느낌입니다.

그래서 다음과 같은 준비를 했습니다.
- terraform 용 및 Django 프로젝트 용 Git 저장소 작성
- terraform을 사용하여 ECR 리포지토리 생성
- CircleCI가 ECR로 Docker 이미지를 푸시하는 IAM 사용자 생성
- 장고 프로젝트의 CI에 대한 CircleCI 설정

ECR 리포지토리 생성



ECR 리포지토리에 대해서는, 이하와 같은 디렉토리 구성으로 작성했습니다.

terraform/
|-ecr/
 |-.terraform/
 |-aws_ecr_repository.tf
 |-config.tf

aws_ecr_repository.tf
resource "aws_ecr_repository" "sample-image" {
    name = "sample-image"
}

config.tf
terraform {
    backend "s3" {
      bucket    = "保管するS3バケットの名前"
      key   = "ecr/terraform.tfstate"
      region    = "ap-northeast-1"
    }
}

provider "aws" {
    region = "ap-northeast-1"
}

CircleCI용 IAM 사용자 만들기



IAM용 terraform의 디렉토리 구성은 이런 느낌.

terraform/
|-iam/
 |-.terraform/
 |-aws_iam_policies/
  |-ecr_policy.json
 |-aws_iam_policy.tf
 |-aws_iam_user_policy_attachment.tf
 |-aws_iam_user.tf
 |-config.tf

aws_iam_user.tf
resource "aws_iam_user" "deploy-user" {
    name = "deploy-user"
}

aws_iam_policy.tf
resource "aws_iam_policy" "deploy" {
  name      = "deploy"
  path      = "/"
  description   = "deploy policy"
  policy    = file("aws_iam_policies/ecr_policy.json")
}

aws_iam_user_policy_attachment.tf
resource "aws_iam_user_policy_attachment" "deploy-attach" {
  user      = aws_iam_user.deploy-user.name
  policy_arn    = aws_iam_policy.deploy.arn
}

config.tf
terraform {
  backend "s3" {
    bucket = "保管するS3のバケットの名前"
    key    = "iam/terraform.tfstate"
    region = "ap-northeast-1"
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

ecr_policy.json
{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
    "Action": [
      "ecr:GetAuthorizationToken",
      "ecr:BatchCheckLayerAvailability",
      "ecr:GetDownloadUrlForLayer",
      "ecr:GetRepositoryPolicy",
      "ecr:DescribeRepositories",
      "ecr:ListImages",
      "ecr:BatchGetImage",
      "ecr:InitiateLayerUpload",
      "ecr:UploadLayerPart",
      "ecr:CompleteLayerUpload",
      "ecr:PutImage"
    ],
    "Resource": "*"
      }
    ]    
}


위의 tf 파일을 바탕으로 terraform init, terraform plan, terraform apply를 실행하여 IAM 사용자를 만들었습니다. 또한, 작성한 사용자의 인증 정보로부터 액세스 키 관계의 정보를 취득한다. 이것은 다음 단계의 CircleCI 설정 중에 환경 변수에서 설정됩니다.

CircleCI 설정



장고 프로젝트 용 설정. circleci/config.yml은 다음과 같습니다.

circleci/config.yml
version: 2.1

orbs:
  python: circleci/[email protected]

jobs:
  build-and-test:
    executor: python/default
    steps:
      - checkout
      - python/load-cache
      - python/install-deps
      - python/save-cache
      - run: sudo chmod u+x manage.py
      - run:
          command: ./manage.py test
          name: Test
  build-image:
    docker:
      - image: docker:18.09.0
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: install aws cli
          command: |
            apk add --no-cache --update py-pip
            pip install awscli
      - run:
          name: login ecr
          command: |
            $(aws ecr get-login --no-include-email --region ap-northeast-1)
      - run:
          name: build image
          command: |
            docker build -t ${ECR_DOMAIN}:$CIRCLE_SHA1 -t ${ECR_DOMAIN}:latest .
      - run:
          name: Push docker image
          command: |
            docker push ${ECR_DOMAIN}:$CIRCLE_SHA1
            docker push ${ECR_DOMAIN}:latest

workflows:
  main:
    jobs:
      - build-and-test
      - build-image:
          requires:
            - build-and-test
          filters:
            branches:
              only: master


또한 아래 그림과 같이 AWS에 대한 액세스 키 관계 정보를 환경 변수에 추가합니다.


이 .circleci/config.yml을 포함한 Django 프로젝트를 GitHub에 푸시하면,
CircleCI의 pipeline이 RUN 상태가 되고, ECR에 Docker 이미지가 push된다.

좋은 웹페이지 즐겨찾기