[aws] 프로젝트 ci-cd 구축
Categories: cloud
📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]
배포 실습
EC2 생성
🪄 핵심 요약 인스턴스 시작 ✅애플리케이션 - ubuntu - 22.04 (프리티어!!!) ✅키페어 - 새 키페어 생성 - 사용할 폴더로 이동 ✅인스턴스 시작
![]()
키 페어생성 누르면 key가 다운 받아짐. 내가 알고 있는 폴더에 넣어두기.
다른 것 안건들이고 인스턴스 시작
버킷 생성
🪄 핵심 요약 ✅버킷 이름은 중복이 안됨 ✅ 리전은 서울이어야 한다. ✅모든 퍼블릭 액세스 차단 - 체크 해제
리전 확인해서 서울이 아니면 다시 설정.
퍼블릭 액세스 차단 설정 - 모든 퍼블릭 액세스 차단 체크 해제, 노란박스는 체크하기.
데이터베이스생성
🪄 핵심 요약
✅엔진유형 - MySQL ✅템플릿 - 프리티어!!!!!!! (이거 잘못누르면 비쌈) ✅마스터 암호 (8자이상, 기억하기 쉬운걸로) ✅연결 - 퍼블릭엑세스 → 예 ✅연결 - 추가구성 - 데이터베이스 포트 → 13306 ✅모니터링 아래 추가구성 - 초기 데이터베이스 이름 → test ✅데이터베이스 생성
- 표준생성 > MySQL > 템플릿 프리티어 설정
1
2
3
4
5
<img src="https://github.com/user-attachments/assets/a3423fbf-f9a7-4b85-bc3b-e67b57444cc6" width =500/>
<img src="https://github.com/user-attachments/assets/295d9d7b-f2dc-4c17-8262-cf2351e16e0d" width =500/>
- 템플릿은 무조건 프리티어로 설정한다. 특히 RDS는 비쌈 프리티어 표시 꼭 확인하기
-
인스턴스식별자 (내가 구분할 수 있게 ) , 자격증명 설정에 사용자 이름은 admin으로 설정, 암호 설정
- 암호 적기 기억하기 쉬운 것으로!
-
기본 설정으로 유지하고 퍼블릭 액세스만 예 체크하기
-
추가 구성 토글 열어서 13306 설정하기 (3306으로 하면 보안에 좋지 않다..)
-
모니터링 아래에 추가 구성 토글 열어서 데이터페이스 옵션에 이름 생성
-
그다음 데이트베이스 생성 클릭
EC2에서 인스턴스 연결 규칙 추가 및 연결
EC2
- 인스턴스 ID 클릭 - 보안 - 보안그룹 클릭 - 인바운드 규칙 편집
-
규칙 추가 (사용자 지정 TCP, 포트범위 8080, 소스 Anywhere IPv4) - 규칙저장
-
EC2는 껏다 키면 IP변경 되므로 껏다키지말기
-
인스턴스 - 인스턴스ID - 연결 - SSH클라이언트 - 제일 아래의 예 복사
터미널
키페어 넣어둔 폴더로 이동 해서 복사 한 것 붙여 넣기 < 아래 1번처럼 key 실행
- C:\AWS>attrib +r AWS_KEY.pem (AWS_KEY 는 생성한 키 이름 , 새로 만들었던 이름으로 변경 해서 넣을 것)
- Warning 발생하면 아래 명령어 입력.
- icacls.exe AWS_KEY.pem /reset
- icacls.exe AWS_KEY.pem /grant %username%:(R)
- icacls.exe AWS_KEY.pem /inheritance:r
- 작성 후 ssh -i 로 시작하는 위의 인스턴스 주소를 복사해서 붙여넣기.
-
예시
- apt
- sudo apt update
- sudo apt install openjdk-11-jre-headless 후에
- java -version 명령어 입력 후 자바버전 확인하기.
-
예시
여기까지 EC2 준비 끝
배포 파일-resource-property 수정
🪄 핵심 요약
✅application.properties 로 들어가기 ✅AWS - RDS - 데이터베이스ID - 엔드포인트 복사 ✅datasourse.url=jdbc:mysql:// 뒤에 붙여넣기:13306/test ✅username=admin ✅password= RDS에서 설정한 암호 ✅config.domain = 버킷웹사이트 엔드포인트 , EC2 껏다키면 도메인 바뀜
- database (spring.datasource.url에 RDS 엔드포인트 복사해서 붙여넣기.)
-
RDS-데이터베이스- 만들었던 DB 클릭 후 엔드포인트 복사하기.
-
- config.domain에 S3 - 속성 - 정적웹사이트호스팅 활성화 후 버킷 웹사이트 엔드포인트 복사 후 붙여넣기
- S3 - 속성 - 정적웹사이트호스팅 편집
활성화하고 인덱스 문서에 페이지 지정하기.
이 주소를 config.domain에 붙어넣기하기
-
Gradle-build-bootJar 클릭
-
build 한 파일 AWS 키 있는 위치로 옮기기.
1
C:\AWS>scp -i AWS_KEY.pem DeployServer-0.0.1-SNAPSHOT.jar ubuntu@ec2-3-38-246-253.ap-northeast-2.compute.amazonaws.com: DeployServer-0.0.1-SNAPSHOT.jar
//내 키 이름 + 배포파일 이름 + EC2 인스턴스연결 주소
우분투에서 ls 해서 파일이 이동했는지 확인 한 다음
파일 실행 명령어 입력 → java -jar DeployServer-0.0.1-SNAPSHOT.jar
포스트맨 실행
EC2의 퍼블릭IPv4 복사 후 > 주소+ :8080 으로 요청하면 된다.
- /signin 으로 Post시 나온 token을 복사
-
/status 입력 후 key에 Authorization, value 에 token 값 붙여넣기 후 get요청
-
결과
- 무한로딩이 된다면 인바운드 규칙이 두 개가 아닌 하나 밖에 없는 것. 인바운드 규칙에 사용자지정 TCP, 포트범위 13306
html에 EC2 주소 넣고 버킷 정책 편집
- index.html 파일에 url 넣기.
- EC2 - public DNS 주소 복사 const url = “http://복사한 내용 :8080” 로 수정
VSCode는 자동 저장이 안되기 때문에 저장 필수
- 업로드
-
S3 - 내 버킷 - 업로드 - 파일 및 폴더 => DeployClient 폴내 파일 7개 드래그 후 업로드
-
-
버킷 - 권한 - 버킷 정책 - 편집 - 버킷ARN 복사 - 우측 정책 생성기
-
ARN 복사 > 정책 생성기
!
-
-
정책생성기
- Policy → Bucket Policy
- principal → *
- Actions → Get Object
- ARN => 복사한거 붙여넣기 /*
- Add Statement
-
생성 확인 후 Generate Policy 클릭
-
뜨는 JSON 복사 후
-
정책에 붙여 넣기 - 변경사항 저장
- 버킷 - 속성 - 제일 아래 정적 웹사이트 호스팅의 버킷 웹 사이트 엔드포인트 (http~) 클릭
지속적 배포 준비 : AWS 액세스 키 발급
Github Actions를 이용해 지속적 배포를 구성하기 위해선 AWS에 인증할 수단이 필요
외부 서비스에서 AWS의 서비스를 사용하기 위해 사용하는 수단이 바로 액세스 키, 비밀 액세스 키 페어
IAM > 사용자
에서 본인이 로그인해서 서비스를 사용하는 IAM User를 선택-
IAM User 계정에서 보안 자격 증명
-
보안 자격 증명 탭에서 아래로 내려 액세스 키에서
액세스 키 만들기
버튼을 클릭 - 1단계 액세스 키 모범 사례 및 대안에선 지금 생성할 액세스 키를 어디서 사용할지 선택
-
Github Actions에서 사용하려면
AWS 외부에서 실행되는 애플리케이션
을 선택
-
- 2단계 설명 태그 설정은 선택 사항, 액세스 키에 대한 설명을 넣어주면 관리하기 용이
- 액세스 키가 발급되면 키와 비밀 엑세스키를 확인할 수 있음, 완료 버튼 클릭 시 다시는 확인할 수 없으니 반드시 다른 곳에 복사하거나
.csv
파일 다운로드로 키 페어를 파일로 보관해두기
Github Secret 설정
액세스 키와 비밀 액세스 키가 있으면 Github Actions에서 AWS의 서비스에 접근 가능
-
배포 코드가 올라가 있는 Github 리포지토리의
Settings > Secrets and variables > Actions
탭으로 이동하여 화면 오른쪽에 있는New repository secret
버튼을 클릭
지속적 배포
- EC2 - 인스턴스 생성
-
EC2 인스턴스 연결 버튼 클릭 후 SSH 명령어 복사- 붙여넣고 - ubuntu 접속
1
ssh -i "key.pem" ubuntu@<EC2-주소>
-
EC2에 SSH로 접속 후, 아래 명령어를 통해 aws-cli와 docker를 설치
1 2 3 4 5
sudo snap install aws-cli --classic sudo snap install docker sudo systemctl enable snap.amazon-ssm-agent.amazon-ssm-agent.service sudo systemctl start snap.amazon-ssm-agent.amazon-ssm-agent.service
- EC2 IAM 설정
- IAM → 역할 → 역할 생성
- AWS 서비스 선택
- 사용 사례에서 EC2 선택 → 다음.
- AmazonSSMManagedInstanceCore 검색 및 선택.
- AmazonSSMPatchBaselineForInstanceCore 검색 및 선택.
- 두 정책 모두 체크 후 다음으로 진행.
- 역할 이름 - practice-deploy-role, 태그 추가 - 키 -> ci-cd (구분하기 쉬운 값 넣으면 된다)
- IAM 역할 EC2에 연결
- EC2 → 인스턴스 → 작업 → 보안 → IAM 역할 수정
- 방금 생성한 IAM 역할(practice-deploy-role)을 선택.
- IAM 역할 업데이트 클릭.
Github Actions에 배포 자동화를 위한 Workflow 작성
Github Actions의 동작을 정의하는 yml 파일에 지속적 배포를 위한 작업을 추가
들여쓰기 유의하여 작성하기!!
Main.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#위 내용은 지속적 통합을 위한 스크립트
#지속적 통합을 위한 스크립트 아래에 작성
# 1 번
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: $
aws-secret-access-key: $
aws-region: ap-northeast-2
# 2 번
- name: Start Session Manager session
run: aws ssm start-session --target {인스턴스 id 값}
# 3 번
- name: Deploy to Server
env:
AWS_ACCESS_KEY_ID: $
AWS_SECRET_ACCESS_KEY: $
AWS_REGION: ap-northeast-2
run: |
aws ssm send-command \
--instance-ids {인스턴스 id 값} \
--document-name "AWS-RunShellScript" \
--parameters "commands=[
'if sudo docker ps -a --format \\'\\' | grep -q \\'^server$\\'; then',
' sudo docker stop server',
' sudo docker rm server',
'fi',
'sudo docker pull {도커 유저네임}/spring-cicd:${GITHUB_SHA::7}',
'sudo docker tag {도커 유저네임}/spring-cicd:${GITHUB_SHA::7} spring-cicd',
'sudo docker run -d --name server -p 8080:8080 spring-cicd'
]" \
--output text
🔹main.yml의 -name
은 하나의 작업
- Configure AWS credentials
- AWS의 액세스 키와 비밀 액세스 키의 정보를 가지고 AWS에 인증
- AWS_Access_Key와 AWS_Secret_Access_Key는 공개 저장소에 업로드되면 안되는 값
- 이 값을 통해 AWS 계정의 리소스에 접근할 수 있으므로 직접 main.yml에 작성하는 게 아니라 반드시 Github Secret에 저장하고 Github Actions가 등록된 Secret의 이름을 통해 값을 가져올 수 있도록 등록해야한다.
- Start Session Manager session
- AWS 세션매니저를 이용해 EC2에 연결.
{인스턴스 id 값}
자리엔 본인 리소스의 인스턴스 id 값을 입력- ex )
aws ssm start-session --target i-03fcf92a9ea84738c
- Deploy to Server
- 직전 단계에서 연결한 특정 EC2 인스턴스의 세션매니저를 통해 실행하고 싶은 명령어를 전송
- 도커 허브에 업로드 된 웹 애플리케이션 이미지를 pull 받은 후 server라는 이름의 컨테이너로 실행
- 이미 server라는 이름의 컨테이너가 실행 중이라면 종료 후 삭제한다
- 지속적 통합 과정에서 도커 허브에 업로드 된 특정 태그 이미지를 EC2 인스턴스에 pull 받는다.
- 특정 태그의 이미지를 바탕으로 태그가 없는 spring-cicd 이미지를 생성한다.
- spring-cicd 이미지를 server라는 이름의 컨테이너로 8080번 포트를 통해 접근할 수 있도록 실행한다.
🔹 위 스크립트를 맨 마지막 단계로 추가하면 CI(지속적 통합) 작업을 성공적으로 마친 후 각 단계에 작성된 내용대로 Push 된 도커 이미지를 배포 대상 서버에 Pull하고 알맞게 컨테이너를 생성한 뒤 새로 만든 컨테이너를 실행
배포 자동화 테스트
배포 자동화를 위한 설정은 모두 끝
이제 배포 자동화가 지속적 배포를 통해 성공하는지 테스트 필요.
- Github Actions의 처리 결과를 통해 1차 확인을 하고
- Post-man을 통해 간단한 테스트 API가 정상 동작하는지 2차 확인
Leave a comment