공부하기싫어
article thumbnail

 

12.1 9:28 pm

이제부터 할거는 html 코드 수정 + python 코드 수정 해서 제대로 동작할 수 있게 하는 것 뿐이다

즉 docker container 로 동작하게하는 환경 설정이 모두 끝났기 때문에

python , mysql , php-apache 3개의 컨테이너에 대한 docker-compose 파일과

jenkins container + hub.docker + git repo 를 이용한 CI/CD 환경을 설계+구축 해보자

구름 국비지원 프로젝트 할때 해봤으니 훨씬 쉬울듯

 

 

 

12.4 9:07 pm

처음부터 해보자

 

diagram

 

CICD FLOW

1. 사용자가 코드를 코딩 + git repo에 push

2. git repo 에 설정된 webhook이 발생 + jenkins build trigger catch

3. jenkinsfile stages

- image build test

- image push to hub.docker

- ansible 통해 원격지 docker-compose up

 

나중에 다른 프로젝트들이 더 올라가면 k8s 로 마이그레이션하는걸로 하고

지금은 일단 jenkins container 가 돌아가는 개발용 docker instance 하나랑

운영 환경용 instance 하나로 구성해보자

서울 리전에 기본 vpc의 기본 public 서브넷중 하나를 선택해서 운영환경을 구성해볼 예정이다.

그리고 기본 vpc 안에 private subnet 을 하나 만들어서 db server 로 돌릴 instance 를 싼걸로 하나 만들어줬다.

i/o 성능은 크게 중요하지 않으니까 용량만 프리티어 최대치로 맞춰놓고 생성해줬다.

 

 

12.5 7:49 pm

인스턴스 환경

  Jenkins server Web server DB server
OS ubuntu 22.04 ubuntu 22.04 ubuntu 22.04
인스턴스 유형 t3a.medium t3a.small t2.micro
key pair dev-all prod-blackpink dev-all
VPC default default default
subnet 2a 2a 2a
public ip EIP yes yes
SG-inbound 22,8080 22,80,443 22,3306
SG-outbound anywhere anywhere anywhere
storage 16GiB 16GiB 30GiB
container jenkins php-apache, python mysql

리소스 태그

  Jenkins server Web server DB server private subnet S3 bucket
tag - Name ec2-jenkins_server-01 ec2-web_server_01 ec2-db_server_01 subnet-ap_northeast_2a-private_01
s3bucket-ap_northeast_2-public_image_storage
tag - Project General ResponsiveWeb-blackpinkinyourarea General General ResponsiveWeb-blackpinkinyourarea
tag - Environment Develop Production General Production Production

 

    보안그룹 태그
  SG-ssh SG-for-jenkins_server SG-for-web_server
SG-for-db_server
tag - Name sg-default_vpc-ec2-ssh sg-default_vpc-ec2-jenkins sg-default_vpc-ec2-webserver
sg-default_vpc-ec2-dbserver
tag - Project General General ResponsiveWeb-blackpinkinyourarea General
tag - Environment General Develop Production General
  • jenkins server 는 앞으로도 cicd 환경을 구축할때 사용하고 또 빌드가 실행될 곳이기 때문에 medium 에 EIP 를 할당해주려고 한다
  • db server 의 스토리지는 프리티어 최대 사용량인 30GiB 로 설정해줬다
  • 인스턴스의 들의 보안그룹은 SG-ssh, SG-for-jenkins_server, SG-for-web_server, SG-for-db_server 이렇게 4개 사용할 예정이다
  • S3 bucket 은 사진 다운로드를 위해 퍼블릭 액세스 오픈해서 사용한다

 

이정도로 설계하고

테라폼으로 하면 좋겠지만

지금은 일단 수동으로 생성해보자

 

 

 

12.5 8:42 PM

 

subnet

먼저 서브넷을 만들어줬다

private subnet

CIDR 는 기본 vpc 에서 남은 대역중 다음 대역을 선택해줬다

 

SG

sg

보안그룹도 설계에 맞춰서 생성해줬다

 

EIP

eip 연결

 

그리고 위 설계에 맞춰 jenkins server 를 만들어주고

ubuntu 22.04 이미지를 선택해 준다음

EIP 를 연결해줬다

 

EIP 태그

Name : eip-ap_northeast_2-conn_jenkins

Project : General

Environment : Develop

 

이후 jenkins 서버에

  • 도커 설치
  • sudo 없이 도커 명령 실행

이렇게 설치해놓은 다음에 AMI 를 떠서 나머지 서버에 적용시킬 예정이다.

 

이전 포스트 에서 다시 참고

https://yeonwoo97.tistory.com/314

 

[Web]BLACKPINK IN YOUR AREA-17-배포 환경 재구현

인스턴스 변경 container로 서비스하기 위해서 운영 환경을 다시 구성했다. 인스턴스 : t3a.small 도커 설치 : 설치방법 https://yeonwoo97.tistory.com/313 kubernetes 환경 재설치 구름 국비지원에서 줬던 AWS 아이

yeonwoo97.tistory.com

 

