AWS

백엔드 CD 설정

MDanderson 2023. 7. 23. 07:50

참고

@ 로컬의 deploy-test.pem을 내 서버로 보내기

scp -i "./test_key_pair.pem" deploy-test.pem ec2-user@bastion host dns ip:~/

 

@ bastionhost에 접속

ssh -i "./test_key_pair.pem" ec2-user@bastion host dns ip

 

 

@bastionhost에서 private ec2에 접속

ssh -i deploy-test.pem ec2-user@private ec2 private ip

 

secret설정하기

깃허브 백엔드 저장소로간다 -> settings 선택 secrets and variable선택 

이 값들을 채워줘야 한다.

 

@깃허브 시크릿에 넣어야할것들

DEPLOY_APPLICATION_PROPERTIES

DEPLOY_CORS_PROPERTIES

DEPLOY_REDIS_PROPERTIES

DEPLOY_MYSQL_PROPERTIES

GHCR_TOKEN

BASTION_HOST

BASTION_PRIVATE_KEY

 

 

https://cafe.naver.com/eddicorp/1750

 

[ 링크쌤 컬럼 ] Bastion Host 기반의 보안 환경에서 redis 활용 프로젝트 구성하기

안녕하세요. 에디로봇아카데미의 링크쌤입니다. 앞서서 Bastion Host를 기반으로 AWS에 보안 구성을 갖춰 Spring Project를 배포하였습니다. 이제 나름대로 ...

cafe.naver.com

여기를 참고한다

 

application.properties는 아래와 같습니다.

이 부분은 DEPLOY_APPLICATION_PROPERTIES로 구성하면 되겠습니다.

server.port=7777
spring.cache.type=redis
[출처] [ 링크쌤 컬럼 ] Bastion Host 기반의 보안 환경에서 redis 활용 프로젝트 구성하기 (에디로봇아카데미) | 작성자 링크쌤

 

 

cors.properties는 Bastion Host에서 접근하도록 구성할 것이므로 아래와 같이 구성합니다.

그리고 이것은 DEPLOY_CORS_PROPERTIES로 구성하면 되겠습니다.

allowed_origins=http://Bastion Host IP:요청포트
[출처] [ 링크쌤 컬럼 ] Bastion Host 기반의 보안 환경에서 redis 활용 프로젝트 구성하기 (에디로봇아카데미) | 작성자 링크쌤

 

:80인 요청포트는 생략해도된다 http를 쓰면 자동 적용되기 떄문

그래서 allowed_origins=http://Bastion Host public IP

 

 

DEPLOY_REDIS_PROPERTIES라는 이름으로 만들어줍니다.

spring.data.redis.host=redis-container
spring.data.redis.port=6379
spring.data.redis.password=비밀번호
[출처] [ 링크쌤 컬럼 ] Bastion Host 기반의 보안 환경에서 redis 활용 프로젝트 구성하기 (에디로봇아카데미) | 작성자 링크쌤

 

 

Github Actions에서 Secrets에 등록한다면 DEPLOY_MYSQL_PROPERTIES로 지정합니다.

spring.datasource.url=jdbc:mysql://mysql-container/deploy_test_db?allowpublickeyretrieval=true&usessl=false&serverTimezone=UTC
spring.datasource.username=계정
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dialect=org.hibernate.dialect.MySQL8Dialect
spring.jpa.properties.hibernate.format_sql=false
spring.jpa.open-in-view=false
spring.jpa.database=mysql
spring.jpa.show-sql=false
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
[출처] [ 링크쌤 컬럼 ] Bastion Host 기반의 보안 환경에서 redis 활용 프로젝트 구성하기 (에디로봇아카데미) | 작성자 링크쌤

 

 

GHCR_TOKEN은

깃허브에서 developer settings 에서 classic token을 생성해준다 이떄, 토큰은 잊어버리지않게 기록해두자

토큰 만들때 선택해야할것:  repo, workflow, write:packages,  delete:package  이렇게 선택

이떄 만들어진 토큰값을 GHCR_TOKEN으로 입력

 

BASTION_HOST는

public ip가 아니라 public dns ip를 입력해준다 ex) ec2-3-38... amazonaws.com

 

BASTION_PRIVATE_KEY는

