Bare Minimum Requirement

- AWS 개발자 도구 서비스를 이용해서 배포 자동화 파이프라인을 구축해야 합니다.
- CodePipeline을 이용해서 각 단계를 연결하는 파이프라인을 구축합니다.
- Source 단계에서 소스 코드가 저장된 GitHub 리포지토리를 연결합니다.
- Build 단계에서 CodeBuild 서비스를 이용하여 수동으로 진행했던 build 과정을 자동으로 진행합니다.
- Deploy 단계에서 결과물을 S3 버킷에 자동으로 전달합니다.
- 나중에 변경 사항을 GitHub 리포지토리에 반영했을 경우, 배포 과정이 자동으로 진행되어야 합니다.
- 배포 과정에서 오류가 생길 경우, log 파일을 참조하여 문제점을 확인할 수 있어야 합니다.
Getting Started
repository 주소의 master 브랜치를 이용합니다.
- 위 링크로 접속하여 스프린트 리포지토리를 자신의 리포지토리로 fork 한 뒤, git clone 명령어를 사용하여 로컬 환경에 소스 코드를 저장합니다.
- S3에 버킷을 생성하고, 정적 웹 호스팅용으로 구성합니다.
- 이때 버킷 안은 비어 있어야 합니다.
- S3에서 버킷을 생성하고 정적 웹 호스팅용으로 구성하는 방법을 모르시거나 잊어버린 경우, AWS 유닛에 있는 S3 호스팅 Hands-on 슬라이드를 참조하여 진행합니다.
aws pipeline을 이용해서 배포 자동화를 하는 스프린트였다. 클라이언트는 무척 쉽게 하였다. 우선 s3버킷을 만든다.

미리 퍼블릭 엑세스 가능하게 만들고, 속성에서 정적 웹 사이트 설정도 해주고 권한에서도 버깃 정책을 설정해준다.

그리고 code build를 이용하기 위해 buildspec.yml 파일을 최상위 폴더에 만든 다음 git hub에 푸쉬한다.

pre_build는 빌드 전 하는 행동이고 클라이언트폴더로 이동해 npm i로 의존성 설치하는 것이고 빌드는 말 그대로 빌드며 베이스 디렉토리는 빌드 후 생기는 빌드폴더를 뜻하는것이다.
그 후 code pipeline으로 가서 파이프라인 생성을 시작한다.

소스 공급자는 git hub 레포에서 가지고 올것이기 때문에 git hub(버전 2)를 고른 후 연결을 한다.

연결 후 소스를 가져올 레포, 브랜치를 고르고 소스 코드 변경 시 실행하는 트리거를 원하기 때문에 밑에 체크를 해준다.

그 후 빌드를 만들어 프로젝트를 설정하는데 여기서 고르는 건 도커 이미지이다. 빌드를 할려면 node.js 이런것들이 깔아져있어야하므로 aws에서 미리 깔아둔 이미지를 골라 빌드하는 것이다.

그 후 배포는 s3로 설정하고 파이프라인을 돌리면 이와 같이 자동화가 된 걸 볼 수 있다.

이와 같이 버킷에 들어가면 새로운 버킷이 생기는데 이는 정상이며, 원래 버킷으로 들어가면 배포가 된 모습을 볼 수 있다.


그 후 정적 웹 사이트로 가면 배포된 index.html 파일이 정상적으로 뜨는 걸 알 수 있다.

Bare Minimum Requirement

- AWS 개발자 도구 서비스를 이용해서 배포 자동화 파이프라인을 구축해야 합니다.
- CodePipeline을 이용해서 각 단계를 연결하는 파이프라인을 구축합니다.
- Source 단계에서 소스 코드가 저장된 GitHub 리포지토리를 연결합니다.
- Deploy 단계에서 CodeDeploy 서비스를 이용하여 EC2 인스턴스에 변경 사항을 실시간으로 반영합니다.
- 나중에 변경 사항을 GitHub 리포지토리에 반영했을 경우, 배포 과정이 자동으로 진행되어야 합니다.
- 배포 과정에서 오류가 생길 경우, log 파일을 참조하여 문제점을 확인할 수 있어야 합니다.
위에 빌드를 도와주는 buildspec처럼 code deploy를 도와줄 appspec.yml과 sh 파일들을 만들어야 한다.

파일의 목적지는 sprint폴더고 애플리케이션을 멈출 땐 stop.sh, 인스톨은 initialize.sh, 시작은 start.sh로 가라란걸 알 수 있다.


배포하기전 먼저 스탑을 해야하기때문에 stop.sh에는 서버를 멈추는 코드가 들어가있고 initialize.sh에는 필요한걸 instatll한다.

