์ค์ต #3

์์ ํฌ์คํ ์์ ์ธ๊ธํ๋ฏ, ๋งค๋ฒ ๋ฐฐํฌ ์, GitHub Actions๊ฐ Docker Hub์ ์ด๋ฏธ์ง๋ฅผ ํธ์ํ๊ณ , ๊ฐ๋ฐ์๊ฐ EC2์ ์ง์ ์ ์ํด ์๋์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ์คํํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ๊ณ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์, Github Actions๊ฐ ์ด๋ฏธ์ง๋ฅผ Docker Hub์ ํธ์ํ ํ ์๋์ผ๋ก EC2์ ์ ์ํด ์ด๋ฏธ์ง๋ฅผ Pullํ๊ณ ์ปจํ ์ด๋๋ฅผ ์คํํ๋๋ก ์ค์ ํ๋ฉด ํจ์ฌ ๋ ์์ํ๊ณ ํธ๋ฆฌํ๊ฒ ์๋ ๋ฐฐํฌ๋ฅผ ์ํํ ์ ์๋ค.
๋ฐ๋ผ์ ์ด๋ฒ ํฌ์คํ ์์ ์๋์ผ๋ก ์ด๋ฏธ์ง๋ฅผ Pull, ์ปจํ ์ด๋๋ฅผ ์คํํ๋๋ก ์ค์ ํ๋ ์์ ๊ณผ์ ์ ํฌ์คํ ํ ์์ ์ด๋ค.
- ์ด ์๋ํ ๋ฐฉ์์์๋ GitHub Actions๊ฐ EC2์ SSH๋ก ์ ๊ทผํด ๋ค์ ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค.
- Docker Hub์์ ์ต์ ์ด๋ฏธ์ง Pull: ์๋ก์ด ์ด๋ฏธ์ง๊ฐ ์์ฑ๋๊ณ Docker Hub์ ํธ์๋๋ฉด GitHub Actions๊ฐ EC2์ ์ ์ํ์ฌ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๊ฐ์ ธ์จ๋ค.
- ์ปจํ ์ด๋ ์คํ: GitHub Actions๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ ์ปจํ ์ด๋๋ฅผ ์คํ, ๋ฐฐํฌ๊น์ง ์์ ์๋ํ ํ ์ ์๋ค.
1. CI: Github ๋ด Java ์ฝ๋๋ฅผ Github Actions๋ก ๊ฐ์ ธ์ Docker ๋น๋
์์น: Github Actions
- Java ์ฝ๋์ ๋ํ ํ ์คํธ ๊ณผ์ ์ ๋ฐ๋ก ์งํํ์ง ์๊ณ , Java ๋น๋ ๋จผ์ ์์ ํ Docker Image๋ฅผ ๋น๋.
2. CD: AWS EC2 ์์ฑ ํ ๋ด๋ถ ์ ์ํ์ฌ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง ์คํ
์์น: AWS EC2 = ์ ํ๋ฆฌ์ผ์ด์ (ํ๋ก๊ทธ๋จ)์ด ๊ตฌ๋ ๋ ์๋ฒ
๊ฐ๋ฐ์๊ฐ ์ง์ AWS EC2์ ์ ์โ Github Actions์ด ์ง์ AWS EC2์ ์ ์- Github Actions์์ EC2์ ์ ๊ทผ๊ฐ๋ฅ ํ๋๋ก ์ค์ ํ๊ธฐ ์ํด AWS IAM์ ํตํด EC2์ ๋ํ Github Actions์ ๊ถํ์ ์ค์ ํด์ผํ๋ค.
2.1. AWS IAM ์ค์ : Github Actions๊ฐ EC2์ ์ ๊ทผํ ๊ณ์ ์์ฑ
AWS IAM ์ด๋?
- AWS ์๋น์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ ๊ฐ์ง ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ ์๋น์ค
- ์ด๋ฒ์ ์์ฑํ ์ฌ์ฉ์๋ "Github Actions์์ AWS EC2์ ์ ๊ทผ ๊ฐ๋ฅ" ์ฌ์ฉ์
- ์ฌ์ฉ์ ์์ฑ ์ ์ค์ ํ๋ Access Key๋ฅผ GitHub Actions์ ์ ์ฅํ์ฌ AWS Console๋ก EC2์ ์ ๊ทผ ์๋ฆฌ
- Access Key๋ ์ธ๋ถ์ ๋ ธ์ถ๋์๋ ์๋๊ณ , ์์ ํ๊ฒ ์ ์ฅ๋์ด์ผ ํ๋ค.
1. IAM ์ฌ์ฉ์ ์์ฑ
- ์ฌ์ฉ์ ์์ฑ ๋ฒํผ ํด๋ฆญ.


1-2. IAM ์์ฑ๊ณผ ๋์์ ๊ถํ ์ค์ (์ ์ด๋ฏธ์ง์ ๋ค์ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ด๋ํ๋ค)
- ๊ถํ ์ ์ฑ ์ `EC2FullAccess`๋ฅผ ๊ฒ์ โ AmazonEC2FullAccess๋ฅผ ์ ํํ๋ค.


