일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준 4949번
- HTTP
- 깃허브 로그인
- 스터디
- 문자열
- 깃 연동
- SQL
- 백준 4358번
- 깃 터미널 연동
- 모두를위한딥러닝
- 딥러닝
- 깃허브 토큰 인증
- 머신러닝
- 백준
- 모두를 위한 딥러닝
- 네트워크
- React Native
- 리액트 네이티브 시작하기
- 리액트 네이티브
- 리액트 네이티브 프로젝트 생성
- 백준 5525번
- 백준 4358 자바
- 모두의 네트워크
- 데베
- 자바
- 정리
- 지네릭스
- 데이터베이스
- 팀플회고
- 모두의네트워크
- Today
- Total
솜이의 데브로그
Github Action 이용해서 AWS Lambda에 도커 이미지 자동 배포하기 본문
AWS Lambda란?
Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다.
Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 코드 모니터링 및 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다. Lambda를 사용하면 거의 모든 유형의 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있습니다.
-> 즉, 서버리스하게 코드를 실행할 수 있도록 AWS에서 제공해주는 컴퓨팅 플랫폼이다. 서버의 존재에 대해서 신경 쓰지 않고 코드가 돌아가는지 여부만 신경쓰면 된다는 점이 굉장히 좋다.
현재 진행하고 있는 프로젝트에서 메인 서버와 분리하여 인공지능 및 STT 결과를 받을 서버를 구축하고자했는데, 이러한 과정에서 모듈 설치가 까다로워 다른 방법을 찾던 중 AWS Lambda를 사용하기로 결정했다.
이 외에도 Lambda를 사용할 경우의 이점은 다음과 같았다.
1. CICD를 따로 구축하지 않아도 된다. (이미 AWS 상에서 자동으로 해결해줌)
2. 같은 AWS 에 있기 때문에, S3 인증을 거칠 필요 없이 바로 사용 가능하다.
3. 또한 S3에 새로운 데이터가 들어왔을 때, 트리거를 사용하여 바로 람다 함수가 작동할 수록 간편하게 작성 가능하다.
4. 인공지능 결과를 빠르게 받아볼 수 있다.
5. 확장성이 좋다. ( 방대한 양의 데이터가 들어오거나 많은 사용자가 있어도 큰 문제 없이 해결 가능)
단점은 비용 뿐이었다.
일단은 프리티어를 사용해 할 수 있는 범위 내에서 해보고 아니면 비용을 지불하기로 결정했다.
Lambda 사용 사례
- 실시간 파일 처리
- Amazon S3를 사용하여 업로드하는 즉시 데이터를 처리하도록 AWS Lambda를 트리거할 수 있음. Lambda를 사용하여 실시간으로 이미지를 썸네일하고, 동영상을 트랜스코딩하고, 파일을 인덱싱하고, 로그를 처리하고, 콘텐츠를 검증하고, 데이터를 수집 및 필터링할 수 있음
- 실시간 스트림 처리
- AWS Lambda 및 Amazon Kinesis를 사용하여 애플리케이션 활동 추적, 트랜잭션 주문 처리, 클릭 스트림 분석, 데이터 정리, 지표 생성, 로그 필터링, 인덱싱, 소셜 미디어 분석, IoT 디바이스 데이터 텔레메트리 및 측정을 위한 실시간 스트리밍 데이터를 처리할 수 있음.
- 추출, 변환, 로드
- AWS Lambda를 사용하여 DynamoDB 테이블의 모든 데이터 변경에 대한 데이터 검증, 필터링, 정렬 또는 기타 변환 작업을 수행하고 변환된 데이터를 다른 데이터 스토어로 로드할 수 있음.
- IoT 백엔드
- AWS Lambda 및 Amazon Kinesis를 사용하여 사물 인터넷(IoT) 디바이스 데이터 텔레메트리 및 분석을 위한 백엔드를 구축할 수 있음.
- 모바일 백엔드
- AWS Lambda 및 Amazon API Gateway를 사용하여 API 요청을 인증 및 처리하도록 백엔드를 구축할 수 있음.
- 웹 애플리케이션
- AWS Lambda를 다른 AWS 서비스와 결합하면, 확장성, 백업 또는 여러 데이터 센터 중복에 필요한 별도의 관리 작업 없이 개발자가 자동으로 확장 및 축소되고 여러 데이터 센터에 걸쳐 가용성이 높은 구성에서 실행되는 강력한 웹 애플리케이션을 구축할 수 있음.
Lambda 사용법
AWS 내에서 원하는 기능을 수행할 lambda function을 생성한다.
S3에 데이터가 업로드 되는 경우 함수를 실행하고 싶다면 다음과 같이 트리거를 추가한다.
이외에도 본인이 작동할 함수에 맞는 트리거 또는 대상을 추가하여 연결한다.
이후 도커 이미지 배포를 통해 코드를 실행할 수 있도록 이미지를 배포한다. 새로운 이미지를 변경할 필요가 없는 경우, ECR에 도커 이미지를 푸시한 후, 해당 이미지를 배포하면 람다 함수를 실행 가능하다.
하지만 매번 코드가 바뀌는 경우라면, 코드 및 도커 이미지가 변경될 때마다 람다 함수에 바로 적용될 수 있도록 github action을 이용하여 자동 배포되도록 하면 편하다!
github action을 이용하여 ECR 및 Lambda 함수에 도커 이미지 배포하기
1. 자신의 코드가 있는 git 레포지토리에
.github/workflows 파일 작성
파일을 직접 디렉토리 생성 후 작성해도 되고, 레포지토리에 action 에 가서 자동으로 작성해주는 곳에 작성해도 된다.
작성되어있는 파일을 이용하면 편하기 때문에 이 방법으로 수행해보겠다.
위의 Action에 들어와서, Deploy to Amazon ECS 를 클릭한다. (Configure 버튼 클릭)
그러면 이렇게 쭉 코드가 나와서 필요한 부분만 수정하면 된다.
기본적으로 github action을 통한 cicd 배포와 같은 방식으로 ECR에 도커 이미지를 빌드하여 푸쉬한다.
그 후 latest 태그를 달아 푸쉬된 이미지를 lambda 함수에 반영하도록 추가 코드를 작성해준다.
우리 팀은, main 브랜치에 푸시할 때 마다 도커 이미지를 빌드 후 ECR에 푸시, 그리고 lambda에 배포되도록 할것이기 때문에 branches
에 main을 입력해주었다.
secrets.AWS_ACCESS_KEY_ID 와 secrets.AWS_SECRET_ACCESS_KEY 는 해당 레포지토리의 설정에서 지정해주어야한다.
이 외에도 코드에 노출하면 안되는 key는 모두 여기서 관리한다.
기본적으로 작성되어있는 코드는 ECR에 배포하는 것 까지만 되어있어서, 자신의 레포지토리에 맞는대로 이름 및 지역만 잘 입력해주면 큰 문제 없이 ECR에 배포된다.
그러면 이제 여기서 lambda에 이미지가 배포되도록 하는 코드를 추가해야하는데, 이는 밑에 새로운 job을 하나만 더 추가해주면 된다.
- name: Update aws lamba function code
id: update-function-code
env:
IMAGE_URI: ${{ steps.build-image.outputs.image }}
run: |
aws lambda update-function-code --function-name {FUNCTION_ARN} --image-uri $IMAGE_URI
위와 같은 부분을 ECR에 배포하는 job 아래에 추가한다.
id는 본인이 원하는 대로 작성하면 되고, run 부분만 잘 작성해주면 되는데
{FUNCTION_ARN} 부분에는 lambda 함수 ARN에서 확인할 수 있는 값을 복사해서 붙여넣어주면 된다. (ECR에 기존에 임의로 푸시한 이미지를 배포한 후 그 링크 이용)
그 후 이제 해당 action을 취하면 작동하는지 가능하다!
.github/workflows 내에 .yml 파일 생성한 후 action 취하면 action 디렉토리에서 다음과 같이 성공 여부를 확인 가능하다!
함수가 작동한 로그는 AWS의 CloudWatch에서 확인 가능하다.
최종 코드
aws.yml
name: Deploy to Amazon ECS
on:
push:
branches:
- main
env:
AWS_REGION: MY_AWS_REGION # set this to your preferred AWS region, e.g. us-west-1
ECR_REPOSITORY: MY_ECR_REPOSITORY # set this to your Amazon ECR repository name
ECS_SERVICE: MY_ECS_SERVICE # set this to your Amazon ECS service name
ECS_CLUSTER: MY_ECS_CLUSTER # set this to your Amazon ECS cluster name
ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
# file, e.g. .aws/task-definition.json
CONTAINER_NAME: MY_CONTAINER_NAME # set this to the name of the container in the
# containerDefinitions section of your task definition
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: {REPOSITORY_NAME}
IMAGE_TAG: latest
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
- name: Update aws lamba function code
id: update-function-code
env:
IMAGE_URI: ${{ steps.build-image.outputs.image }}
run: |
aws lambda update-function-code --function-name {FUNCTION_ARN} --image-uri $IMAGE_URI
'dev > 졸업프로젝트_눈소리' 카테고리의 다른 글
webVTT 를 이용한 vtt 자막 생성 (TXT to VTT) (0) | 2022.05.04 |
---|