스타트 역시 서버를 시작하는 코드가 들어가있다. sh파일은 appspec 로케이션에 위치인 최상위폴더에 scripts폴더에 넣는다.
다음은 서버파일을 ec2에 배포하는 것이다. 먼저 ec2를 만들고 IAM설정과 인그라운드설정, 태그 설정이 필요하다.
먼저 IAM설정 하는데 위 그럼과 같이 설정하면 된다. 권한에는 s3와 ssm(AWS Systems Manager)는 풀 엑세스, code deploy는 Role권한만 준 후 신뢰관계에 들어가 codedeploy.ap-northeast-2.amazonaws.com도 넣어줘 권한을 열어준다.



그 후 파이프라인 시작을 하여 소스는 클라이언트와 같으며 서버는 빌드를 따로 필요로 하지않으니 건너뛰기를 하고 배포를 설정한다.
그 전에 먼저, 배포 - 애플리케이션에 들어가 애플리케이션 생성을 해준다.

애플리케이션을 만든 후 배포그룹을 만드는데 서비스 역할은 아까 만들었던 IAM을 고르고 키 값은 아까 만들었던 태그값을 넣으면 된다.


그 후 배포 공급자는 code deploy, 애플리케이션 이름과 배포 그룹은 만든 애플리케이션과 배포 그룹을 넣으면 배포도 완료다.

여기서 많은 오류를 발견했는데 첫번째는 이런 오류였다
CodeDeploy agent was not able to receive the lifecycle event.
Check the CodeDeploy agent logs on your host and
make sure the agent is running and can connect to the CodeDeploy server.
그래서 확인해보니 ec2에 codedeploy agent가 깔리지 않아서 생기는 오류였고 aws 공식문서를 보고 설치 했더니 해결했다.
설치 후 다시 ec2는 재부팅하고 릴리즈하여 파이트라인도 다시 시작하는데 두번째 오류가 생겼다.
Script - scripts/start.sh
[stderr]pm2: No such file or directory
해당 오류는 이유가 많았는데 첫번째는 node버젼이 낮아서 생기거나, path문제 때문에 sudo node가 안 될 때 생기는 오류였다.
로그를 봤을 때 난 node 버젼 문제는 아니었고 path 문제여서
sudo apt update
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
source ~/.bashrc
nvm install node
sudo apt install npm
sudo npm cache clean --force
sudo npm install -g n
sudo n stable
sudo npm install -g npm
nvm install 16.14.2
nvm use 16.14.2
해당 명령어로 해결하고 배포에 성공했다! 하지만 서버 ip를 들어가보니 오류가 났다.. 그 이유는 애초에 소스가 데이터베이스 연결이 안 되면 오류가 나는게 정상이었고 이제 rds를 만들고 환경변수로 데이터베이스값과 ec2 주소만 넣어주면 끝이 날 것 같았다.
Bare Minimum Requirement
- AWS CodeBuild 서비스를 통해 환경 변수를 전달할 수 있어야 합니다.
- AWS Parameter Store 서비스와 AWS CLI를 통해 환경 변수를 전달할 수 있어야 합니다.
Getting Started
- RDS 인스턴스가 생성되어 있어야 합니다.
- 서버 환경 변수 설정 실습이 성공적으로 마무리되기 위해서는 EC2 인스턴스 안에 AWS CLI가 설치되어 있어야 합니다.
먼저 오래 걸리는 RDS부터 만들었고 전 스프린트와 마찬가지로 퍼플릭 엑세스, 인그라운드 규칙에는 mysql도 넣어줬다.
그 후 빌드에 들어가 편집 - 환경 - 추가 구성 - 환경 변수에 값을 넣어줬다. 빌드는 클라이언트이기때문에 서버와 이어줘야하기때문에 환경변수처리한 REACT_APP_API_URL에 ec2ip 값을 넣어줬다.


그럼 이제 rds와 서버를 이어줄 차례다. 먼저 parameter store에 들어가 파라미터를 생성해준다.

위 그림과 같이 rds의 정보를 여기에 넣어주고 저 변수값을 시작할 때 넣어줘야하기때문에 start.sh에 코드를 변경해준다.

그 후 깃허브에 푸쉬하면 자동으로 파이프라인이 돌아가고 배포에 성공한다.

원래 데이터베이스도 연결해서 성공이 떴는데 rds를 중지 시켜서 연결이 안 되었다고 뜬다. (요금은 소중하니까..)
'TIL' 카테고리의 다른 글
| 42일차 마이크로서비스 (0) | 2022.06.15 |
|---|---|
| 36일차 배포 자동화 (0) | 2022.06.07 |
| 34일차 지속적 통합 && 배포 자동화 (0) | 2022.06.02 |
| 33일차 지속적 통합 (0) | 2022.05.31 |
| 32일차 지속적 통합 (0) | 2022.05.30 |