본문 바로가기

개발

ECR + Lambda + GitLab CI를 활용한 서버리스 함수 배포 자동화 가이드 🚀

반응형

서버리스(Serverless) 아키텍처는 개발자가 인프라 관리에 신경 쓰지 않고 비즈니스 로직에만 집중할 수 있게 해줍니다. 하지만 아무리 서버리스라도, 코드 업데이트 및 배포 과정이 수동으로 이루어진다면 DevOps의 핵심 가치를 온전히 실현하기 어렵습니다.

GitLab CI/CD를 활용하여 AWS ECR(Elastic Container Registry)에 컨테이너화된 람다(Lambda) 함수를 배포하는 자동화 파이프라인을 구축하면, 코드 푸시(Push) 한 번으로 배포부터 운영까지의 전 과정을 효율적으로 관리할 수 있습니다. 이 가이드는 GitLab CI/CD, Docker, ECR, Lambda를 연동하여 서버리스 함수 배포를 자동화하는 방법을 단계별로 설명합니다.


1. 핵심 도구 이해: 컨테이너 기반 람다 배포 워크플로우

GitLab CI/CD 파이프라인은 코드가 변경될 때마다 정해진 작업을 자동으로 실행하는 역할을 합니다. 이 워크플로우의 핵심은 컨테이너 이미지입니다.

  1. GitLab CI/CD: 코드 저장소에 푸시(Push)가 발생하면, .gitlab-ci.yml 파일에 정의된 스크립트가 자동으로 실행됩니다. 이 스크립트가 Docker 이미지를 빌드하고 AWS로 배포합니다.
  2. Docker: 람다 함수와 모든 의존성을 하나의 경량화된 컨테이너 이미지로 패키징합니다. "내 컴퓨터에서는 잘 되는데..."와 같은 환경 의존성 문제를 해결합니다.
  3. ECR: AWS의 프라이빗 컨테이너 이미지 저장소입니다. GitLab CI/CD가 빌드한 이미지를 이곳에 저장하고, 람다가 이 이미지를 가져와 실행합니다.
  4. AWS Lambda: ECR에 저장된 컨테이너 이미지를 기반으로 함수를 실행하는 AWS의 서버리스 컴퓨팅 서비스입니다.

이 워크플로우는 코드를 업데이트하고 git push만 하면, 빌드-푸시-배포의 전 과정이 자동으로 처리되는 강력한 자동화 환경을 구축합니다.


2. 단계별 설정 가이드: 파이프라인 구축

1단계: AWS 설정

가장 먼저 ECR에 컨테이너 이미지를 저장하고, 람다 함수가 이 이미지를 가져올 수 있도록 AWS 환경을 설정해야 합니다.

  1. ECR 리포지토리 생성: AWS Management Console에서 ECR 서비스로 이동하여 새로운 리포지토리를 생성합니다. 리포지토리 이름은 프로젝트명과 일치시키는 것이 좋습니다.
  2. IAM 역할 및 정책 설정:
    • Lambda 실행 역할: 람다 함수가 ECR에서 이미지를 가져올 수 있도록 AWSLambdaBasicExecutionRole 정책 외에 AWSCodeArtifactReadOnlyAccess와 AmazonEC2ContainerRegistryReadOnly 정책을 추가로 연결합니다.
    • GitLab CI 사용자: GitLab CI가 AWS에 접근하여 ECR에 이미지를 푸시하고, 람다 함수를 업데이트할 수 있는 IAM 사용자를 생성합니다. 이 사용자에게는 최소한 AmazonEC2ContainerRegistryFullAccess와 AWSLambda_FullAccess 정책을 부여합니다.
    • 생성한 IAM 사용자의 접근 키 ID비밀 접근 키를 GitLab 프로젝트의 CI/CD 변수(Settings > CI/CD > Variables)에 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY로 등록합니다.
  3. 람다 함수 생성:
    • Lambda 서비스로 이동하여 새 함수를 생성합니다.
    • 런타임으로 "컨테이너 이미지"를 선택하고, ECR에서 미리 생성한 리포지토리의 이미지 URI를 지정합니다.
    • 위에서 생성한 IAM 실행 역할을 연결하여 함수를 생성합니다.


2단계: GitLab CI/CD 설정

GitLab 프로젝트의 루트 디렉터리에 .gitlab-ci.yml 파일을 생성하고, 아래와 같이 파이프라인을 정의합니다. 이 YAML 파일은 세 가지 주요 스테이지(build, push, deploy)로 구성됩니다.

 
stages:
  - build
  - push
  - deploy

variables:
  ECR_REPO_NAME: "your-lambda-repo"
  AWS_REGION: "ap-northeast-2"
  LAMBDA_FUNCTION_NAME: "your-lambda-function-name"
  LAMBDA_IMAGE_URI: "$ECR_REPO_NAME:latest"

# Docker 이미지 빌드 스테이지
build_image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $LAMBDA_IMAGE_URI . # 현재 디렉터리의 Dockerfile로 이미지 빌드

# ECR에 이미지 푸시 스테이지
push_image:
  stage: push
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $AWS_ACCESS_KEY_ID -p $AWS_SECRET_ACCESS_KEY https://$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com # AWS ECR 로그인
    - docker tag $LAMBDA_IMAGE_URI $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPO_NAME:latest # ECR 태그 지정
    - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPO_NAME:latest # ECR에 이미지 푸시
  only:
    - main # main 브랜치에만 실행

# AWS Lambda 함수 업데이트 스테이지
deploy_lambda:
  stage: deploy
  image:
    name: amazon/aws-cli
    entrypoint: [""]
  script:
    - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
    - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
    - aws configure set region $AWS_REGION
    - aws lambda update-function-code --function-name $LAMBDA_FUNCTION_NAME --image-uri $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPO_NAME:latest # ECR 이미지로 람다 함수 코드 업데이트
  only:
    - main

YAML 파일 해설:

  • build: docker build 명령어를 사용하여 Dockerfile을 기반으로 Docker 이미지를 생성합니다.
  • push: AWS ECR에 로그인한 후, 빌드된 이미지를 ECR 리포지토리에 푸시합니다.
  • deploy: AWS CLI를 사용하여 람다 함수 코드를 ECR에 푸시된 최신 이미지로 업데이트합니다.

이 파이프라인은 코드가 main 브랜치에 병합될 때마다 자동으로 실행되어, 최종적으로 람다 함수가 업데이트됩니다.


3. 결론

GitLab CI/CD, Docker, ECR, Lambda를 연동한 배포 자동화는 서버리스 개발의 생산성을 극대화합니다. 이 파이프라인을 구축하면 다음과 같은 이점을 얻을 수 있습니다.

  • 배포 속도 향상: 수동 배포 작업이 사라져, 코드 푸시만으로 즉시 배포가 가능합니다.
  • 일관성 있는 환경: 컨테이너 이미지를 사용해 개발, 테스트, 운영 환경의 불일치 문제를 근본적으로 해결합니다.
  • 안정성 및 신뢰성: 모든 배포 과정이 스크립트로 자동화되므로, 수동 작업으로 인한 실수를 방지할 수 있습니다.

이 가이드를 통해 여러분의 서버리스 개발 워크플로우를 한 단계 더 발전시키고, 진정한 의미의 DevOps를 경험해 보시기 바랍니다.

반응형