업데이트 및 필요 패키지 설치

sudo apt update
sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

Docker GPG key 추가

sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

 

리포지토리 설정

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

Docker 엔진 설치

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y

 

Docker daemon 설정

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl enable --now docker

 

  • CRI container runtime 설치

cri-docker 패키지 다운로드

https://github.com/Mirantis/cri-dockerd/releases/tag/v0.2.6

 

cri-docker 패키지 설치

sudo apt install ./<해당버전>.deb

 

cri-docker 패키지 설치 후

sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket

 

sudo 없이 docker 명령어 실행

그룹 추가
sudo groupadd docker

그룹에 사용자 추가
sudo usermod -aG docker {user_id}

docker 재시작
sudo service docker restart

권한오류 Got permission denied while trying to ...
sudo chown root:docker /var/run/docker.sock
혹은
sudo chmod 666 /var/run/docker.sock

 

도커 설치 완료

 

이제 인스턴스 종료하고 AMI 로 떠보자

 

 

 

 

12.5 7:49 pm

AMI

ami

ami tag

Name : ami-docker_in_ubuntu

Project : General

Environment : General

 

대기중

이제 사용 가능하다고 하면 나머지 인스턴스 2개도 각각 만들고

host이름까지만 바꿔놓자

 

 

 

12.5 10:01 PM

인스턴스 생성

instance
docker

sudo 없이 docker 명령이 잘 실행 되는 모습

 

그런데 mysql 최소사양을 봤는데

 

하드웨어 사양(시스템 요구 사항)

  • 최소 - CPU: Intel Core or Xeon 3GHz / Memory: 4GB
  • 권장 - CPU: Dual or Quad Core / Memory: 6GB

 

 

 

 

 

12.7 7:35 pm

private subnet 에 위치한 db server 에 mysql container 환경설정

 

먼저 개발 환경에서 docker image 를 tar 로 압축해서 보내줌

docker save

그리고 private subnet 에 위치한 ec2 에 ssh 접속해서

docker load 로 image 에 저장해줌

docker load

이후 mysql container 생성해줌

ubuntu@ip-172-31-78-182:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
ubuntu@ip-172-31-78-182:~$ 
ubuntu@ip-172-31-78-182:~$ docker run -it --name mysql-db -e MYSQL_ROOT_PASSWORD=비밀번호 -d -p 3306:3306 mysql:latest
f30f097dd22fdd38581b9e7c9cc44991a5440423d6b6262fa4fe9408569e7810
ubuntu@ip-172-31-78-182:~$ 
ubuntu@ip-172-31-78-182:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
f30f097dd22f   mysql:latest   "docker-entrypoint.s…"   7 seconds ago   Up 4 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql-db
ubuntu@ip-172-31-78-182:~$ 
ubuntu@ip-172-31-78-182:~$

 

db 랑 테이블을 만들어보자

 

DB : blackpink
table : test table : blackpink_img_data
column type column type
sample_no int DB_MEM_NAME varchar(10)
sample_name varchar(100) DB_YEAR int
    DB_MONTH int
    DB_DAY int
    DB_FILENUM int
    DB_S3URL varchar(300)
    DB_DOWNLOAD int

 

위처럼 간단하게 2개 테이블만 만들어보자

 

create table

create table test (
	sample_no int,
	sample_name varchar(100)
);

create table blackpink_img_data (
	DB_MEM_NAME varchar(10),
	DB_YEAR int,
	DB_MONTH int,
	DB_DAY int,
	DB_FILENUM int,
	DB_S3URL varchar(300),
	DB_DOWNLOAD int
);

 

테스트 데이터 넣어보고 확인하기

 

test

 

액셀 백업 파일 안의 데이터 db로 옮기기

이전에 액셀파일로 백업해놨던 데이터를

private subnet 의 mysql container 안으로 옮겨보자

 

private subnet 에 위치한 db server 로 mysql connect 해야하기 때문에 

기존 개발 환경인 instance 에서 접속해볼 예정이다.

import pandas as pd
import pymysql

con = pymysql.connect(host='172.31.78.182', user='root', password='비밀번호',
                       db='blackpink', charset='utf8') # 한글처리 (charset = 'utf8')

cur = con.cursor()

excel_sheet = pd.read_excel('/home/ubuntu/db-backup.xlsx', 
                    sheet_name = 'backup-data', engine='openpyxl')

sql_insert_1 = 'insert into blackpink_img_data values(%s, %s, %s, %s, %s, %s, %s)'
for idx in range(len(excel_sheet)):
    	cur.execute(sql_insert_1, tuple(excel_sheet.values[idx]))
con.commit()

con.close()

db server 와 같은 vpc 에 위치한 dev server 에서 실행할 내용

 

ubuntu@blackpinkinyourarea:~$ python3 migration_backup_data.py 
ubuntu@blackpinkinyourarea:~$

실행

 

select * from blackpink_img_data;

2170 개 데이터 모두 잘 옮겨진 모습

 

mysql 쪽 container 는 된거같고 이제 운영 환경에 CI/CD 적용을 해보자