AWS Cloud School 13기 59일차

Forever 김·2026년 3월 26일

AWS Cloud School

목록 보기
56/97

TIL

배운 내용

AWS lambda

  • 서버리스(인프라 프로비저닝이 필요 X) 코드 실행
  • 서버리스라고 해서 서버가 없는건 아님.

호출 방식 - 동기(Synchronous) 호출. 즉, 작업 호출 이후 결과값이 반환될때까지 기다림.

API GW, 함수 URL(간단하게 그 함수만 쓸때), 셀프테스트(테스트 함수)

lambda life cycle

  1. init
  • 실행환경 구성
  • 코드 다운로드
  • Extenstion (커스텀 모니터링,보안)
  • Runtime Bootstrap(자바,파이썬...)
  • Function Static Code 실행
  • 10초 제한
  • 10초 이후에는 invoke 단게에서 함수 실행 시간동안 init 수행.
  1. invoke(호출)
  • 실제 lambda 함수 실행(handler)
  1. shutdown
  • 환경정리
  • 5분 정도 실행환경 유지(캐싱)

Coldstart(요청후에 코드가 실제로 실행되기 까지 걸리는 시간)를 줄이는 것도 신경써야한다.

  • 코드 사이즈 줄이기
  • 추가 라이브러리(dependency) 최적화

CLI에서 Lambda 함수 구성

우분투 환경으로 VM에서 진행하였다.
먼저 우분투 환경에 python3.12설치

apt update && apt upgrade -y
apt install software-properties-common -y add-apt-repository ppa:deadsnakes/ppa

apt update -y

apt install python3.12 -y

이제 python에 가상환경을 구성

root@lambda:~# apt install -y python3.12-venv
# 가상환경 설치.

root@lambda:~# python3 -m venv venv
# venv 디렉토리에 가상환경 구성

root@lambda:~# source ./venv/bin/activate
# 가상환경 실행

(venv) root@lambda:~# pip install fastapi uvicorn
# 라이브러리 설치.

(venv) root@lambda:~# vi main.py

간단하게 main.py에 내용을 작성

from fastapi import FastAPI
from mangum import Mangum # lambda 실행에 필요한 handler

app = FastAPI()

@app.get("/")
def hello():
    return {"Hello": "World from Lambda"}

handler = Mangum(app)

requirement 작성을 통해 필요한 라이브러리를 작성

(venv) root@lambda:~# vi requirements.txt

mangum
fastapi
(venv) root@lambda:~# mkdir arc
# 람다함수에 포함시킬 패키지목록 및 소스코드를 둘 경로를 생성.

(venv) root@lambda:~# cp -r ./* arc
# 현재디렉토리의 모든 파일 및 폴더(하위디렉토리 포함, -r) arc에 복사

(venv) root@lambda:~# cd arc

(venv) root@lambda:~/arc# rm -rf __pycache__/
(venv) root@lambda:~/arc# rm -rf arc
(venv) root@lambda:~/arc# rm -rf venv
# 제외시킬 파일 삭제

(venv) root@lambda:~/arc# pip install -r requirements.txt -t ./
# -r : 의존성패키지파일 목록지정. -t : 타겟디렉토리.

모듈파일(main.py) 과 requirements 파일을 압축한다.

(venv) root@lambda:~/arc# apt install -y zip
# 압축 명령 설치

(venv) root@lambda:~/arc# zip lambda.zip -r ./*
# 현재디렉토리의 모든 파일(./*) 및 하위디렉토리 포함하여 lamdba.zip 파일로 압축.

lambda 정책 파일 생성

cat > trust-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

위의 정책을 토대로 IAM Role을 생성해주는데 AWS CLI를 다운로드를 먼저 하고 한다,
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

(venv) root@lambda:~/arc# unzip awscliv2.zip

(venv) root@lambda:~/arc# ./aws/install

(venv) root@lambda:~/arc# aws ec2 describe-vpcs --region ap-northeast-2


명령이 잘 되었는지 확인이 필요

aws iam create-role --role-name lambda-fastapi-execution-role --assume-role-policy-document file://trust-policy.json
# lambda-fastapi-execution-role 이라는 이름의 역할을 생성.

이후 AWS Console에서 lamdba-fastapi-execution-role이 잘 생성됬는지 확인

lambda 함수 생성

(venv) root@lambda:~/arc# aws iam attach-role-policy --role-name lambda-fastapi-execution-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
# 정책 추가(로그 기록 볼 수 있는 권한)

ROLE_ARN=$(aws iam get-role --role-name lambda-fastapi-execution-role --query 'Role.Arn' --output text)
# 위에서 만든 Role의 arn을 ROLE_ARN 이라는 환경변수로 선언.
# 람다함수 만들때 역할을 지정해야하기 때문.

aws lambda create-function \
    --function-name zip-lam \
    --runtime python3.12 \
    --role $ROLE_ARN \
    --handler main.handler \
    --timeout 30 \
    --memory-size 512 \
    --zip-file fileb://lambda.zip \
    --region ap-northeast-2

# zip-lam 라는 이름의 람다함수 생성.

컨테이너 가상화

하이퍼바이저 가상화와 컨테이너 가상화 비교

하이퍼바이저 가상화컨테이너 가상화
격리 수준하드웨어 수준프로세스 수준
자원 오버헤드높음낮음
보안상대적으로 안전상대적으로 취약
프로비저닝 속도상대적으로 느림 guest VM 부터 구성상대적으로 빠름. 호스트 H/W와 커널까지 공휴하기 때문. 따로 guset VM 및 커널을 구성할 필요가 없다.
호환성원하는 OS(커널)까지 설치 가능원하는 커널을 선택 불가능. 호스트 커널에 호환되는 환경만 구성 가능 . 리눅스 기반 컨테이너만 가능.

컨테이너 가상화에 필요한 리눅스 커널의 기능 세가지(기반기술)

  • chroot : change root = 최상위 디렉토리를 변경
  • Cgroup : Control Group = 자원을 컨트롤, 컨테이너에 호스트의 자원을 '제한'한다.
  • namespace : PID, 네트워크, 파일을 격리, ex) 컨테이너 1에도 PID가 1인 프로세스가 존재할 수 있고, 컨테이너2에도 pid가 1인 프로세스가 존재할 수 있다.

컨테이너 가상화 종류

  • Docker
  • Containerd
  • CRIO
  • LXC(Linux Container)

원래 어제 배웠던 내용들이지만 어제 과제 AWS로 3Tier Architecture 구성후 Cloudfront로 배포하는 과제로 인해 시간이 없어서 작성하지 못해 오늘 작성했다.

profile
나를 한줄로

0개의 댓글