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.tfresource "aws_ecr_repository" "sample-image" {
name = "sample-image"
}
config.tfterraform {
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.tfresource "aws_iam_user" "deploy-user" {
name = "deploy-user"
}
aws_iam_policy.tfresource "aws_iam_policy" "deploy" {
name = "deploy"
path = "/"
description = "deploy policy"
policy = file("aws_iam_policies/ecr_policy.json")
}
aws_iam_user_policy_attachment.tfresource "aws_iam_user_policy_attachment" "deploy-attach" {
user = aws_iam_user.deploy-user.name
policy_arn = aws_iam_policy.deploy.arn
}
config.tfterraform {
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.ymlversion: 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된다.
Reference
이 문제에 관하여(Django 프로젝트 배포 전 연습 3번째 웹 애플리케이션 및 CircleCI 준비), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/stoneHunt/items/1db9d5aded2d5c1d6dee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 ~
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.tfresource "aws_ecr_repository" "sample-image" {
name = "sample-image"
}
config.tfterraform {
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.tfresource "aws_iam_user" "deploy-user" {
name = "deploy-user"
}
aws_iam_policy.tfresource "aws_iam_policy" "deploy" {
name = "deploy"
path = "/"
description = "deploy policy"
policy = file("aws_iam_policies/ecr_policy.json")
}
aws_iam_user_policy_attachment.tfresource "aws_iam_user_policy_attachment" "deploy-attach" {
user = aws_iam_user.deploy-user.name
policy_arn = aws_iam_policy.deploy.arn
}
config.tfterraform {
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.ymlversion: 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된다.
Reference
이 문제에 관하여(Django 프로젝트 배포 전 연습 3번째 웹 애플리케이션 및 CircleCI 준비), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/stoneHunt/items/1db9d5aded2d5c1d6dee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
resource "aws_ecr_repository" "sample-image" {
name = "sample-image"
}
terraform {
backend "s3" {
bucket = "保管するS3バケットの名前"
key = "ecr/terraform.tfstate"
region = "ap-northeast-1"
}
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_iam_user" "deploy-user" {
name = "deploy-user"
}
resource "aws_iam_policy" "deploy" {
name = "deploy"
path = "/"
description = "deploy policy"
policy = file("aws_iam_policies/ecr_policy.json")
}
resource "aws_iam_user_policy_attachment" "deploy-attach" {
user = aws_iam_user.deploy-user.name
policy_arn = aws_iam_policy.deploy.arn
}
terraform {
backend "s3" {
bucket = "保管するS3のバケットの名前"
key = "iam/terraform.tfstate"
region = "ap-northeast-1"
}
}
provider "aws" {
region = "ap-northeast-1"
}
{
"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": "*"
}
]
}
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
Reference
이 문제에 관하여(Django 프로젝트 배포 전 연습 3번째 웹 애플리케이션 및 CircleCI 준비), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/stoneHunt/items/1db9d5aded2d5c1d6dee텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)