CD: AWS EC2 생성 후 내부 접속하여 CI 로 만든 Docker 이미지 실행
개발자 대신 Github Action이 직접 EC2에 접근하여 도커 이미지를 컨테이너로 실행
아래 과정을 거쳐서 Github Action을 자동화 해줘야한다.
1. github action 에게 접근하고 조작할 수 있는 권한주기 -> IAM 을 통해서 부여
2. github action 이 EC2 서버에 들어가기 위한 방화벽 설정
3. EC2 shell 에 접근하기 위해 key pair 사용하지 않고 IAM 으로 접근해서 image pull, run 자동화
1. AWS IAM 설정: Github Actions 가 EC2 에 접근할 계정 생성
IAM: AWS 서비스에 대한 접근 권한을 가진 사용자를 생성하는 서비스
Github Action이 EC2에 접근하기 위한 권한을 부여해줘야한다.
1. IAM 사용자 생성
"Github Actions 에서 AWS EC2 에 접근가능" 사용자를 생성해준다.
2. IAM 생성 후 액세스 키 설정
IAM 에 accessKey를 설정해준다.
AWS 외부(Github Actions)에서 접근할 것이기 때문에 해당 옵션을 선택한 후 액세스 키를 생성한다.
이때 생성되는 액세스 키와 비밀 액세스 키는 반드시 따로 저장하여 보관해야한다.
2. IAM 을 통해서 EC2에 접근하기 위한 설정
이전에 저장해둔 Accesskey로 EC2 에 접근하도록 설정할 것이다.
IAM 계정으로 EC2 에 SSH 로 접근하기 위한 방법으로 여러개가 있다. 대표적으로 2가지가 있다.
- 비대칭키인 `.pem`키를 통해 EC2 에 SSH 연결하는 방식 (개발 친화적)
- EC2 의 아이디 / 비밀번호를 통해 EC2 에 SSH 연결하는 방식 (초보 친화적)
이번에 두번째 방법인 아이디/비밀번호를 사용할 것이다.
Github Action에 AWS EC2 에 접근하기 위한 EC2 아이디/비밀번호 키 설정을 해놓아야한다.
1. EC2 내 아이디, 비밀번호 값 확인 및 설정
아이디 확인: 일반적으로 EC2 의 아이디(username)은 아래 명령어로 알 수 있다.
whoami
비밀번호 설정: 아래 명령어를 입력하면, 비밀번호 입력창이 나온다.
sudo passwd ec2-user
2. 패스워드 연결 방식 사용 설정
EC2 에 SSH 기본 연결 방법은 (2) 아이디 / 패스워드 가 아닌 1. 비대칭 .pem 키 기반이라 설정 변경 필요
sudo vi /etc/ssh/sshd_config
65번째 라인에 `PasswordAuthentication no` 라고 표기되어 있는 것을 `yes`로 변결 후 저장
위 파일 수정 후 sshd service 재식작을 해줘야한다.
sudo systemctl restart sshd
3. Github Actions Secret key 등록
이전 실습해서 설정한 Secret Key 이외에도 이번에 추가적으로 설정해줘야 하는 Secret Key 가 많다.
- Github Actions 에서 EC2 접근을 위한 IAM 사용자 권한을 얻기 위한 키
- 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 주소 (예: 52.78.224.237)
- EC2_SSH_PORT : Port = SSH로 접근할 포트 (예: 22)
- AWS_SG_ID : 방화벽(SG) = EC2 의 보안그룹 ID (예: sg-022bbf42d6524ff82)
- EC2_USERNAME : 아이디 = EC2 의 계정명 (예: ec2-user)
- EC2_PASSWORD : 패스워드 = EC2 에 설정해두었던 패스워드
- IP + Port + 방화벽(SG) + 아이디 + 패스워드
Github Action 스크립트 작성
name: Java CI with Gradle
# master 브랜치에 push, PR 이벤트 발생시 동작.
on:
push:
branches: [ "main" ]
# pull_request:
# 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 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
'ASAC 웹 풀스택 > DevOps' 카테고리의 다른 글
[Github Action] Github Action 동작 원리 및 워크플로 파일 이해하기 (0) | 2024.10.29 |
---|---|
[Docker] best practices (1) | 2024.10.24 |
[Docker] Docker Workflow (1) | 2024.10.19 |
[Docker] Docker를 통한 어플리케이션 관리: 단일 / 다중 컨테이너 (0) | 2024.10.16 |
[Docker] Docker 사용하는 이유 (0) | 2024.10.16 |