1-3. IAM ์์ฑ ํ ์ก์ธ์ค ํค ์ค์
- ์ก์ธ์ค ํค ๋ง๋ค๊ธฐ ํด๋ฆญ

- AWS ์ธ๋ถ (Github Actions)์์ ์ ๊ทผํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ์ต์ (AWS ์ธ๋ถ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ )์ ํด๋ฆญํ

- ์ด ๋ ์์ฑ๋๋ ์ก์ธ์ค ํค์ ๋น๋ฐ ์ก์ธ์ค ํค๋ ๋ฐ๋์ ๋ฐ๋ก ์ ์ฅํ์ฌ ๋ณด๊ดํ์ฌ์ผ ํ๋ค. Docker Hub Access Key์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒ์ ์์ฑํ ๋๋ง ํ์ธํ ์ ์์ ! (์ด๋ฏธ์ง ์๋จ ์ด๋ก์ ์ค๋ช ์๋ ๋ช ์๋์ด์๋ค.)


2. IAM์ ํตํด EC2์ ์ ๊ทผํ๊ธฐ ์ํ ์ค์ : ID, Password ์ ๊ทผ ๋ฐฉ๋ฒ์ผ๋ก ์ค์
- EC2์ SSH๋ก ์ ๊ทผํ ๋, IAM ๊ณ์ ์ ์ฌ์ฉํ๋ ๋ ๊ฐ์ง ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋ค.
- ๋น๋์นญ ํค(.pem)๋ฅผ ์ฌ์ฉํ์ฌ EC2์ SSH ์ฐ๊ฒฐ(๊ฐ๋ฐ ์นํ์ )
- ์์ด๋/๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ EC2์ SSH ์ฐ๊ฒฐ(์ด๋ณด ์นํ์ )
- ์ด๋ฒ์ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ ์์ด๋/๋น๋ฐ๋ฒํธ๋ฅผ ํตํด EC2์ ์ ๊ทผํ์ฌ, ์ด๋ฅผ ์ํด GitHub Actons์ EC2 ์์ด๋์ ๋น๋ฐ๋ฒํธ ์ค์ ์ ๋ฏธ๋ฆฌ ํด๋์ด์ผ ํ๋ค.
2-1. EC2 ์์ด๋ ๋ฐ ๋น๋ฐ๋ฒํธ ์ค์
- ์์ด๋ ํ์ธ: ๊ธฐ๋ณธ์ ์ผ๋ก EC2์ ์์ด๋๋ `ec2-user` โ `whoami` ๋ช ๋ น์ด๋ก ํ์ธํ ์ ์๋ค.

- ๋น๋ฐ๋ฒํธ ์ค์ : ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด, ๋น๋ฐ๋ฒํธ ์ ๋ ฅ์ฐฝ์ด ๋์จ๋ค. | ์์ด๋๊ฐ `ec2-user`๋ผ๊ณ ๊ฐ์
sudo passwd ec2-user

2-2. ํจ์ค์๋ ์ฐ๊ฒฐ ๋ฐฉ์ ์ฌ์ฉ ์ค์
- EC2์ SSH ๊ธฐ๋ณธ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ์ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ ์์ด๋/ํจ์ค์๋ ๋ฐฉ๋ฒ์ด ์๋ ๋น๋์นญ .pemํค ๊ธฐ๋ฐ์ด๋ผ ์ค์ ์ ๋ณ๊ฒฝํด์ผํ๋ค.
sudo vi /etc/ssh/sshd_config
- 65๋ฒ์งธ ๋ผ์ธ์ `PasswordAuthentication no`๋ฅผ `yes`๋ก ๋ณ๊ฒฝ ํ ์ ์ฅํ๋ค.

- sshd service ์ฌ์์ : ์ค์ ์ ์ฅ ํ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ๊ธฐ ์ํด restart๋ฅผ ํด์ค์ผ ํ๋ค.
sudo systemctl restart sshd

