- ์บก์คํค์์ SpringBoot, MongoDB๋ฅผ ์ฌ์ฉํด์ ๋ฐฑ์ค๋ ์๋ฒ ๊ฐ๋ฐ์ ํด์ผํ๋ค.
- ๋ด๊ฐ ์ธํ๋ผ๋ฅผ ๋งก๊ธฐ๋ก ํด์ CI/CD๋ฐ ์ธํ๋ผ๋ฅผ ์๋ฃํ์๋ค.
- ๊ธฐ๋กํ ๊ฒธ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํด๋ณด์๋ค.
EC2๋ MongoDB, SpringBoot ์ฌ์ฉํ ๊ฒ์ด๊ธฐ์, ์ถ๊ฐ๋ก 8080ํฌํธ์ 27017 ํฌํธ๋ฅผ ์ด์ด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ t2.micro๋ง๊ณ t3a.small์ ์ฌ์ฉํ์๋ค. t2.micro๋ ๋๋ฌด ์๋ค...
- ์คํ ์ ๋๋ค.
- ์ด์ ๊นํ๋ธ์ ์ฐ๊ฒฐํด์ฃผ์
๋ ํฌ์งํ ๋ฆฌ ์์ฑํ๊ณ
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:seongjju/seongjju-web-server.git
git push -u origin main
ec2์ ์ ์ํด์
$ sudo apt update && /
sudo apt install openjdk-17-jdk -y
$ java -version # ์ ์ค์น๋๋ ์ง ํ์ธ
$ git clone {git repository clone ์ฃผ์}
ํ ๊ทผ ๋ฐ๊ธ ์ฐธ๊ณ
https://velog.io/@nara7875/github-%ED%86%A0%ED%81%B0-%EB%B0%9C%EA%B8%89%ED%95%98%EA%B8%B0
- ๋งค๋ฒ Github ๊ณ์ ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์น๋ ๊ณผ์ ์์ ๊ธฐ
$ git config --global credential.helper store
$ git pull origin main
# Github ๊ณ์ ๋ฐ ๋น๋ฐ๋ฒํธ ์
๋ ฅ
$ git pull origin main # ๋ ์ด์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ฌป๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
- ๊นํ๋ธ์ ์ํฌ๋ฆฟ ๊ฐ ๋ฃ์ด์ฃผ๊ธฐ
- Settings -> Secrets and variables -> Actions
- EC2_USERNAME: ubuntu
- EC2_HOST:์๊ฒฉ ip ๋๋ 52.79.159.70
- EC2_PRIVATE_KEY: ์ด๊ฑฐ๋ ์๊น ec2๋ง๋ค๋ pem๊ฐ์ด๋ค. ๋ค์ด๋ฐ์ pemํค๊ฐ ์๋ ํด๋๋ก ์ด๋ํด์ cat์ผ๋ก ํ์ธํ์
- ์ฌ๊ธฐ์๋ถํฐ-----END RSA PRIVATE KEY----- ๊น์ง ๋ฃ์ผ๋ฉด ๋๋ค. ๋ง์ง๋ง “%”๋ ๋ฃ์ผ๋ฉด ์๋๋ค.
- APPLICATION_PROPERTIES ์ด๊ฑฐ๋ ymlํ์ผ๊ฐ์ ๋ฃ์๊ฒ์ด๋ค.
- ์๋ํ๋ฉด ๋ณด์์ ์ํด์ ๊นํ๋ธ์๋ ymlํ์ผ ๊ฐ์ด ์ฌ๋ผ๊ฐ๋ฉด ์๋๋ค.
- application.yml์ .gitignore์ ์ถ๊ฐํ๊ณ ์ฌ๋ ค์ผํ๋ค.
- ํน์ ์ด๋ฏธ ๊นํ๋ธ์ ymlํ์ผ์ ์ฌ๋ ธ๋ค๋ฉด
- git rm --cached src/main/resources/application.yml๋ก ์บ์๋ฅผ ์ง์ฐ๊ณ ์ฌ๋ฆฌ์
spring:
data:
mongodb:
uri: mongodb://mongo:27017/seongjju-web-server-database
- ์ด์ ๋์ปค ๋ถ๋ถํด๋ณด์
ec2์์
sudo apt-get update && \ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \ sudo apt-key fingerprint 0EBFCD88 && \ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \ sudo apt-get update && \ sudo apt-get install -y docker-ce && \ sudo usermod -aG docker ubuntu && \ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ sudo chmod +x /usr/local/bin/docker-compose && \ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
๋์ปค ์ค์นํ๊ณ ์ํฐํ๋ฒ๋๋ฅด๊ณ
# ์ ์ค์น๋๋ ์ง ํ์ธ
$ docker -v # Docker ๋ฒ์ ํ์ธ
$ docker compose version # Docker Compose ๋ฒ์ ํ์ธ
์ ์ค์น ๋์๋ค.
- ECR์์ฑ
๋ค๋ฅธ๊ฑด ๊ฑด๋ค๊ฒ ์๋ค.
- EC2๊ฐ Private ECR์ ์ ๊ทผํ ์ ์๊ฒ ์ ํ ํ๊ธฐ
# Ubuntu์ผ ๊ฒฝ์ฐ
$ sudo apt update
$ sudo apt install amazon-ecr-credential-helper
~ ๊ฒฝ๋ก์์ .docker๋ผ๋ ํด๋ ๋ง๋ค๊ณ , config.json ํ์ผ ๋ง๋ค์ด์ ์์ ๊ฐ์ด ์์ฑํด๋ผ.
~/.docker/config.json
{
"credsStore": "ecr-login"
}
- Github Actions์ IAM์ ๊ถํ ์ถ๊ฐ
- iam ์ฌ์ฉ์์ ์ญํ ๋ชจ๋์ ์๋์ ์ ์ฑ ์ ์ฐ๊ฒฐํด์ผํ๋ค.
- AmazonEC2ContainerRegistryFullAccess
- ์ด ํค๋ฅผ ์๊น ์ํฌ๋ฆฟ ๊ฐ ๋ฃ์๊ฒ์ฒ๋ผ ๊นํ๋ธ ์ํฌ๋ฆฟ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋๋ค.
- AWS_ACCESS_KEY_ID: ์ก์ธ์ค ํค
- AWS_SECRET_ACCESS_KEY: ๋น๋ฐ ์ก์ธ์ค ํค
- IAM ์ญํ
- ์์ฑ์๋ฃ
- ์ด์ ec2์ iam ์ฐ๊ฒฐ -> ์ด๊ฑฐ ๊น๋จน์ด์ ๋ช๋ฒ์ด๋ credentials ์ค๋ฅ๋ฌ๋ค
- EC2 -> ์์ -> ๋ณด์ -> Iam ์ญํ ์์
- ๋ฐฉ๊ธ ๋ง๋ ์ญํ ์ ํํ๋ฉด ๋๋ค.
๊ฒฝ๋ก ์ฐธ๊ณ
.github/workflows/deploy.yml
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
uses: actions/checkout@v4
- name: JDK 17๋ฒ์ ์ค์น
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: application.yml ํ์ผ ๋ง๋ค๊ธฐ
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
- name: ํ
์คํธ ๋ฐ ๋น๋ํ๊ธฐ
run: ./gradlew clean build
- name: AWS Resource์ ์ ๊ทผํ ์ ์๊ฒ AWS credentials ์ค์
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: ECR์ ๋ก๊ทธ์ธํ๊ธฐ
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Docker ์ด๋ฏธ์ง ์์ฑ
run: docker build -t seongjju-web-server .
- name: Docker ์ด๋ฏธ์ง์ Tag ๋ถ์ด๊ธฐ
run: docker tag seongjju-web-server ${{ steps.login-ecr.outputs.registry }}/seongjju-web-server:latest
- name: ECR์ Docker ์ด๋ฏธ์ง Pushํ๊ธฐ
run: docker push ${{ steps.login-ecr.outputs.registry }}/seongjju-web-server:latest
- name: SCP๋ก EC2์ docker-compose.yml ํ์ผ ์ ์ก
run: |
echo "${{ secrets.EC2_PRIVATE_KEY }}" > private_key.pem
chmod 600 private_key.pem
scp -o StrictHostKeyChecking=no -i private_key.pem ./docker-compose.yml ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/home/ubuntu/seongjju-web-server/
- name: SSH๋ก EC2์ ์ ์ํ๊ธฐ
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script_stop: true
script: |
cd /home/ubuntu/seongjju-web-server # ์ค์ ํ๋ก์ ํธ ๊ฒฝ๋ก๋ก ์ด๋
export ECR_REGISTRY=${{ steps.login-ecr.outputs.registry }} # ECR_REGISTRY ํ๊ฒฝ ๋ณ์
docker-compose down # ๊ธฐ์กด ์ปจํ
์ด๋ ์ค์ง
# 'latest' ํ๊ทธ๊ฐ ๋ถ์ ์ด๋ฏธ์ง๋ฅผ ์ต์ ์์ผ๋ก ์ ๋ ฌํ๊ณ , ์ฒซ ๋ ๊ฐ๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ญ์
docker images --filter "reference=*:*latest" --format '{{.Repository}}:{{.Tag}}' | sort -r | awk 'NR > 2' | xargs -r docker rmi
docker-compose pull # ECR์์ ์ต์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
docker-compose up -d # Docker Compose ์คํ
Dockerfile
FROM eclipse-temurin:17-jdk-alpine
COPY ./build/libs/*SNAPSHOT.jar project.jar
ENTRYPOINT ["java", "-jar", "project.jar"]
docker-compose.yml
version: '3.3'
services:
spring:
image: ${ECR_REGISTRY}/seongjju-web-server:latest # ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉ
container_name: seongjju-web-server
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- MONGO_URI=mongodb://mongo:27017/seongjju-web-server-database # MongoDB ์ฐ๊ฒฐ
depends_on:
- mongo # mongo ์๋น์ค๊ฐ ๋จผ์ ์์๋จ
networks:
- app-network
mongo:
image: mongo:latest
container_name: mongodb
ports:
- "27017:27017"
volumes:
- mongo-data:/data/db
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mongo-data:
driver: local
์ด์ ๊นํ๋ธ์ ์ฌ๋ ค๋ณด์ ์๋์๊ฐ๋~
git add .
git commit -m "cicd-test"
git push origin main
- ๊นํ๋ธ์ก์ ์ด ํธ๋ฆฌ๊ฑฐ ๋์ด์ ๋์๊ฐ๊ณ ์๋ค. ์ ๋๊ธธ ๊ธฐ๋ํ์
- ์คํํ๋, ์ฐ๊ฒฐํ๋ ์ํ๋ฉด ์ด๋๊ฐ์ ๋ฐ๋ก ๋นจ๊ฐํ์๊ฐ ๋ฐ๊ฒ์ด๋ค.
- ๋ด ์ฒซ ์ค๋ฅ๋ ๋ด๊ฐ iam ์ฌ์ฉ์์ AmazonEC2ContainerRegistryFullAccess ์ด ๊ถํ์ ๋๋ฝํด์ ๋ฐ์ํ ์ค๋ฅ์ด๋ค.
- ์์ ํ๊ณ ๋ค์ ๊นํ๋ธ์ก์ ์คํ์์ผ๋ณด์
- AWS CLI ์ค์น
$ sudo apt install unzip
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version # ์ ์ถ๋ ฅ๋๋ค๋ฉด ์ ์ ์ค์น๋ ์ํ
- AWS CLI๋ก ์ก์ธ์ค ํค ๋ฑ๋กํ๊ธฐ
$ aws configure
AWS Access Key ID [None]: <์์์ ๋ฐ๊ธํ ์ก์์คํค>
AWS Secret Access Key [None]: <์์์ ๋ฐ๊ธํ ๋น๋ฐ์ก์์คํค>
Default region name [None]: ap-northeast-2
Default output format [None]: ์ํฐ์น๋ฉด๋๋ค.
- ์ค๊ฐ์ ๋ญ๊ฐ ์๋๋ค๋ฉด ec2๋ฅผ ์ฌ๋ถํ ์์ผ๋ณด์
- ๋ชจ๋ job ์ฑ๊ณต~
ํน์ ์ ๋๋ฉด ์ผ์์ ๋ก๊ทธ์ธํ๊ณ ํค๋ค์ ํ์ธํด๋ณด์
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 811271461583.dkr.ecr.ap-northeast-2.amazonaws.com
๊ทธ๋ฆฌ๊ณ lsํด์ config.json๋ง ๋จ๋๋ก ๋ค๋ฅธ๊ฑฐ ์ง์์ฃผ์
- User, UserRepository, UserController๋ฅผ ๋ง๋ค๊ณ
- ํฌ์คํธ๋งจ์ผ๋ก ๋ฐ์ดํฐ ํ๋ ๋ฃ์ด๋ดค๋ค.
์ฒ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์๋๋ฐ, ๊นํ๋ธ์ก์ ์ ํธ๋ฆฌ๊ฑฐํ๊ณ ํ์ธํ๋ ์ ๋ ๊ฒ seongjju-web-server-database๊ฐ ์๊ฒผ๊ณ , json์ด ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ EC2, ECR, Docker Compose, Github Actions ์ฌ์ฉํ์ฌ SpringBoot, MongoDB ๋ฐฐํฌ๋ฅผ ์๋ฃํ์๋ค.
'๐ณ์ธํ๋ผ > Cloud & CI-CD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SAA-CO3 ์ค๋ต,์ ๋งคํ ๋ด์ฉ ๐งน (2) (1) | 2024.09.18 |
---|---|
SAA-CO3 ์ค๋ต,์ ๋งคํ ๋ด์ฉ ๐งน (1) (0) | 2024.09.18 |