bastion host에 들어가는 pem키를 메모장으로 열어서 그대로 복붙해준다.

 

그 후 commit하고 github actions workflow를 돌려본다

 이때 gradle-wrapper.properties가 있어야하는데 

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

 

이렇게 파일을 만들어준다.

 

그후 workflow를 돌리면 build가 성공하고 deploy to prod에서 멈춰야한다. 

 

action runners 설정하기

settings -> actions->runners -> new self hosted runner 선택 -> 리눅스선택 -> arm64로 선택 ->  bastion host접속후 Download,Cinfigure에 적혀있는 명령어들을 한줄 한줄 복사붙여넣기로 입력한다.

# Create a folder
$ mkdir actions-runner && cd actions-runner# Download the latest runner package
$ curl -o actions-runner-linux-arm64-2.306.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.306.0/actions-runner-linux-arm64-2.306.0.tar.gz# Optional: Validate the hash
$ echo "842a9046af8439aa9bcabfe096aacd998fc3af82b9afe2434ddd77b96f872a83  actions-runner-linux-arm64-2.306.0.tar.gz" | shasum -a 256 -c# Extract the installer
$ tar xzf ./actions-runner-linux-arm64-2.306.0.tar.gz

 

# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/MDandersonm/basics-of-building-aws-infrastructure-backend --token A6AHEJQI4FS4AGJYNOEFSPLEXRPGE# Last step, run it!
$ ./run.sh

 

ex)https://cafe.naver.com/eddicorp/1745

 

[ 링크쌤 컬럼 ] Github Actions Runner 설정하기

안녕하세요. 에디로봇아카데미의 링크쌤입니다. 아래 사진과 같이 Github 저장소에서 Settings의 Actions -> Runners를 누르면 Runner를 구성할 수 ...

cafe.naver.com

 

명령어를 못찾는경우

sudo yum install perl-Digest-SHA -y 입력 

Configure 부분을 입력할때는 주의해야한다

엔터 칠떄 주의해야한다. 잘못엔터치면 지우고 다시해야한다 actions runner를 지우고 다시해야함

this runner will have the following labels:레이블설정하라고 이렇게 나오면 아래의 deploy-redis-spring-backend 를입력해준다

 

다됐으면 ./run.sh   

정상적으로 된거 확인했으면 백그라운드에서 재생할려면 ./run.sh & 라고 입력

백그라운드에서, 작동하는지 확인방법

ps -ef | grep run.sh

netstat –ntlp

켜진거 삭제 : kill -9 100444

 

@!주의 private ec2와 bastion host 모두 도커를 설치해야한다 ,   private ec2 에는 docker-compose도 설치해줘야함.

 private ec2 에 설치할떄는 elastic ip를 할당받아서 직접 접속해서 진행하자

https://cafe.naver.com/eddicorp/1514

 

[ 미카니 칼럼 ] AWS | EC2 인스턴스에 고정 IP 할당하기

https://cafe.naver.com/eddicorp/1407 위 글에서 EC2 인스턴스를 성공적으로 생성 후, 방화벽 설정을 마쳤다면 이제 나의 인스턴스에 고정 IP를 ...

cafe.naver.com

 

sudo yum update -y

sudo yum install docker -y

sudo systemctl enable docker.service

sudo systemctl start docker.service

sudo systemctl status docker.service

sudo usermod -aG docker $USER

 

참고)

https://cafe.naver.com/eddicorp/1634

 

[ 임익환 칼럼 ] Amazon Linux t4g 인스턴스(ARM)에 도커 및 docker-compose를 설치해보자

이 전 글에는 ubuntu 리눅스에 t2 인스턴스를 사용하여 docker를 설치하는 방법을 배워보았다. https://cafe.naver.com/eddicorp/1410 ...

cafe.naver.com

 

권한문제로 안되면 logout쳐보고 서버재접속해보자

 

그다음 다시 workflow를 돌려본다

 

 


deploy_script만들기

https://cafe.naver.com/eddicorp/1750

 

[ 링크쌤 컬럼 ] Bastion Host 기반의 보안 환경에서 redis 활용 프로젝트 구성하기

안녕하세요. 에디로봇아카데미의 링크쌤입니다. 앞서서 Bastion Host를 기반으로 AWS에 보안 구성을 갖춰 Spring Project를 배포하였습니다. 이제 나름대로 ...

