안녕하세요, Cloudraw 입니다!
이번 글에서는 클라우드로의 서비스인 클라우드스튜디오(CloudStudio)로 Ncloud Developer Tool을 활용한 파이프라인을 구축하고 CICD 작업을 수행하는 방법에 대해 알아보겠습니다.
CICD 시나리오
간단한 예제로 nextjs를 기반으로 한 정적 웹페이지를 빌드하는 작업과 sourcedeployAgent를 통해 Ubuntu 서버에 배포하고 Nginx로 보여주는 방법을 구현합니다.
- 클라우드 스튜디오로 배포할 Ubuntu Server를 생성하고 Init Script를 통해 SourceDeployAgent와 Nginx 설치
- 클라우드 스튜디오로 파이프라인 구성하기
클라우드스튜디오(CloudStudio)에서는 위의 시나리오를 구현할 수 있는 CICD 템플릿을 제공합니다. 해당 템플릿을 통해 Ubuntu Server를 만들고, 빌드된 작업물을 Ubuntu Server에 자동 배포까지 가능하도록 구성할 수 있습니다.
사용되는 리소스
- VPC
- Subnet
- Network Security Group
- Network Interface
- Access Control Group
- LoginKey
- InitScript
- Server
- PublicIP
- SourceCommit
- SourceBuild
- SourceDeploy
- SourcePipeline
아키텍처
선행 작업
해당 템플릿을 사용하기 위해서는 먼저 아래의 작업들을 수행해야 합니다.
- Cloudstudio Ncloud Credential 등록
- Ncloud 콘솔에서 Object Storage 생성 - 현재 (24.2) 기준으로 Terraform Ncloud Provider에서 ObjectStorage 리소스를 제공하지 않기 때문에 ObjectStorage 생성 작업은 콘솔에서 수행해야 합니다.
선행 작업을 모두 완료 했다면 파이프라인을 그려보도록 하겠습니다.
캔버스에 그리기
1. Base 배치
왼쪽 리소스 툴박스에서 Base 아이콘을 가져와 배치하고 등록한 Ncloud 크레덴셜을 선택합니다.
2. Region 배치
Region 아이콘을 가져와 Base 안에 배치합니다. 리소스를 생성할 리전을 선택합니다.
3. VPC 배치
VPC 아이콘을 가져와 Region 안에 배치합니다. VPC는 Ubuntu Server가 사용하는 가상 네트워크입니다.
4. Network ACL 배치
Network ACL 아이콘을 가져와 VPC 안에 배치합니다. Network ACL은 Subnet의 접근을 제어할 때 사용합니다
5. Subnet 배치
Subnet아이콘을 가져와 VPC 안에 배치합니다. VPC에 Ubuntu Server를 배포하기 위한 Public Subnet을 구성하고 앞에서 생성한 Network ACL과 선으로 연결합니다.
6. Access Control Group 배치
Access Control Group 아이콘을 가져와 VPC 안에 배치합니다. Access Control Group은 서버 간 네트워크 접근을 IP/Port 기반으로 필터링하는 방화벽 서비스입니다. Ubuntu Server로 ssh 접속과 Nginx를 통한 http 트래픽이 들어올 수 있도록 22번과 80 포트를 허용합니다.
7. Network Interface 배치
Network Interface 아이콘을 가져와 Subnet 안에 배치합니다. Network Interface는 Ubuntu Server에 할당할 수 있는 네트워크 인터페이스를 생성하는 서비스입니다. 앞서 생성한 Access Control Group과 선으로 연결하여 트래픽을 통제합니다.
8. InitScript 배치
InitScript 아이콘을 가져와 Region 안에 배치합니다. Init Script는 사용자가 미리 작성한 스크립트를 서버가 생성될 때 자동으로 실행해주는 서비스입니다. Source Deploy를 사용하려면 Ubuntu Server에 SourceDeploy용 agent가 설치 되고 실행 상태여야 합니다. InitScript를 통해 서버 생성과 동시에 Source Deploy용 Agent를 설치할 수 있도록 합니다. 또한 이번 시나리오에서는 Nginx를 통해 정적 웹페이지를 보여주므로 Nginx도 같이 설치합니다.
- Content
에이전트 설치 및 관리
Initscript의 Content 옵션에 아래 스크립트 내용을 설정합니다. 해당 스크립트에서 NCP_ACCESS_KEY와 NCP_SECRET_KEY를 실제 값으로 지정하여 설정합니다.
#!/bin/bash
echo $'NCP_ACCESS_KEY={NCP_ACCESS_KEY}\nNCP_SECRET_KEY={NCP_SECRET_KEY}' > /opt/NCP_AUTH_KEY
chmod 400 /opt/NCP_AUTH_KEY
wget https://sourcedeploy-agent.apigw.ntruss.com/agent/vpc/download/install
chmod 755 install
./install
rm -rf install
apt-get update
apt-get install nginx -y
9. LoginKey 배치
Login Key 아이콘을 가져와 Base 안에 배치합니다. Login Key는 서버 인스턴스 접속 및 암호화, 복호화에 필요한 리소스입니다.
10. Server 배치
Server 아이콘을 가져와 Subnet 안에 배치합니다. SourceDeploy의 대상이 되는 Ubuntu Server를 생성합니다. Network Interface와 선으로 연결하고, 각각 위에서 생성한 LoginKey와 InitScript를 옵션 값으로 설정합니다.
11. Public IP 배치
Public IP 아이콘을 가져와 Region 안에 배치합니다. Public IP는 서버를 서비스 목적으로 이용하거나 생성한 서버에 접속하는데 도와주는 서비스입니다. 앞서 생성한 Ubuntu Server와 선으로 연결해 줍니다.
지금까지 Ubuntu Server를 배포하기 위한 아키텍처를 보여드렸습니다. 이 다음부터는 Ncloud Developer Tool을 활용한 CICD 아키텍처를 구성하는 방법을 설명하겠습니다.
Ncloud CICD 아키텍처를 배포하기 위해서는 두 번으로 나누어 작업해야 합니다.
처음부터 SourceCommit, SourceBuild, SourceDeploy를 모두 사용하여 파이프라인 아키텍처를 모두 구성할 경우 SourceDeployStage를 배포할 때 테라폼 코드에서 아래와 같은 오류가 발생합니다.
SourceDeployStage 리소스를 배포할 때 Object Storage에서 빌드 결과물을 찾아오는 설정을 하게 되는데, 이때 빌드 결과물을 찾지 못하여 오류가 발생합니다. 클라우드스튜디오로 배포할 경우 인프라만 구성된 것일 뿐, 아직 빌드 작업을 수행하지 않았기 때문에 당연히 ObjectStorage에 빌드 결과물이 없습니다. 따라서 첫 번째 캔버스 구성에서는 SourceDeploy리소스를 포함하지 않습니다. 이후 빌드 결과물이 ObjectStorage에 저장되면 캔버스에서 SourcePipeline에 SourceDeploy 리소스를 배치하도록 하겠습니다.
12. Source Pipeline 배치
Source Pipeline 아이콘을 가져와 Region 안에 배치합니다. Source Pipeline은 SourceCommit, SourceBuild, SourceDeploy 서비스를 통합하여 빠르고 안정적인 소프트웨어 출시를 위한 프로세스 자동화 서비스입니다. 우선은 Source Pipeline 리소스를 Region 위에 올려만 놓고, 옵션 값 설정은 SourceCommit, SourceBuild의 옵션 설정이 끝난 후에 진행합니다.
13. Source Commit 배치
Source Commit 아이콘을 가져와 Source Pipeline 안에 배치합니다. Source Commit은 개발에 필요한 모든 형태의 파일을 안전하게 저장하고 관리할 수 있는 Private Git Repository 생성 서비스입니다.
14. Source Build 배치
Source build 아이콘을 가져와 Source Pipeline 안에 배치합니다. Source build는 다양한 언어로 개발된 소스 코드를 빌드하는 서비스입니다. 빌드 작업의 대상이 되는 SourceCommit과 선으로 연결합니다.
- Source Branch : 빌드할 Source Repository Branch를 설정합니다.
- Linked Repository Name : SourceCommit을 선으로 연결하면 자동 설정 됩니다.
- Env : 빌드환경을 설정하는 옵션입니다.
- Env Compute Spec : 빌드하려는 컴퓨팅 스펙
- Env Platform Type : PublicRegistry -빌드하려는 컴퓨팅 환경 이미지 종류를 선택합니다. 이번 시나리오에서는 Public Image Registry인 DockerHub의 node:18.13.0 이미지를 빌드 이미지로 사용하므로 Public Registry를 선택합니다.
- Target Container Image Name : node
- Target Container Image Tag : 18.13.0
다음은 빌드 관련 실행 명령어를 설정합니다. 실행 명령어는 사용하는 개발 언어에 따라 달라질 수 있습니다.
- Build Command : 빌드 관련 실행 명령어를 설정할 수 있습니다.
- Pre Build Command : 빌드 전에 사용할 명령어
- In Build Command : 빌드 중에 사용할 명령어
- npm install --frozen-lockfile
- npm run build
- Post Build Command : 빌드 후에 사용할 명령어
- ls -al
빌드작업이 끝난 결과물을 저장할 경로에 대해 설정합니다.
- Artifact : 빌드 결과물 저장 관련 설정
- Save Build Results : true - 빌드결과 저장 여부
- Path To Save Build Results : /out- 빌드 결과물을 저장할 위치 지정
- Object Storage Name To Save : cicd - 빌드 결과물을 저장할 ObjectStorage Bucket 이름
- Object Storage Path to Save : cicd - 빌드 결과물을 저장할 ObjectStorage Bucket 안에서의 폴더 경로
- File Name to Save : cicd.zip - 빌드 결과물을 저장할 파일 이름
15. Source Pipeline 옵션 설정
Default Task설정
- Name : Default Task 이름
- Type : sourceBuild - Default Task로 빌드작업을 설정하기 때문에 sourceBuild로 설정합니다.
- Target Source Build Project : cicdbuild - SourcePipeline 안에 구성된 SourceBuild 리소스를 선택합니다.
- Repository Branch : master - 빌드할 Repository Branch를 선택합니다.
Additional Task는 빌드 작업을 최초로 한번 실행하고 SourceDeploy 리소스를 구성한 후에 설정합니다.
- Trigger Push Repository : 파이프라인을 동작하게 하는 Trigger를 설정하는 옵션입니다.
- Type of Repository : sourcecommit
- Name of Repository : cicdcommit - SourcePipeline 안에 구성된 SourceCommit 리소스를 선택합니다.
- Branch of Repository : master - 트리거가 동작할 브랜치를 설정합니다.
16. 첫번째 배포 수행하기
여기까지 설정을 완료 했다면 첫 번째 배포를 수행합니다. 왼쪽 사이드 툴바에서 배포 하기를 클릭합니다.
등록한 Ncloud 크레덴셜을 설정하고, 첫 번째 작업의 태그메세지를 지정한 후 다음 버튼을 클릭합니다.
17. Build 작업 수행하기
첫 번째 아키텍처가 정상적으로 배포 되었다면 Ncloud 콘솔에서 빌드 작업을 수행하고, ObjectStorage에 빌드결과물이 저장된 것을
확인해야 합니다. 빌드 작업을 수행하려면 SourceCommit에 사용할 코드를 푸시합니다.
이후 SourceBuild에서 확인해보면, 클라우드스튜디오 캔버스에서 설정한 Trigger Push Repository 설정에 의해 빌드 작업이 자동으로 실행된 것을 볼 수 있습니다.
빌드 작업이 정상적으로 완료되면 Objectstorage에 저장된것을 확인할 수 있습니다. 아래의 빌드 작업 로그를 보면
bucket:cicd, path:cicd, file:cicd.zip에 저장되고, cicd.zip 파일안에 /out에 압축파일이 생성된 것을 확인할 수 있습니다.
18. Source Deploy 및 Source Deploy Stage 배치
Source Deploy 아이콘을 가져와 Source Pipeline 안에 배치하고 Source Deploy Stage 아이콘을 가져와 그 안에 배치합니다.
- Target Type : server - VM Server에 배포할 경우 타입을 Server로 설정합니다.
- Linked Server List : Source Deploy의 대상이 되는 서버를 선으로 연결하면 자동으로 설정됩니다.
- Target Server Id List : 만약 기존에 존재하던 서버와 SourceDeploy를 연결하고 싶다면 Ncloud 콘솔에서 ServerId를 확인하고 Target Server Id List에 입력하면 됩니다.
배포 시나리오 구성
SourceDeployStage에서 배포 시나리오를 구성합니다.
- Deploy Scenario Strategy : normal - normal, bluegreen, rolling, canary 중 선택합니다. 여기서는 가장 기본 전략인 normal을 선택하겠습니다.
- Deploy Scenario File Type : ObjectStorage - 배포할 시나리오 파일을 어디서 가져올 것인지 설정합니다. ObjectStorage Bucket에 있는 빌드 결과물을 가져올 것이므로 ObjectStorage를 선택합니다.
- Target Object Storage Bucket Name : cicd - 빌드 결과물이 저장된 Bucket 이름을 설정합니다.
- Object Storage Object Name : cicd/cicd.zip - 해당 Bucket 안에서 폴더 경로까지 포함하여 빌드 결과물의 경로를 설정합니다.
- Path.Source : /out - 빌드결과물(cicd.zip)안에서 배포에 사용할 Source파일을 선택합니다.
- Path.Deploy Path : /var/www - 타겟 서버 안에서 소스파일을 저장할 경로
- Post Deploy : 배포 후 실행할 명령어를 지정
- Name : root - 명령어를 실행할 Linux 사용자 설정
- Command : 실행할 명령어를 지정
- rm -rf /var/www/html
- mv /var/www/out /var/www/html
- systemctl restart nginx
19. Source Pipeline Additional Task 옵션 추가
SourceDeploy를 사용한 배포 작업을 Additional Task에 추가합니다.
- Additional Task
- Name : deploy - Additional Task 이름 지정
- Type : SourceDeploy - deploy 작업을 수행하므로 SourceDeploy를 선택합니다.
- Target Source Deploy Project : cicddeploy - 사용할 SourceDeploy Project를 선택합니다.
- Target Source Deploy Project Stage : cicdstage - 사용할 SourceDeploy Project Stage를 선택합니다.
- Target Source Deploy Project Scenario : default_scenario - 사용할 deploy scenario를 선택합니다.
- Pre Tasks : build - Additional Task 이전에 선행되어야 하는 작업을 설정할 수 있습니다. Default Task로 설정한 build 작업을 선행작업으로 설정합니다.
20. 두 번째 배포 수행하기
위와 같이 아키텍처를 모두 그렸다면 저장 후 왼쪽 사이드 바에서 배포하기를 클릭하여 두 번째 배포를 수행합니다.
이후 SourceCommit에 업데이트된 코드를 푸시하면 빌드부터 배포작업까지 자동으로 진행되는 것을 확인할 수 있습니다.
sourcedeploy에서 배포로그를 확인해보면 명령어가 정상적으로 작동한 것을 확인할 수 있습니다.
이후 브라우저 창에서 배포한 Target 서버의 Public IP를 입력하면 웹페이지가 정상적으로 실행된 것을 확인할 수 있습니다.
홈페이지가 업데이트될 때마다 Push 트리거 설정을 통해 빌드부터 배포작업까지 자동으로 수행합니다.
이상으로 클라우드스튜디오(CloudStudio)로 Ncloud Developer Tool을 활용한 파이프라인을 구축하고 CICD 작업을 수행하는 방법에 대해 보여드렸습니다.
감사합니다!
Cloudraw는 쉽게 클라우드 인프라를 그리고 사용할 수 있는 서비스를 제공하기 위해 노력하고 있습니다.
클라우드가 있는 곳 어디든 Cloudraw가 함께합니다.
📨 help@cloudraw.kr
'CloudStudio' 카테고리의 다른 글
[Ncloud] Server 생성하기 with CloudStudio (0) | 2024.03.20 |
---|---|
[AWS] EC2 생성하기 with CloudStudio (0) | 2024.03.20 |
[Ncloud] Ncloud Kubernetes Service(NKS) 생성 및 Nginx Pod 배포하기 with CloudStudio (0) | 2024.01.22 |
[Azure] Azure Virtual Machine 배포 with CloudStudio (0) | 2024.01.22 |
[CloudStudio] 클라우드 인프라 시각화 및 배포 관리 서비스 - Azure, AWS, Ncloud, Kubernetes 다이어그램 (0) | 2024.01.22 |