์คํ๋ง๋ถํธ ํ๋ก์ ํธ์ ๋์ปค๋ฅผ ๊ฐ์ธ๊ณ Github Action์ผ๋ก CI CD๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ด๊ฐ ์ฐพ์๋ณธ ๋ฐ๋ก ์ด 3๊ฐ์ง์ด๋ค!
์ ์ฐ์ ์ ๋์ปค๋ฅผ ๊ฐ์ธ๋ ํ๋ฉด ๋์ค์ ์๋น์ค๊ฐ ์ปค์ก์ ๋ ๋ชจ๋ ํ๊ฒฝ์ ๋์ผํ ๋ฒ์ ์ผ๋ก ๋ฐฐํฌ๋ฅผ ํ ์ ์๊ณ ๋ค๋ค ๋์ปค๋์ปค ํ๋๊น ๋๋ ๋์ปค ์ข ํด๋ณด๊ณ ์ถ์๋ค! ๐ณ
๊ทธ๋์ ๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ์ CI CDํ๋ ๋ฐฉ๋ฒ ์ธ๊ฐ์ง๋ฅผ ์๊ฐํ๊ฒ ๋ค.
1๏ธโฃ Docker+ S3+CodeDeploy+Github actions
๊ฐ๋จํด ๋งํ๋ฉด ๋น๋ ํ์ผ์ธ jarํ์ผ์ ์์ถํด์ ์ ๋ก๋ ํ ๋ค์์ CodeDeploy๋ฅผ ํ์ฉํด ๋ฐฐํฌํ๋ค.
๊ทธ๋์ ์ธ์ง ์ด ๋ฐฉ๋ฒ์ ์ฐ๋ฉด IAM์ด ๋ฌด๋ ค ์ธ๊ฐ๋ ํ์ํ๋ค.
IAM ์ญํ 2๊ฐ
my-ec2-ima-role : EC2์ธ์คํด์ค์์ S3์ ์ ๊ทผํ ์ ์๊ฒ ๊ถํ์ ์ค๋ค (AmazonS3FullAccess)
my-codedeploy-iam : CodeDeploy IAM์ด๋ค (AwsCodeDeployRole)
IAM ์ฌ์ฉ์ 1๊ฐ
my-github-actions-iam-user : Github Actions์์ ์ฌ์ฉํ IAM์ฌ์ฉ์
์ฐธ๊ณ ํ๋ฉด ์ข์๊ธ ๋ชฉ๋ก
https://bcp0109.tistory.com/363
Github Actions CD: AWS EC2 ์ Spring Boot ๋ฐฐํฌํ๊ธฐ
Overview ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ฉด ์ธ๋ถ์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ๋ฐฐํฌํฉ๋๋ค. ์ด์ ์ ํฌ์คํ ํ๋ AWS 1ํธ์์๋ ๋ง์ง๋ง์ scp ๋ช ๋ น์ด๋ก ๋ก์ปฌ์ ์กด์ฌํ๋ ๋น๋ ํ์ผ์ EC2 ์ธ์คํด์ค
bcp0109.tistory.com
aws ec2 + S3 + code deploy + docker ๋ฐฐํฌ ์ฝ์ง๊ธฐ
credential ์ค์ ec2 IAM role ์ค์ ec2 code deploy agent ์ค์ s3 ์์ฑ code deploy ๋ฐฐํฌ ๊ทธ๋ฃน ์ค์ workflow ์์ฑ appspec.yml ์์ฑ Dockerfile ์์ฑ docker-compose.yml ํ์ผ ์์ฑ af
velog.io
Springboot ํ๋ก์ ํธ Github Action์ ์ด์ฉํด์ ๋ฐฐํฌ ์๋ํํ๊ธฐ
###๐ฅ ์ฃผ์ ๐ฅ ํด๋น ๊ธ์ ์๋ฌ์ ์คํจ ๊ณผ์ ์ ๋ชจ๋ ํฌํจํ ๊ธ์ด๋ฏ๋ก ๋ง์ผ ๋ฐ๋ผํ์ค ๋๋ ๋ค ์ฝ์ผ์๊ณ ๆญฃ้๋ง ๊ฑธ์ผ์๋ผ๋ ๋ป..... ์ฐธ๊ณ ๋ธ๋ก๊ทธ (์ฒ์์ ๋ฐ๋ผํ ๋ ) https://stalker5217.netlify.app/devops/git
velog.io
https://taesan94.tistory.com/273
CodeDeploy ์ ์ฉ๊ธฐ
Why? ์ฒ์ ํ๋ฐํธํ๊ณผ ํ์ ์ ํ๊ธฐ ์ ์๋ฃ๋ API๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ณต์ ํ๊ณ ์ถ์๋ค. ์๋ฃ๋ API๋ฅผ ํ๋ก ํธ์์๋ ๋ฐ๋ก ํธ์ถํด๋ณผ ์ ์์ผ๋ฉด ๋ฌธ์ ๋ ๋ ๋นจ๋ฆฌ ์ก์ ์ ์๊ณ , ์๋ก ์์ฐ์ฑ๋ ๋์ผ ์ ์๋ค๊ณ
taesan94.tistory.com
2๏ธโฃ Docker + ec2 + Github Actions
์ฐ์ ec2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค์ ec2์์ ๋์ปค ํ๊ฒฝ์ ๋ง๋ค์ด์ค๋ค.
๋ด ์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ฅผ ๋์ปค๋ก ํ๋ฒ ๊ฐ์ธ์ค๋ค.
๊นํ์ก์ ์ ํตํด ec2์ ๋ด ํ๋ก์ ํธ์ ๋์ปค์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ๋ง๋ค์ด์ ๋น๋ํ๋ ํ์์ด๋ค.
์ฐธ๊ณ ํ๋ฉด ์ข์๊ธ ๋ชฉ๋ก
https://velog.io/@julia/Django-Docker๋์ปค-Github-Actions๊นํ์ก์ -๋ฐฐํฌ
Django - Docker(๋์ปค) & Github Actions(๊นํ์ก์ ) ๋ฐฐํฌ
๐ณDjango๋ฅผ Docker & Github Actions ๋ก ๋ฐฐํฌํด๋ด ์๋ค๐ณ
velog.io
https://itcoin.tistory.com/685
Github actions๋ฅผ ์ด์ฉํ CICD - 2
์ง๋ ๊นํ์ก์ ํฌ์คํ ์์ ๊นํ์ก์ ์ ์ด์ฉํด ๋น๋ ์๋ํ๋ฅผ ๋ง์ณค์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ๋์ปค๋ฅผ ์ฌ์ฉํด์ ๋ฐฐํฌ ์ค๋น๋ฅผ ํ ๊ฒ์ ๋๋ค. ๋์ปค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด๋์์ ๋์ผํ ํ๊ฒฝ์ ๋ฐฐํฌ๋ฅผ ํ
itcoin.tistory.com
https://velog.io/@max-sum/Docker-Container-RDS-EC2
Docker โฎ Container + RDS ์กฐํฉ EC2 ๋ฐฐํฌ
Docker! ์ฝ์ง์์!!
velog.io
3๏ธโฃ ๋๋ง์ Docker + Elastic Beanstalk +Github actions
2๋ฒ์ด๋ ๋ฌ๋ผ์ง๊ฒ ๊ฑฐ์ ์๋ค. ec2 ์๋ฆฌ์ EB๊ฐ ์จ๊ฑฐ๊ณ EB์์์ ์๋์ผ๋ก ec2,S3 ๋ฑ๋ฑ์ด ๊ตฌ์ถ๋๋ค!
https://taetoungs-branch.tistory.com/m/202
[CI/CD] Docker์ Elastic Beanstalk๋ฅผ ์ฌ์ฉํ spring boot ํ๋ก์ ํธ CI/CD ์๋ํ ๋ฐฐํฌ2 (์ค์ต๋ด์ฉ)
ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ด์๐ฅฒ ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค! ๐ ๏ธ ์ฌ์ฉ ๊ธฐ์ spring boot gradle github action docker AWS Elastic Beanstalk AWS ๊ฐ๋ฐ์ ์๋ด์์ ์ ๊ณต๋ ๋ด์ฉ์ ํ์ธ
taetoungs-branch.tistory.com
์ด ๊ธ์ ๋ณด๊ณ ๋ฐ๋ผํ๋ฉด ์ข๋ค!
Step 1 ) ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๊ตฝ์!
https://umanking.github.io/2021/07/11/spring-boot-docker-starter/
Spring Boot, Dockerfile๋ก ์ด๋ฏธ์ง ์์ฑ, ๋ฐฐํฌํ๊ธฐ
SpringBootํ๋ก์ ํธ, Dockerfile์ ๋ง๋ค์ด์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ ๋ฐฐํฌํด๋ณด์!
umanking.github.io
์ด ๊ธ์ ๋ณด๋ฉฐ ๋ฐ๋ผํ๋ฉด์ ์ด๋ฏธ์ง๋ฅผ ๊ตฝ๋๋ค.
์ ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง๋ฅผ build -t ํ๊ธฐ ์ ์ ๊ผญ jar ํ์ผ์ ์์ฑํด์ผํ๋ค.
https://velog.io/@ryusuz/Spring-boot-jar-ํ์ผ-์์ฑํ๊ธฐ-feat.-Gradle
[ Spring Boot ] jar ํ์ผ ์์ฑ ๋ฐ ์คํํ๊ธฐ (feat. Gradle)
๊น๋จน๊ณ ๋ ์ฐพ์๋ณผ๊น๋ด ์ ์ด๋๋ ๊ธ.. ์์ฃผ ๊ฐ๋จํด์ ๊ธ๋ ์งง๋ค.๊ตฌ๊ธ๋ง์ ํด๋ณด๋ ๊ทธ๋ฅ ๋น๋ ๋ฒํผ์ ๋๋ฅด๋ฉด ์๋์ผ๋ก build ํด๋ ๋ฐ์ libs ํด๋๊ฐ ์์ฑ๋๋ฉด์ ํ์์ jar ํ์ผ์ด ์์ฑ๋๋ค๋๋ฐ...๋ ์
velog.io
์ ๋ง๋ค์ด์ง๋ฉด ์ด๋ฐ์์ด ๋๋ค. ๊ผญ ๋ก์ปฌ์์ docker run์ ํด๋ณด์!
๊ทธ๋ฆฌ๊ณ ์๋ผ์คํฑ+docker ๊ด๋ จ ๊ธ๋ค์์ application.yml์ server๋ฅผ 5000ํฌํธ๋ก ์ด์ด์ฃผ๋ผ ํ๋๋ฐ
์๋๋ฉด ์๋ผ์คํฑ์ด ํ๋ก์๋ก nginx๋ก ์ฐ๊ฒฐ๋๋๋ฐ ๊ทธ nginix ํฌํธ๊ฐ 5000์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ ์ด๊ฑด Dockerrun.aws.json์ด๋ docker-compose์์ ๋ค์ ํฌํธ ์ค์ ํด์ค ๊ฑฐ๋ผ์ ๊ฑฑ์ ์ํด๋ ๋๋ค!
jib
์ด๊ฑด ์๋ฐ ํ๊ฒฝ์์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์ ์ธ๋ฐ plugin ์ค์ ์ ํด๋ดค์ง๋ง ์์ธ์ง ์ ์๋๋ค.
https://medium.com/@gaemi/spring-boot-๊ณผ-docker-with-jib-657d32a6b1f0
Spring Boot ๊ณผ Docker (with jib)
์ด ๊ธ์ Spring Boot ๊ธฐ๋ฐ์ Application ์ Docker ์ด๋ฏธ์ง๋ก ๋ฐฐํฌํ๋ ๊ณผ์ ์ jib ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ํํ๋ ๊ณผ์ ์ ๋ํด์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
medium.com
Step2) ์๋ผ์คํฑ ๋น ์คํก ํ๊ฒฝ ์ค์ ์ ํ์
https://browndwarf.tistory.com/66
Elastic Beanstalk - (1) Java Jar ํ์ผ์ ํตํ Web Application Deploy
Spring Boot๋ก ๊ฐ๋ฐํ Application์ AWS์ Elastic Beanstalk์ผ๋ก ๋ฐฐํฌํ๋ ๋ด์ฉ์ ์๋์ 3๊ฐ์ ํฌ์คํ ์ ๊ฑธ์ณ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค. Jar ํ์ผ์ ์ด์ฉํ ๋ฐฐํฌ ๋ฐ ๋ด๋ถ ๊ตฌ์กฐ ์ดํด Tomcat + War ํ์ผ์ ์ด์ฉํ ๋ฐฐํฌ
browndwarf.tistory.com
์ด ๊ธ ๊ทธ๋๋ก ํ๋ฉด๋๋ค.
๋ค๋ง ํ๋ซํผ์ ๋์ปค๋ก ํด์ฃผ์ธ์!
ํ๊ฒฝ์์ฑํ๊ธฐ ์ ์ ๊ผญ ์ถ๊ฐ ์ต์ ๊ตฌ์ฑ์ผ๋ก ๊ฐ์ธ์!
Step 3) IAM ์ค์ ์ ํ์
์๊น step 2 ๋ธ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด IAM ์ค์ ์ ํ๋๊ฒ ์๋ค. ๋ณด๊ณ ๋ฐ๋ผํ๋ฉด ๋๋ค.
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY๋ฅผ
๊นํ ๋ ํฌ Settings-> Secrets->actions์ ๋ฑ๋กํด์ฃผ๋ฉด ๋๋ค!
Step 4) Docker Hub ๊ณ์ ์์ฑ ๋ฐ Secrets์ ๋ฑ๋กํ๊ธฐ
DOCKERHUB_USERNAME, DOCKERHUB_TOKEN ์ ๊นํ ๋ ํฌ Settings-> Secrets->actions
์ ๋ฑ๋กํด์ค๋ค. username์ด ์์ด๋ token์ด ๋น๋ฒ์ด๋ค.
Step 5) Github Action ์ฌ์ฉ์ ์ํ gradle.yml ํ์ผ ์์ฑํ๊ธฐ
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adopt'
### Gradle ###
- name: Run chmod to make gradlew executable
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
- name: Get current time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Show Current Time
run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"
shell: bash
- name: Docker build
run: |
docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }}
docker build -t docker-jungmin .
docker tag docker-jungmin jungminleeee/docker-jungmin:latest
docker push jungminleeee/docker-jungmin:latest
# Beanstalk ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉ
# ๋ฏธ๋ฆฌ ์์ฑํด๋ IAM ์ธ์ฆํค๋ฅผ ์ฌ์ฉ
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v21
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: jungminExercise
environment_name: Jungminexercise-env
version_label: github-action-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: docker-compose.yml
use_existing_version_if_available: true
Step 6) Dockerrun.aws.json ํ์ผ ์์ฑํ๊ธฐ
Docker ๊ตฌ์ฑ - AWS Elastic Beanstalk
๋ ํ์ผ์ ๋ฃจํธ์ ์๊ฑฐ๋, .zip ์์นด์ด๋ธ์ ์ต์์์ ์์ด์ผ ํฉ๋๋ค. ํ์ผ์ ํฌํจํ๋ ๋๋ ํฐ๋ฆฌ์์ ์์นด์ด๋ธ๋ฅผ ๋น๋ํ์ง ๋ง์ญ์์ค. ํด๋น ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ ํ ์์นด์ด๋ธ๋ฅผ ๋น๋ํ์ญ์์ค. ๋ ํ
docs.aws.amazon.com
๊ณตํ์ ๊ฐ๋ณด๋ฉด docker-compose๋ฅผ ์์ฐ๋ฉด Dockerrun.aws.json์ ์จ์ฃผ๋ฉด ๋๋ค๊ณ ํ๋ค.
๊ทผ๋ฐ ๋ ๋ถ์ํด์ ๋ ๋ค ์จ์คฌ๋ค ใ ใ ใ ใ
Dockerrun.aws.json
version: "3"
services:
backend:
image: "jungminleeee/docker-jungmin:latest"
ports:
- "8080:5000"
restart: "always"
docker-compose.yml
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "jungminleeee/docker-jungmin:latest",
"Update": "true"
},
"Ports": [
{
"ContainerPort": 8080,
"HostPort": 5000
}
]
}
์ด๊ฑธ ์ ์ฉํ๋ ๋ถ๋ถ์
EB ์ค์ ์ชฝ์ deployment_package๊ฐ ๋๋ค!
'DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[GCP] Cloud Run์ผ๋ก ์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ฅผ ์น์๋ฒ์ ๋ฐฐํฌํด๋ณด์! (0) | 2023.02.06 |
---|