cafe.naver.com

mkdir deploy_scripts를 bastion host에 만든다  그안에 run_redis_backend_deploy.sh 를 만들어준다
docker_build에서_사용한_저장소이름:redis-spring-server

$1:토큰적어주기

$2:깃허브계정명 소문자로

 

 

#!/bin/bash
image_name="ghcr.io/계정/docker_build에서_사용한_저장소이름"
image_tag="latest"
GHCR_TOKEN=$1
GITHUB_ACTOR=$2

key_file="pem키경로"
username="ec2-user"
internal_ec2_ip="내부ip"

archive_file="docker_build에서_사용한_저장소이름.tar.gz"

echo "GITHUB_ACTOR: $GITHUB_ACTOR"

echo "$GHCR_TOKEN" | docker login ghcr.io --username "$GITHUB_ACTOR" --password-stdin

docker pull "$image_name:$image_tag"
docker save "$image_name:$image_tag" > docker_build에서_사용한_저장소이름.tar
gzip docker_build에서_사용한_저장소이름.tar

scp -i "$key_file" "$archive_file" "$username"@"$internal_ec2_ip":~/backend_download/

./connect_private_ec2_instance.sh <<EOF
cd backend_download
tar zxf "$archive_file"
ls
echo "image_name: $image_name"
echo "image_tag: $image_tag"
ls -al
docker load -i docker_build에서_사용한_저장소이름.tar.gz
rm -rf *

cd ~/bastion-redis-backend-deploy
docker-compose up -d
EOF

rm -f "$archive_file"

docker logout
[출처] [ 링크쌤 컬럼 ] Bastion Host 기반의 보안 환경에서 redis 활용 프로젝트 구성하기 (에디로봇아카데미) | 작성자 링크쌤

 

 

connect_private_ec2_instance.sh를  deploy_scripts아래에 만들어줘야하는데

 

vi connect_private_ec2_instance.sh 도 만들어준다

 

#!/bin/bash

#
변수 설정
key_file="/home/ec2-user/deploy-test.pem"
username="ec2-user"
internal_ec2_ip="private ec2의 ip"

# SSH
접속 명령 실행
ssh -i "$key_file" "$username@$internal_ec2_ip" "$@"

 

*권한이 없어서 파일 실행이 안된다면 chmod +x 파일명

ls -l로 권한 확인할 수 있다.

 

이제 , private ec2에 접속해서 backend_download 폴더를 만들고,  bastion-redis-server-deploy 폴더를 만든다.

 

이제 다시 깃허브 workflow 다시 시작   ->           private ec2에서 docker images 치면  redis-spring-server가 나오면 성공

 

 

 

bastion-redis-server-deploy 폴더에 

Dockerfile ,   docker폴더  ,  docker-compose.yml ,  .env파일 을 생성해준다.

 

 

Dockerfile을 vi를 사용하여 만들자

FROM openjdk:17-slim

#ARG JAR_FILE=*.jar
#COPY ${JAR_FILE} app.jar

ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /
RUN chmod +x /wait-for-it.sh

 

 

docker-compose.yml은

https://cafe.naver.com/eddicorp/1751

 

[ 링크쌤 컬럼 ] GHCR Spring + MySQL + Redis를 위한 docker 환경 구성법

안녕하세요. 에디로봇아카데미의 링크쌤입니다. 아래와 같이 Dockerfile을 구성합니다. 그리고 docker-compose.yml은 아래와 같이 작성할 수 있습니다. 그리...

cafe.naver.com

 

version: "3.7"
services:
  db:
    image: "mysql:8.0"
    container_name: mysql-container
    volumes:
      - dbdata:/var/lib/mysql
      - ./docker/mysql/custom.cnf:/etc/mysql/conf.d/custom.cnf
      - ./docker/mysql/logs:/var/log/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
    networks:
      - app

  redis:
    image: redis:latest
    command: redis-server --requirepass ${REDIS_PASSWORD}
    container_name: redis-container
    labels:
      - "name=redis"
      - "mode=standalone"
    ports:
      - "6379:6379"
    environment:
      REDIS_PASSWORD: ${REDIS_PASSWORD}
    depends_on:
      - db
    networks:
      - app

  server:
    image: ghcr.io/계정/저장소
    build: .
    container_name: redis-mysql-backend-server
    volumes:
      - appdata:/app
    depends_on:
      - db
    ports:
      - "7777:7777"
    command:
      - bash
      - -c
      - |
        /wait-for-it.sh db:3306 -t 15
        java -jar /app.jar
    networks:
      - app