2-3. Github Actions Secret Key ๋ฑ๋ก
์ด์ ์ ์ค์ ํ Secret Key(DOCKERHUB_USERNAME, DOCKERHUB_PW) ์ธ์๋ ์ด๋ฒ์ ์ถ๊ฐ์ ์ผ๋ก ์ค์ ํด์ผํ๋ Secret Key๊ฐ ๋ง๋ค. (https://1000sang-dev.tistory.com/68)
- Github Actions์์ EC2 ์ ๊ทผ์ ์ํ IAM ์ฌ์ฉ์ ๊ถํ์ ์ป๊ธฐ ์ํ ํค (๋ณธ๋ฌธ 1-3)
- AWS_ACCESS_KEY_ID: IAM์์ ์ค์ ํ Access Key(์ก์ธ์ค ํค)
- AWS_SECRET_ACCESS_KEY: IAM์์ ์ค์ ํ Secret Access Key(๋น๋ฐ ์ก์ธ์ค ํค)


- IAM ์ฌ์ฉ์ ๊ถํ์ ์ป์ Github Actions์์ EC2 ์ ๊ทผ ์ ํ์ํ ์ ๋ณด โ IP + Port + ๋ฐฉํ๋ฒฝ(SG) + ์์ด๋ + ํจ์ค์๋
- EC2_HOST: IP = EC2์ ํผ๋ธ๋ฆญ IPv4 ์ฃผ์ (์: 3.35.235.247)
- EC2_SSH_PORT: Port = SSH๋ก ์ ๊ทผํ ํฌํธ (์:22)
- AWS_SG_ID: ๋ฐฉํ๋ฒฝ(SG, Security Group) = EC2์ ๋ณด์ ๊ทธ๋ฃน ID (์: sg-007340c03dfb03d73)



- EC2_USERNAME: ์์ด๋ = EC2์ ๊ณ์ ๋ช (์: ec2-user)
- EC2_PASSWORD: ํจ์ค์๋ = EC2์ ์ค์ ํด๋์๋ ํจ์ค์๋ (๋ณธ๋ฌธ 2-1)


- ์ต์ข ์ ์ธ Secret Key

2.2. Github Actions ์คํฌ๋ฆฝํธ ์์
- ๋ผ์ธ๋ณ๋ก ์ด๋ค ์์ฑ์ธ์ง ์๊ณ ์ถ์ผ๋ฉด ํด๋น ํฌ์คํ ์ ์ฐธ๊ณ ํ์ !
https://1000sang-dev.tistory.com/67
[Github Action & Docker] CI / CD ๋ฐฐํฌ
Event, Runner, Job, Step, ActionCI / CD Tool: GitHub ActionsGitHub Actions vs Jenkins CI / CD ํด๋ก ์ ๋ช ํ ๊ฒ์ GitHub Action๊ณผ Jenkins๊ฐ ์๋ค. Jenkins๋ ๋ณ๋์ Jenkins ์๋ฒ๋ฅผ ๋ฐ๋ก ๊ตฌ์ถํด์ผ๋๊ธฐ ๋๋ฌธ์ ๋ฌด๋ฃ ํด์ธ GitHub Actio
1000sang-dev.tistory.com
name: Java CI with Gradle
# main ๋ธ๋์น์ push ํน์ pull request ๊ฐ merged ์ ๋์.
on:
push:
branches: [ "main" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 1) Java ๋ฐ Docker ๋น๋๋ฅผ ์ํ ํ๊ฒฝ ์ค์
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 2) Java ๋น๋๋ฅผ ์ํ ./gradlew ํ์ผ ๊ถํ ๋ณ๊ฒฝ
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 3) Java ๋น๋
- name: Spring Boot Build
run: ./gradlew clean build
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 1) DockerFile ์ ๊ธฐ๋ฐ์ผ๋ก Docker Image ๋น๋
- name: docker image build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo .
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 2) Docker Hub ์ Login
- name: docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PW }}
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 3) Docker Hub ์ ๋น๋๋ ์ด๋ฏธ์ง push
- name: docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 1) Get GitHub IP
- name: get GitHub IP
id: ip
uses: haythem/public-ip@v1.2
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 2) Configure AWS Credentials - AWS ์ ๊ทผ ๊ถํ ์ทจ๋(IAM)
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 3) Add github ip to AWS
- name: Add GitHub IP to AWS
run: |
aws ec2 authorize-security-group-ingress --group-id ${{ secrets.AWS_SG_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 4) AWS EC2 Server Connect & Docker ๋ช
๋ น์ด ์คํ
- name: AWS EC2 Connection
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
password: ${{ secrets.EC2_PASSWORD }}
port: ${{ secrets.EC2_SSH_PORT }}
timeout: 60s
script: |
sudo docker stop github-actions-demo
sudo docker rm github-actions-demo
sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
# sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
sudo docker run -it -d -p 8080:8080 --name github-actions-demo ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 5) Remove Github IP from security group
- name: Remove IP FROM security group
run: |
aws ec2 revoke-security-group-ingress --group-id ${{ secrets.AWS_SG_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32


2.3. Github Action ์คํฌ๋ฆฝํธ ๋ด CD ์คํฌ๋ฆฝํธ ๋ถ๋ถ ์ดํดํ๊ธฐ
1. Get Github IP
- ํ์ฌ GitHub Actions ์ธ์คํด์ค์ IP ์ฃผ์๋ฅผ ํ์ธํ๋ค.
- ์ด IP ์ฃผ์๋ฅผ EC2 ๋ณด์ ๊ทธ๋ฃน์ ์ถ๊ฐํด์ค์ผ, GItHub Actions ์ธ์คํด์ค๊ฐ EC2์ ์ ์ํ ์ ์๋ค.
2. Configure AWS Credentials
- GitHub Actions ์ธ์คํด์ค๊ฐ AWS ์๋น์ค์ ์ ๊ทผํ ์ ์๋๋ก IAM ์ฌ์ฉ์ ๊ถํ์ ์ค์ ํ๋ค.
3. Add GitHub IP to AWS
- GitHub Actions ์ธ์คํด์ค์ IP์ ํฌํธ๋ฅผ EC2 ๋ณด์ ๊ทธ๋ฃน์ ์ถ๊ฐํด GitHub Actions ์ธ์คํด์ค๊ฐ EC2์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ ํ๋ค.
4. AWS EC2 Server Connect
- EC2์ ์ฐ๊ฒฐ๋ ์ํ์์ ํ์ํ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค.
- Docker Hub์์ ๋น๋ ํ Push๋ Docker ์ด๋ฏธ์ง๋ฅผ Pullํ๊ณ Runํ๋ค.
- ๊ธฐ์กด์ ์คํ ์ค์ธ ์ปจํ ์ด๋๊ฐ ์๋ค๋ฉด, ์ด๋ฅผ ์ ์งํ๊ณ ์ญ์ ํ ํ ์๋ก์ด Docker ์ปจํ ์ด๋๋ฅผ ์์ํ๋ค
sudo docker stop github-actions-demo
sudo docker rm github-actions-demo
sudo docker run -it -d -p 8080:8080 --name github-actions-demo ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
5. Remove GitHub IP from Security Group
- GitHub Actions ์ธ์คํด์ค์ IP๋ฅผ EC2 ๋ณด์ ๊ทธ๋ฃน์์ ์ ๊ฑฐํ์ฌ ๋ณด์์ ์ ์งํ๋ค.
- ๋ณด์ ๊ทธ๋ฃน์ด ๋งค๋ฒ ์ GitHub Actions ์ธ์คํด์ค์ ์ด๋ฆฌ์ง ์๋๋ก IP๋ฅผ ์ ๊ฑฐํ๋ค.
2.4. ์ฑ๊ณต ํ์ธ



๋ธ๋ก๊ทธ #1 ~ #3 ์ ๋ฆฌ
์ฃผ์ฒด:
- GitHub Actions ์ธ์คํด์ค: GitHub๊ฐ ์ ๊ณตํ๋ ๋ฌด๋ฃ ์๋ฒ๋ก, GitHub Actions ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ์ฃผ์ฒด.
- AWS EC2 ์ธ์คํด์ค: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐํฌ๋ ์๋ฒ.
์ ์ฐจ:
1. GitHub Actions์์ Java ์ฝ๋ ๋น๋
- GitHub Actions ์ธ์คํด์ค๊ฐ GitHub Repository์์ Java ์์ค ์ฝ๋๋ฅผ ๊ฐ์ ธ์ Java ๋น๋๋ฅผ ์ํ.
2. Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์
- ๋น๋๋ JAR ํ์ผ์ ์ฌ์ฉํด Docker ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ , Docker Hub์ ํธ์(Push)
3. AWS EC2 ์ ๊ทผ ์ค์
- GitHub Actions ์ธ์คํด์ค๊ฐ EC2์ ์ ์ํ ์ ์๋๋ก ์ค์ ํ๊ธฐ ์ํด ๋ ๊ฐ์ง ์์
์ด ํ์ :
- AWS EC2 ๋ณด์ ๊ทธ๋ฃน(SG) ์กฐ์
- GitHub Actions ์ธ์คํด์ค๊ฐ EC2์ ์ ์ํ ์ ์๋๋ก EC2 ๋ฐฉํ๋ฒฝ(SG)์์ 22 ํฌํธ๋ฅผ ํ์ฉํด์ผํจ.
- ์ด๋ฅผ ์ํด GitHub Actions ์ธ์คํด์ค๊ฐ AWS EC2 ๋ณด์ ๊ทธ๋ฃน์ ์กฐ์ํ ์ ์๋ IAM ๊ถํ์ด ํ์ํ๋ค.
- GitHub Actions ์ธ์คํด์ค๊ฐ IAM ๊ถํ์ ํตํด ์์ ์ IP๋ฅผ ๋ณด์ ๊ทธ๋ฃน์ ๋ฑ๋กํ๋ค.
- EC2 SSH ์ ๊ทผ ์ค์
- GitHub Actions ์ธ์คํด์ค๊ฐ EC2 SSH ์ ์์ ์ํด ์์ด๋/๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ๋ค.
- AWS EC2 ๋ณด์ ๊ทธ๋ฃน(SG) ์กฐ์
4. AWS EC2์์ Docker ์ปจํ
์ด๋ ์คํ
- EC2์ ์ ๊ทผ์ด ์ฑ๊ณตํ๋ฉด, Docker Hub์์ ์ด๋ฏธ์ง๋ฅผ Pullํ์ฌ ์ปจํ ์ด๋๋ก ์คํํ๋ค.(Run)
โน๏ธ ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] Dockerize #2 (5) | 2024.11.01 |
---|---|
[Docker] Dockerize #1 (0) | 2024.11.01 |
[GitHub Action & Docker] CD: AWS EC2 ์์ฑ ํ ๋ด๋ถ ์ ์ ํ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง ์คํ #2 (2) | 2024.10.29 |
[GitHub Action & Docker] ์๋: Github Action์ผ๋ก CI + ๊ฐ๋ฐ์๊ฐ ์ง์ CD #1 (3) | 2024.10.29 |
[Github Action & Docker] CI / CD ๋ฐฐํฌ (4) | 2024.10.28 |
์ค์ต #3

์์ ํฌ์คํ ์์ ์ธ๊ธํ๋ฏ, ๋งค๋ฒ ๋ฐฐํฌ ์, GitHub Actions๊ฐ Docker Hub์ ์ด๋ฏธ์ง๋ฅผ ํธ์ํ๊ณ , ๊ฐ๋ฐ์๊ฐ EC2์ ์ง์ ์ ์ํด ์๋์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ์คํํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ๊ณ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์, Github Actions๊ฐ ์ด๋ฏธ์ง๋ฅผ Docker Hub์ ํธ์ํ ํ ์๋์ผ๋ก EC2์ ์ ์ํด ์ด๋ฏธ์ง๋ฅผ Pullํ๊ณ ์ปจํ ์ด๋๋ฅผ ์คํํ๋๋ก ์ค์ ํ๋ฉด ํจ์ฌ ๋ ์์ํ๊ณ ํธ๋ฆฌํ๊ฒ ์๋ ๋ฐฐํฌ๋ฅผ ์ํํ ์ ์๋ค.
๋ฐ๋ผ์ ์ด๋ฒ ํฌ์คํ ์์ ์๋์ผ๋ก ์ด๋ฏธ์ง๋ฅผ Pull, ์ปจํ ์ด๋๋ฅผ ์คํํ๋๋ก ์ค์ ํ๋ ์์ ๊ณผ์ ์ ํฌ์คํ ํ ์์ ์ด๋ค.
- ์ด ์๋ํ ๋ฐฉ์์์๋ GitHub Actions๊ฐ EC2์ SSH๋ก ์ ๊ทผํด ๋ค์ ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค.
- Docker Hub์์ ์ต์ ์ด๋ฏธ์ง Pull: ์๋ก์ด ์ด๋ฏธ์ง๊ฐ ์์ฑ๋๊ณ Docker Hub์ ํธ์๋๋ฉด GitHub Actions๊ฐ EC2์ ์ ์ํ์ฌ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๊ฐ์ ธ์จ๋ค.
- ์ปจํ ์ด๋ ์คํ: GitHub Actions๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ ์ปจํ ์ด๋๋ฅผ ์คํ, ๋ฐฐํฌ๊น์ง ์์ ์๋ํ ํ ์ ์๋ค.
1. CI: Github ๋ด Java ์ฝ๋๋ฅผ Github Actions๋ก ๊ฐ์ ธ์ Docker ๋น๋
์์น: Github Actions
- Java ์ฝ๋์ ๋ํ ํ ์คํธ ๊ณผ์ ์ ๋ฐ๋ก ์งํํ์ง ์๊ณ , Java ๋น๋ ๋จผ์ ์์ ํ Docker Image๋ฅผ ๋น๋.
2. CD: AWS EC2 ์์ฑ ํ ๋ด๋ถ ์ ์ํ์ฌ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง ์คํ
์์น: AWS EC2 = ์ ํ๋ฆฌ์ผ์ด์ (ํ๋ก๊ทธ๋จ)์ด ๊ตฌ๋ ๋ ์๋ฒ
๊ฐ๋ฐ์๊ฐ ์ง์ AWS EC2์ ์ ์โ Github Actions์ด ์ง์ AWS EC2์ ์ ์- Github Actions์์ EC2์ ์ ๊ทผ๊ฐ๋ฅ ํ๋๋ก ์ค์ ํ๊ธฐ ์ํด AWS IAM์ ํตํด EC2์ ๋ํ Github Actions์ ๊ถํ์ ์ค์ ํด์ผํ๋ค.
2.1. AWS IAM ์ค์ : Github Actions๊ฐ EC2์ ์ ๊ทผํ ๊ณ์ ์์ฑ
AWS IAM ์ด๋?
- AWS ์๋น์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ ๊ฐ์ง ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ ์๋น์ค
- ์ด๋ฒ์ ์์ฑํ ์ฌ์ฉ์๋ "Github Actions์์ AWS EC2์ ์ ๊ทผ ๊ฐ๋ฅ" ์ฌ์ฉ์
- ์ฌ์ฉ์ ์์ฑ ์ ์ค์ ํ๋ Access Key๋ฅผ GitHub Actions์ ์ ์ฅํ์ฌ AWS Console๋ก EC2์ ์ ๊ทผ ์๋ฆฌ
- Access Key๋ ์ธ๋ถ์ ๋ ธ์ถ๋์๋ ์๋๊ณ , ์์ ํ๊ฒ ์ ์ฅ๋์ด์ผ ํ๋ค.
1. IAM ์ฌ์ฉ์ ์์ฑ
- ์ฌ์ฉ์ ์์ฑ ๋ฒํผ ํด๋ฆญ.


1-2. IAM ์์ฑ๊ณผ ๋์์ ๊ถํ ์ค์ (์ ์ด๋ฏธ์ง์ ๋ค์ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ด๋ํ๋ค)
- ๊ถํ ์ ์ฑ
์
EC2FullAccess
๋ฅผ ๊ฒ์ โ AmazonEC2FullAccess๋ฅผ ์ ํํ๋ค.


1-3. IAM ์์ฑ ํ ์ก์ธ์ค ํค ์ค์
- ์ก์ธ์ค ํค ๋ง๋ค๊ธฐ ํด๋ฆญ

- AWS ์ธ๋ถ (Github Actions)์์ ์ ๊ทผํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ์ต์ (AWS ์ธ๋ถ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ )์ ํด๋ฆญํ

- ์ด ๋ ์์ฑ๋๋ ์ก์ธ์ค ํค์ ๋น๋ฐ ์ก์ธ์ค ํค๋ ๋ฐ๋์ ๋ฐ๋ก ์ ์ฅํ์ฌ ๋ณด๊ดํ์ฌ์ผ ํ๋ค. Docker Hub Access Key์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒ์ ์์ฑํ ๋๋ง ํ์ธํ ์ ์์ ! (์ด๋ฏธ์ง ์๋จ ์ด๋ก์ ์ค๋ช ์๋ ๋ช ์๋์ด์๋ค.)


2. IAM์ ํตํด EC2์ ์ ๊ทผํ๊ธฐ ์ํ ์ค์ : ID, Password ์ ๊ทผ ๋ฐฉ๋ฒ์ผ๋ก ์ค์
- EC2์ SSH๋ก ์ ๊ทผํ ๋, IAM ๊ณ์ ์ ์ฌ์ฉํ๋ ๋ ๊ฐ์ง ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋ค.
- ๋น๋์นญ ํค(.pem)๋ฅผ ์ฌ์ฉํ์ฌ EC2์ SSH ์ฐ๊ฒฐ(๊ฐ๋ฐ ์นํ์ )
- ์์ด๋/๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ EC2์ SSH ์ฐ๊ฒฐ(์ด๋ณด ์นํ์ )
- ์ด๋ฒ์ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ ์์ด๋/๋น๋ฐ๋ฒํธ๋ฅผ ํตํด EC2์ ์ ๊ทผํ์ฌ, ์ด๋ฅผ ์ํด GitHub Actons์ EC2 ์์ด๋์ ๋น๋ฐ๋ฒํธ ์ค์ ์ ๋ฏธ๋ฆฌ ํด๋์ด์ผ ํ๋ค.
2-1. EC2 ์์ด๋ ๋ฐ ๋น๋ฐ๋ฒํธ ์ค์
- ์์ด๋ ํ์ธ: ๊ธฐ๋ณธ์ ์ผ๋ก EC2์ ์์ด๋๋
ec2-user
โwhoami
๋ช ๋ น์ด๋ก ํ์ธํ ์ ์๋ค.

- ๋น๋ฐ๋ฒํธ ์ค์ : ์๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด, ๋น๋ฐ๋ฒํธ ์
๋ ฅ์ฐฝ์ด ๋์จ๋ค. | ์์ด๋๊ฐ
ec2-user
๋ผ๊ณ ๊ฐ์
sudo passwd ec2-user

2-2. ํจ์ค์๋ ์ฐ๊ฒฐ ๋ฐฉ์ ์ฌ์ฉ ์ค์
- EC2์ SSH ๊ธฐ๋ณธ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ์ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ ์์ด๋/ํจ์ค์๋ ๋ฐฉ๋ฒ์ด ์๋ ๋น๋์นญ .pemํค ๊ธฐ๋ฐ์ด๋ผ ์ค์ ์ ๋ณ๊ฒฝํด์ผํ๋ค.
sudo vi /etc/ssh/sshd_config
- 65๋ฒ์งธ ๋ผ์ธ์
PasswordAuthentication no
๋ฅผyes
๋ก ๋ณ๊ฒฝ ํ ์ ์ฅํ๋ค.

- sshd service ์ฌ์์ : ์ค์ ์ ์ฅ ํ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ๊ธฐ ์ํด restart๋ฅผ ํด์ค์ผ ํ๋ค.
sudo systemctl restart sshd

2-3. Github Actions Secret Key ๋ฑ๋ก
์ด์ ์ ์ค์ ํ Secret Key(DOCKERHUB_USERNAME, DOCKERHUB_PW) ์ธ์๋ ์ด๋ฒ์ ์ถ๊ฐ์ ์ผ๋ก ์ค์ ํด์ผํ๋ Secret Key๊ฐ ๋ง๋ค. (https://1000sang-dev.tistory.com/68)
- Github Actions์์ EC2 ์ ๊ทผ์ ์ํ IAM ์ฌ์ฉ์ ๊ถํ์ ์ป๊ธฐ ์ํ ํค (๋ณธ๋ฌธ 1-3)
- AWS_ACCESS_KEY_ID: IAM์์ ์ค์ ํ Access Key(์ก์ธ์ค ํค)
- AWS_SECRET_ACCESS_KEY: IAM์์ ์ค์ ํ Secret Access Key(๋น๋ฐ ์ก์ธ์ค ํค)


- IAM ์ฌ์ฉ์ ๊ถํ์ ์ป์ Github Actions์์ EC2 ์ ๊ทผ ์ ํ์ํ ์ ๋ณด โ IP + Port + ๋ฐฉํ๋ฒฝ(SG) + ์์ด๋ + ํจ์ค์๋
- EC2_HOST: IP = EC2์ ํผ๋ธ๋ฆญ IPv4 ์ฃผ์ (์: 3.35.235.247)
- EC2_SSH_PORT: Port = SSH๋ก ์ ๊ทผํ ํฌํธ (์:22)
- AWS_SG_ID: ๋ฐฉํ๋ฒฝ(SG, Security Group) = EC2์ ๋ณด์ ๊ทธ๋ฃน ID (์: sg-007340c03dfb03d73)



- EC2_USERNAME: ์์ด๋ = EC2์ ๊ณ์ ๋ช (์: ec2-user)
- EC2_PASSWORD: ํจ์ค์๋ = EC2์ ์ค์ ํด๋์๋ ํจ์ค์๋ (๋ณธ๋ฌธ 2-1)


- ์ต์ข ์ ์ธ Secret Key

2.2. Github Actions ์คํฌ๋ฆฝํธ ์์
- ๋ผ์ธ๋ณ๋ก ์ด๋ค ์์ฑ์ธ์ง ์๊ณ ์ถ์ผ๋ฉด ํด๋น ํฌ์คํ ์ ์ฐธ๊ณ ํ์ !
https://1000sang-dev.tistory.com/67
[Github Action & Docker] CI / CD ๋ฐฐํฌ
Event, Runner, Job, Step, ActionCI / CD Tool: GitHub ActionsGitHub Actions vs Jenkins CI / CD ํด๋ก ์ ๋ช ํ ๊ฒ์ GitHub Action๊ณผ Jenkins๊ฐ ์๋ค. Jenkins๋ ๋ณ๋์ Jenkins ์๋ฒ๋ฅผ ๋ฐ๋ก ๊ตฌ์ถํด์ผ๋๊ธฐ ๋๋ฌธ์ ๋ฌด๋ฃ ํด์ธ GitHub Actio
1000sang-dev.tistory.com
name: Java CI with Gradle
# main ๋ธ๋์น์ push ํน์ pull request ๊ฐ merged ์ ๋์.
on:
push:
branches: [ "main" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 1) Java ๋ฐ Docker ๋น๋๋ฅผ ์ํ ํ๊ฒฝ ์ค์
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 2) Java ๋น๋๋ฅผ ์ํ ./gradlew ํ์ผ ๊ถํ ๋ณ๊ฒฝ
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 3) Java ๋น๋
- name: Spring Boot Build
run: ./gradlew clean build
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 1) DockerFile ์ ๊ธฐ๋ฐ์ผ๋ก Docker Image ๋น๋
- name: docker image build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo .
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 2) Docker Hub ์ Login
- name: docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PW }}
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 3) Docker Hub ์ ๋น๋๋ ์ด๋ฏธ์ง push
- name: docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 1) Get GitHub IP
- name: get GitHub IP
id: ip
uses: haythem/public-ip@v1.2
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 2) Configure AWS Credentials - AWS ์ ๊ทผ ๊ถํ ์ทจ๋(IAM)
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 3) Add github ip to AWS
- name: Add GitHub IP to AWS
run: |
aws ec2 authorize-security-group-ingress --group-id ${{ secrets.AWS_SG_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 4) AWS EC2 Server Connect & Docker ๋ช
๋ น์ด ์คํ
- name: AWS EC2 Connection
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
password: ${{ secrets.EC2_PASSWORD }}
port: ${{ secrets.EC2_SSH_PORT }}
timeout: 60s
script: |
sudo docker stop github-actions-demo
sudo docker rm github-actions-demo
sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
# sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
sudo docker run -it -d -p 8080:8080 --name github-actions-demo ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
# (3) CD : Docker ์ปจํ
์ด๋ ์ํ 5) Remove Github IP from security group
- name: Remove IP FROM security group
run: |
aws ec2 revoke-security-group-ingress --group-id ${{ secrets.AWS_SG_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32


2.3. Github Action ์คํฌ๋ฆฝํธ ๋ด CD ์คํฌ๋ฆฝํธ ๋ถ๋ถ ์ดํดํ๊ธฐ
1. Get Github IP
- ํ์ฌ GitHub Actions ์ธ์คํด์ค์ IP ์ฃผ์๋ฅผ ํ์ธํ๋ค.
- ์ด IP ์ฃผ์๋ฅผ EC2 ๋ณด์ ๊ทธ๋ฃน์ ์ถ๊ฐํด์ค์ผ, GItHub Actions ์ธ์คํด์ค๊ฐ EC2์ ์ ์ํ ์ ์๋ค.
2. Configure AWS Credentials
- GitHub Actions ์ธ์คํด์ค๊ฐ AWS ์๋น์ค์ ์ ๊ทผํ ์ ์๋๋ก IAM ์ฌ์ฉ์ ๊ถํ์ ์ค์ ํ๋ค.
3. Add GitHub IP to AWS
- GitHub Actions ์ธ์คํด์ค์ IP์ ํฌํธ๋ฅผ EC2 ๋ณด์ ๊ทธ๋ฃน์ ์ถ๊ฐํด GitHub Actions ์ธ์คํด์ค๊ฐ EC2์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ ํ๋ค.
4. AWS EC2 Server Connect
- EC2์ ์ฐ๊ฒฐ๋ ์ํ์์ ํ์ํ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค.
- Docker Hub์์ ๋น๋ ํ Push๋ Docker ์ด๋ฏธ์ง๋ฅผ Pullํ๊ณ Runํ๋ค.
- ๊ธฐ์กด์ ์คํ ์ค์ธ ์ปจํ ์ด๋๊ฐ ์๋ค๋ฉด, ์ด๋ฅผ ์ ์งํ๊ณ ์ญ์ ํ ํ ์๋ก์ด Docker ์ปจํ ์ด๋๋ฅผ ์์ํ๋ค
sudo docker stop github-actions-demo
sudo docker rm github-actions-demo
sudo docker run -it -d -p 8080:8080 --name github-actions-demo ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
5. Remove GitHub IP from Security Group
- GitHub Actions ์ธ์คํด์ค์ IP๋ฅผ EC2 ๋ณด์ ๊ทธ๋ฃน์์ ์ ๊ฑฐํ์ฌ ๋ณด์์ ์ ์งํ๋ค.
- ๋ณด์ ๊ทธ๋ฃน์ด ๋งค๋ฒ ์ GitHub Actions ์ธ์คํด์ค์ ์ด๋ฆฌ์ง ์๋๋ก IP๋ฅผ ์ ๊ฑฐํ๋ค.
2.4. ์ฑ๊ณต ํ์ธ



๋ธ๋ก๊ทธ #1 ~ #3 ์ ๋ฆฌ
์ฃผ์ฒด:
- GitHub Actions ์ธ์คํด์ค: GitHub๊ฐ ์ ๊ณตํ๋ ๋ฌด๋ฃ ์๋ฒ๋ก, GitHub Actions ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ์ฃผ์ฒด.
- AWS EC2 ์ธ์คํด์ค: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐํฌ๋ ์๋ฒ.
์ ์ฐจ:
1. GitHub Actions์์ Java ์ฝ๋ ๋น๋
- GitHub Actions ์ธ์คํด์ค๊ฐ GitHub Repository์์ Java ์์ค ์ฝ๋๋ฅผ ๊ฐ์ ธ์ Java ๋น๋๋ฅผ ์ํ.
2. Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์
- ๋น๋๋ JAR ํ์ผ์ ์ฌ์ฉํด Docker ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ , Docker Hub์ ํธ์(Push)
3. AWS EC2 ์ ๊ทผ ์ค์
- GitHub Actions ์ธ์คํด์ค๊ฐ EC2์ ์ ์ํ ์ ์๋๋ก ์ค์ ํ๊ธฐ ์ํด ๋ ๊ฐ์ง ์์
์ด ํ์ :
- AWS EC2 ๋ณด์ ๊ทธ๋ฃน(SG) ์กฐ์
- GitHub Actions ์ธ์คํด์ค๊ฐ EC2์ ์ ์ํ ์ ์๋๋ก EC2 ๋ฐฉํ๋ฒฝ(SG)์์ 22 ํฌํธ๋ฅผ ํ์ฉํด์ผํจ.
- ์ด๋ฅผ ์ํด GitHub Actions ์ธ์คํด์ค๊ฐ AWS EC2 ๋ณด์ ๊ทธ๋ฃน์ ์กฐ์ํ ์ ์๋ IAM ๊ถํ์ด ํ์ํ๋ค.
- GitHub Actions ์ธ์คํด์ค๊ฐ IAM ๊ถํ์ ํตํด ์์ ์ IP๋ฅผ ๋ณด์ ๊ทธ๋ฃน์ ๋ฑ๋กํ๋ค.
- EC2 SSH ์ ๊ทผ ์ค์
- GitHub Actions ์ธ์คํด์ค๊ฐ EC2 SSH ์ ์์ ์ํด ์์ด๋/๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ๋ค.
- AWS EC2 ๋ณด์ ๊ทธ๋ฃน(SG) ์กฐ์
4. AWS EC2์์ Docker ์ปจํ
์ด๋ ์คํ
- EC2์ ์ ๊ทผ์ด ์ฑ๊ณตํ๋ฉด, Docker Hub์์ ์ด๋ฏธ์ง๋ฅผ Pullํ์ฌ ์ปจํ ์ด๋๋ก ์คํํ๋ค.(Run)
โน๏ธ ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] Dockerize #2 (5) | 2024.11.01 |
---|---|
[Docker] Dockerize #1 (0) | 2024.11.01 |
[GitHub Action & Docker] CD: AWS EC2 ์์ฑ ํ ๋ด๋ถ ์ ์ ํ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง ์คํ #2 (2) | 2024.10.29 |
[GitHub Action & Docker] ์๋: Github Action์ผ๋ก CI + ๊ฐ๋ฐ์๊ฐ ์ง์ CD #1 (3) | 2024.10.29 |
[Github Action & Docker] CI / CD ๋ฐฐํฌ (4) | 2024.10.28 |