Github Actions를 이용해 람다 서비스 배포 자동화를 해보자
Github Actions 를 이용해 코로나 정보 문자 메시지 전송 서비스를 관리해보자
해당 게시글의 람다 서비스를 바탕으로 작성하였습니다.
읽지 않아도 현재 포스트의 실습은 가능합니다.
1편 - AWS Lambda로 만드는 초간단 코로나 정보 문자메시지 전송 서비스(1)
2편 - AWS Lambda로 만드는 초간단 코로나 정보 문자메시지 전송 서비스(2)
Github Actions 란?
- 깃허브에서 제공하는 CI/CD 툴이라고 합니다.
- 도커 강의를 들으면서 TravisCI , 스프링 공부를 하면서 Jenkins 등에 대해서 들어본 적이 있었는데
이런 서비스들의 기능을 깃허브에서도 관리할 수 있다는 그런 느낌 같습니다.
CI / CD 란?
CI(Continuous Integration)
- 애플리케이션에 대한 코드 변경이 빌드, 테스트 되어 저장소에 통합되는 것을 말합니다.
CD(Continuous Deployment or Delivery)
- 중단없는 배포 , 사용가능한 환경으로 중단없이 자동으로 릴리즈 되는 것을 말합니다.
그래서
- 깃허브 레포지토리에서 람다 함수 코드를 관리하고 actions 를 사용하면 내 로컬환경에서 코드를 수정하고 깃허브에 커밋,푸쉬하면
실제 내 클라우드에서의 람다함수 코드도 알아서 변경이 반영되고 중단 없이 서비스 된다라는 것입니다.
해봅시다
(0) 준비물 체크리스트!
- AWS 계정이 있는가?
- AWS 람다 함수를 생성 할 수 있는가?
- 깃허브 계정이 있는가?
- 내 로컬에 node.js 설치가 되어있는가?
배포 자동화 해야 할 람다 함수들입니다.
npm 버전
C:\>npm -v
6.14.11
Github Actions 는 브랜치 별로 Action 을 설정할 수 있습니다. 레포지토리에 다음과 같이 브랜치를 나누고 진행하였고
현재 글에서는 info 브랜치로 CoronaInfo를 배포 자동화 하는 것으로 진행하였습니다.
- CoronaSmsService - main : 해당 게시글 작성 이전에 완료하였습니다.
- CoronaInfo - info
- CoronaDynamo - dynamo
(1) 깃허브 레포지토리를 만들고 로컬에 클론한 뒤 info 브랜치를 생성해주고 해당 브랜치로 이동해줍니다
ehd03@DESKTOP-REGVU7O MINGW64 /c/cinfo
$ git clone https://github.com/pds0309/aws_lambda_simple_sms_service.git
...
...
ehd03@DESKTOP-REGVU7O MINGW64 /c/cinfo
$ cd aws_lambda_simple_sms_service/
ehd03@DESKTOP-REGVU7O MINGW64 /c/cinfo/aws_lambda_simple_sms_service (main)
$ git remote -v
origin https://github.com/pds0309/aws_lambda_simple_sms_service.git (fetch)
origin https://github.com/pds0309/aws_lambda_simple_sms_service.git (push)
ehd03@DESKTOP-REGVU7O MINGW64 /c/cinfo/aws_lambda_simple_sms_service (main)
$ git branch
* main
ehd03@DESKTOP-REGVU7O MINGW64 /c/cinfo/aws_lambda_simple_sms_service (main)
$ git branch info
ehd03@DESKTOP-REGVU7O MINGW64 /c/cinfo/aws_lambda_simple_sms_service (main)
$ git checkout info
Switched to branch 'info'
ehd03@DESKTOP-REGVU7O MINGW64 /c/cinfo/aws_lambda_simple_sms_service (info)
$
(2) package.json 생성 및 의존 패키지 설치
$ npm init -y
$ npm install moment
$ npm install xml-js
-
액션 워크플로우에서 npm ci 를 사용할 예정이기 때문에 package.json , package-lock.json 은 로컬에서 생성되어 있어야 합니다.
-
물론 워크플로우 파일 자체에서 npm init -y 나 패키지 의존성 설치를 할 수 있지만 코드 수정 배포 자동화를 할 때마다 설치하는 것은 비효율적이라고 생각합니다.
-
의존성 추가 및 제거가 필요하다면 로컬에서 해주고(즉 package.json, package-lock.json 또는 npm-shrinkwrap.json 는 로컬에서 생성한다!) npm ci로 검사하는게 올바른 방법이라 생각합니다.
(3) index.js 생성
- 테스트를 위해 일단 다른 코드를 넣어봅시다.
exports.handler = async (event) => {
const response = {
statusCode: 200,
body: JSON.stringify('hihihi'),
};
return response.body;
};
(4) 원격저장소에 푸쉬해줍니다.
오후 6:50 2021-07-27
$ git add .
$ git commit -m 'commit coronainfo'
$ git push origin info
(6) 깃허브 레포지토리의 Settings -> Secrets 에 AWSAccessKeyID 와 AWSSecretKey를 등록합니다.
-
이게 무슨 소리고! 하신다면 AWS IAM 콘솔로 이동 -> 내 액세스 키에서 새 액세스 키를 발급받아 사용하시면 됩니다.
-
비밀 키는 생성 시에만 확인 할 수 있기 때문에 발급 받고 다운로드 후 잘 보관해두시면 됩니다.
(7) 깃허브 레포지토리의 Actions 탭 클릭 후 Set up a workflow yourself 클릭
- 하단에 Node.js 앱 Azure 에 배포하기 , Amazon ECS 에 배포하기 등 다양한 예시가 있지만 직접 만들어 봅시다.
(8) yml 파일 작성 후 커밋해줍니다.
default 브랜치를 info 로 바꿔서 작성 후 커밋하던가 직접 해당 브랜치에 폴더와 파일을 추가해줘도 됩니다. 파일은 프로젝트 폴더의 최상위에 .github/workflow/*.yml 로 위치시키면 됩니다.
info.yml
name: lambda-CoronaInfo-CI
# info 브랜치에서 push가 된 경우 실행합니다.
on:
push:
branches:
- info
# 그룹의 역할입니다.
jobs:
deploy_source:
name: build and deploy lambda
strategy:
matrix:
node-version: [14]
runs-on: ubuntu-latest
# Job 안에서 순차적으로 실행되는 프로세스 단위입니다.
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies, Build application and Zip dist folder contents
run: |
npm ci
npm run build --if-present
env:
CI: true
- name: zip
uses: montudor/action-zip@v0.1.0
with:
args: zip -qq -r ./bundle.zip ./
- name: default deploy
uses: appleboy/lambda-action@master
with:
# aws 키와 비밀키 , 리전 , 함수 이름입니다.
aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws_region: ap-northeast-2
function_name: CoronaInfo
zip_file: bundle.zip
- 워크플로우가 실행중임을 확인 할 수 있습니다.
- 워크플로우의 상세한 과정을 확인할 수 있고 정상적으로 완료가 되었습니다. 이제 실제로 CoronaInfo 람다 함수도 변경되었는지 확인해볼까요
- 깃허브에 푸시했던 그대로 CoronaInfo 람다 함수가 변경되어있습니다.
- 정상적인 서비스를 위해 다시 원래 코드로 바꿔줍시다. 그냥 레포지토리 자체에서 수정하고 커밋했습니다.
- info 브랜치에서의 푸시를 감지하고 워크플로우가 실행이 됩니다. 문제 없이 완료된다면 수정한대로 다시 배포가 될 것입니다.
- 자동으로 배포가 완료되었습니다.
마치며
-
이전에 만들어 놓은 간단한 aws 서버리스 서비스를 배포 자동화 해보았습니다.
-
코드 변경이나 의존성 추가, 제거 등 작업을 aws 콘솔에서 직접 하다가 에러를 맞이하거나 코드를 날려먹을 일 없이 로컬에서 코드변경 , 의존성을 수정해주고 원격 저장소에 푸시만 해준다면
알아서 서비스 중단 없이 배포하고 워크플로우 파일에 추가한다면 원하는 테스트도 모두 수행할 수 있게 되었습니다. -
길고 부족한 글 읽어주셔서 감사합니다!
저장소
Reference
Github Actions를 이용해 CI/CD 파이프라인 구성하기