networks:
  app:
    driver: bridge

volumes:
  dbdata:
    driver: local
  appdata:
    driver: local
[출처] [ 링크쌤 컬럼 ] GHCR Spring + MySQL + Redis를 위한 docker 환경 구성법 (에디로봇아카데미) | 작성자 링크쌤

 

 

.env파일도 vi로 생성해준다

 

# Set docker-compose environment
DB_ROOT_PASSWORD=비번
DB_USER=eddi(유저명)
DB_PASSWORD=비번
DB_NAME=deploy_test_db(DB명)
REDIS_PASSWORD=비번

 

 

도커폴더밑에 이렇게 생성

docker/mysql/log/README.md

docker/mysql/custom.cnf

 

custom.cnf 도 vi로  아래와 같이 만든다

 

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
skip-character-set-client-handshake
innodb_buffer_pool_size = 16M

 

이렇게 했으면 workflow를 구동 후

docker-compose up 을 해보면 잘 구동이 안되면  redis,mysql이미지가 없어서 그런것이다.

redis 이미지가 private망에있어서 퍼블릭망에서 사용안됨

이걸 가능하게하려면 도커pull을 받고 옮겨줘야함.


그래서 redis 를 옮기는 과정

https://cafe.naver.com/eddicorp/1752

 

[ 링크쌤 컬럼 ] Bastion Host에서 private ec2로 Docker 이미지 전송하고 구성하기

안녕하세요. 에디로봇아카데미의 링크쌤입니다. 우선 Bastion Host에 접속합니다. 이후 docker pull을 사용하여 redis를 다운로드합니다. 그리고 다운받은 이...

cafe.naver.com

우선 Bastion Host에 접속합니다.

ssh -i "pem키경로" ec2-user@publicDNS
이후 docker pull을 사용하여 redis를 다운로드합니다.

docker pull redis
그리고 다운받은 이미지를 docker save를 통해서 archive를 하나로 뭉쳐놓습니다.

docker save redis > redis-image.tar
또한 압축을 한 번 해줍니다.

gzip redis-image.tar
압축이 완료되었다면 private ec2로 이동시킵니다.

scp -i "pem키경로" redis-image.tar.gz ec2-user@private_ec2아이피:~/
잘 이동시켰다면 여기서 다시 전송한 데이터를 기반으로 Docker Container를 구성할 수 있어야 합니다.

아래와 같이 docker load -i 명령을 사용해서 docker image를 구성합니다.

docker load -i redis-image.tar.gz
이후 load가 잘 되었는지 확인하기 위해 아래 명령을 입력합니다.

redis가 잘 나타난다면 성공입니다.

docker images
추후 docker-compose 등을 통해서 만든 이미지를 Container화 하거나 필요에 따라 활용하면 되겠습니다.

부가적으로 더 이상 사용하지 않을 redis-image.tar.gz는 삭제합니다.

rm -f redis-image.tar.gz
감사합니다.
[출처] [ 링크쌤 컬럼 ] Bastion Host에서 private ec2로 Docker 이미지 전송하고 구성하기 (에디로봇아카데미) | 작성자 링크쌤

 

 

 

workflow작동후 ,      docker-compose up 하면 정상적으로 작동이 될것(무한작동)

 

docker-compose up -d docker ps했을때 3개의 컨테이너가 생성될것 mysql,redis, spring 이러면 성공

 

 

private ec2에서 curl localhost:7777/board/list 를 입력했을때,  []가 출력되면 ok

bastion에서 curl [private ec2 ip]:7777/board/list 를 입력했을때 []가 출력되면 ok

'AWS' 카테고리의 다른 글

aws amplify 와 github 연동  (1) 2024.02.26
프론트엔드 CD 설정  (0) 2023.07.23
bastion host와 private EC2 만들기  (0) 2023.07.20
고대디 도메인 구매 ,연결  (0) 2023.05.06
AWS s3  (0) 2023.05.03