[AWS] aws 강의 섹션 21-2 (람다함수, X-Ray, TMP, ECR, LIMIT)
람다 함수 - 로깅, 모니터링
- 람다는 클라우드 워치 로그와 연결되어 있으므로, 람다의 모든 실행 로그는 자동으로 CloudWatch Logs에 저장된다.
- 단, 람다 함수가 클라우드 워치 로그에 접근할 수 있도록 알맞은 IAM역할이 있어야 한다.
- 람다의 지표는 클라우드 워치 지표에 표시된다.
- 호출, 기간, 동시 실행, 오류 수, 성공률, 병목 현상, 비동기 전송 실패, 반복자 기간 (스트림에서 데이터를 읽어오는 경우)
람다 함수 - X-Ray
- 람다 함수에서 Active Tracing만 활성화 해주면 x-ray에서 람다를 추적할 수 있다.
- 활성화 하면 x-ray데모이 실행된다.
- 그 후, 코드에 x-ray SDK만 적어주면 된다.
- 람다 함수에 x-ray를 사용할 수 있는 권한이 있는지 확인해야 한다.
- x-ray와 소통할 수 있는 환경 변수는 위와 같다.
- 가장 중요한 건 마지막 변순데, demon이 실행되는 ip주소와 port번호를 알려준다.
Customization At The Edge
- 함수와 애플리케이션을 특정한 리전에 배포한다고 배웠는데,
클라우드 프론트 등을 사용할 때는 엣지 위치에 콘텐츠를 배포하는 경우도 있다. - 현대에, 애플리케이션에 도착하기 전에 엣지에서 먼저 로직을 실행해야 하는 경우가 있다.
- 이를 엣지 함수라고 부른다.
- 엣지 함수는 클라우드 프론트 배포시 탑재한다.
- 지연 시간을 최소화하려는 경우에 사용자와 가까운 곳에서 함수를 실행하는 것이다.
- 클라우드 프론트는 두 가지 함수 유형을 제공한다.
- 클라우드 프론트 함수와 Labda@Edge이다.
- 엣지 함수를 사용하면 서버를 관리하지 않아도 되고 글로벌하게 배포된다는 이점이 있다.
- 사용 사례로는, CDN 컨텐츠를 커스터마이즈 하는 경우가 있다.
- 사용량에 따라서만 비용을 지불한다.
Use Case
- 웹 사이트 보안과 개인정보 보호
- 엣지에서의 동적 웹 애플리케이션
- 검색 엔진 최적화
- 오리진과 데이터센터 간 지능형 라우팅
- 엣지에서의 Bot(사이버 공격) 완화
- 엣지에서 실시간 이미지 변환
- A/B 테스트
- 사용자 인증과 권한 부여
- 사용자 우선순위 지정
- 사용자 추적 및 분석
CloudFromt Functions
- 클라우드 프론트 함수는 다음과 같이 구성된다.
- 자바 스크립트로 작성한 가벼운 함수이며, 뷰어 요청과 응답을 수정한다.
- 대기 시간이 중요한 큰 규모의 CDN 커스터마이징에 사용된다.
- 시작 시간이 밀리초 미만이고, 초당 수백만 개의 요청을 수행할 수 있다.
- 뷰어 요청 및 응답을 바꾸는 데만 사용된다.
- 클라우드 프론트의 네이티브 기능이며, 모든 코드가 클라우드 프론트에서 관리된다.
Lambda@Edge
- 람다 엣지는 Node.js나 파이썬으로 작성되는 함수이고, 요청 수는 초당 수천 회다.
- 클라우드 프론트 함수보다 더 자세하고 세밀한 제어를 하는 대신 속도가 느리다고 생각하면 된다.
- 클라우드 프론트의 요청과 응답을 변경하는데 쓰인다.
- 뷰어 요청, 응답
- 오리진 요청, 응답
- 모든 것을 수정할 수 있다.
- 클라우드 프론트를 관리하는 리전에 함수를 작성하면, 클라우드 프론트에서 이 함수를 모든 위치에 복제한다.
사용 예시
- 클라우드 함수
- 캐시 키 정규화
- 속성을 변경해서 캐시 키 생성에 최적화된 형태로 만든다.
- 헤더 조작
- 헤더의 내용을 삽입, 수정 삭제할 수 있다.
- URL을 재작성 하거나 리디렉션 할 수 있다.
- 인증이나 인가를 허용 거부 할 수 있다.
- 이 모든 것을 1ms 미만으로 수행한다.
- 캐시 키 정규화
- 람다 엣지
- 최대 10초까지, 수행 시간이 좀 길다.
- cpu와 메모리를 조정할 수 있어 라이브러리를 많이 가져오고
- 코드에 타사 라이브러리를 이용할 수 있다.
- 파일 시스템에 접근해 처리할 수도 있고
- http 요청의 바디도 수정할 수 있다.
Lambda by default
- 기본적으로 람다함수는 VPC 외부에서 실행된다.
- 우리가 속한 VPC 말고 AWS 소유의 다른 VPC에서 실행됨
- 따라서 우리의 VPC에 있는 리소스에는 액세스가 불가능하다.
- 기본적으로 AWS 클라우드가 있으면 람다 함수는 외부 엔드 포인트와 클라우드 내부 다른 서비스에 접근 가능하다.
- 하지만 다른 VPC나 프라이빗 서브넷 내부의 서비스에는 접근이 불가능하다.
- 이 문제는 어떻게 해결할까
람다 in VPC
- ENI를 만들면 된다.
- 이를 위해선, VPC ID와 서브넷을 정의하고, 보안 그룹을 람다함수에 배정해야 한다.
- 그 동안, 람다 함수는 ENI를 생성하는데 엘라스틱 네트워크 인터페이스는 우리가 선택한 서브넷에 생성된다.
- ENI를 생성하기 위해 AWSLambdaVPCAccessExecutionRole을 필요로 한다.
- 이 그림을 예시로 보자
- 람다 함수가 사설 서브넷의 RDS에 접근하기 위해선 ENI가 필요하다
- 사설 서브넷에 대한 보안그룹 설정이 잘 돼 있으면 내부에 ENI를 만들 수 있다.
- 이후 RDS가 람다 함수의 접근을 허용하는 보안 그룹 설정이 돼 있다면 람다 함수는 접근을 할 수 있다.
VPC 내부의 람다 함수 - 인터넷 액세스
- 일반적으로 VPC 내부의 람다 함수는 인터넷 액세스 권한이 없다.
- 람다 함수를 공용 서브넷에 배포한다고 해도, 인터넷 액세스와 공용 ip접근 권한은 없다.
- 인터넷 액세스 권한을 얻기 위해선,
- NAT Gateway, NAT Instance를 사용해야 한다.
- 다음과 같이 외부 api는 NAT를 거치고 인터넷 게이트웨이를 통해 외부 인터넷과 연결된다.
- 클라우드 워치 로그는 예외인데, 람다 함수를 사설 서브넷에 배포해도, 클라우드 워치로 로그를 보내는 데는 아무 문제가 없다.
람다 함수 - Configuration
- RAM
- 128MB ~ 10GB를 1MB 단위로 조정해서 사용할 수 있다
- 더 많은 RAM을 추가하면 더 많은 CPU를 얻게 된다.
- vCPU의 개수를 직접적으로 설정할 순 없고, 램을 늘려서 cpu를 얻어야 한다.
- 램이 1729MB에 도달하게 되면, 얻을 수 있는 최대의 vCPU를 갖게 된다.
- cpu가 1개라도 생긴다면, 멀티 스레딩을 통해 이점을 극대화 할 수 있다.
- 다시 말해, 애플리케이션이 cpu를 많이 사용하는 무거운 앱이라면, RAM을 증가시켜라
- TIMEOUT
- 람다함수는 기본값으로 타임아웃이 3초로 설정돼있다. 최대는 900초다.
- 람다함수가 실행된지 3초가 넘으면, 함수는 종료되고 오류를 낸다는 것이다.
- 15분을 넘게 실행되는 애플리케이션이라면, 람다함수를 사용할 게 아니라
컴퓨팅 리소스를 사용해라
- 람다함수는 기본값으로 타임아웃이 3초로 설정돼있다. 최대는 900초다.
- Execution context
- 런타임 환경에서 람다 코드의 외부적 의존성을 의미한다.
- 이 컨텍스트를 사용해서, 데이터베이스에 접속하고 http 클라이언트나 sdk 클라이언트를 만들 수 있다.
- 람다 함수의 호출이 여러 번 예상될 때, 잠시 동안 그 컨텍스트가 유지되어
기존의 모든 데이터베이스 접속이나, http 클라이언트 등등을 계속 재사용할 수 있다.- 컨텍스트에는 /tmp 라는 디렉토리가 있는데
- 파일을 작성할 수 있는 공간으로, 실행 중 계속 사용 가능하다.
- 이 컨텍스트 사용 예시를 봐보자
- 왼쪽은 함수 내부에 데이터베이스 연결 코드를 작성하여, 함수 호출 마다 새로운 데이터베이스 연결이 생성된다.
- 굉장히 비효율적이다.
- 오른쪽은 함수 외부에 데이터베이스 연결 코드를 작성하여, 실행 간에 재사용하는 모범 사례로 볼 수 있다.
람다 함수 - tmp 스페이스
- 사용자 코드를 작성하고 그걸 재사용하려면 tmp 파일을 이용하면 된다.
- 실행을 위해 매우 큰 파일을 다운로드 해야한다거나
- 작업을 수행하기 위해 디스크 공간이 필요한 경우에는 그 파일들을 모두 tmp에 저장한다.
- 10GB까지 저장할 수 있다.
- 이 파일은 람다 함수가 실행되는 동안에 유지된다.
- 람다 함수가 중지되고 다시 호출되어도, tmp에서 똑같은 파일을 다시 불러오면 되니 시간을 절약할 수 있다.
- 임시 유지 파일이 아닌 영구적으로 유지돼야하는 파일이라면, tmp를 사용하지말고 s3를 사용해라
- 암호화를 원한다면 람다에서는 암호화 방법이 없고
- kms 피쳐에서 데이터 키를 생성한 후, kms data 키를 이용해 암호화할 수 있다.
VPC Lambda
vpc 외부에 만들어진 람다함수는 기본적으로 외부 인터넷과 소통이 가능하다.
그러나 vpc 내부에 만들어진 람다함수는 외부와 소통이 아예 불가능하다.
퍼블릭 서브넷 프라이빗 서브넷 상관없이 ip 할당이 되지 않아 불가능이다.
해결책은 NAT Gateway, ENI를 사용해야한다.
Lambda 레이어
여러 종속성 파일들을 보관하는 장소다.
여러 람다함수에서 동시에 사용하는 의존성 파일들이 존재하는 경우, 해당 파일들을
모든 람다 함수에 적으면 비효율적이다.
한 곳에서 보관하고 각각의 함수에 마운트하면 더 효율적일 것이다.
이 때 사용하는 것이 람다 레이어다. 람다 레이어를 만들면 모든 람다함수가 해당 레이어를 참조하여 파일을 받을 수 있다.
다만 적절한 IAM 권한이 필요하다.
람다 파일 시스템 마운트
EFS, S3 등이 가능하다.
람다 동시성
람다는 기본적으로 동시에 1000개의 함수가 실행 가능하다.
주의할 점은 한 개의 함수에서 1000개가 실행된다면, 나머지 람다함수는 실행이 전혀 될 수 없다는 것이다.
따라서 예약된 동시성을 사용해서 한 함수에서 최대로 실행할 수 있는 개수를 제한해 두어야 한다.
해당 개수를 넘길 경우 동기식 호출의 경우는 뜨로틀링 에러를 반환하고
비동기식 호출의 경우는 이벤트 큐로 넘겨 재시도를 할 수 있다.
프로비저닝 동시성이란 것도 있다. 이것은 콜드 스타트 문제를 해결해주는 기능인데
이 기능을 사용하면 미리 필요한 파일들을 다운 받아놓은 람다 함수가 대기된다.
이를 통해 맨 처음 람다함수를 호출했을 때 필요한 파일을 다운받기 위해 걸리는 시간을 최소화 시킬 수 있다.
람다 함수와 클라우드 포메이션
클라우드 포메이션에서 람다 함수를 정의할 수 있다.
- 이렇게 클라우드 포메이션 템플릿에 람다함수를 정의하는 것이다.
- 아주 간단하게 작성 가능하고 Code, ZipFile 내부에 코드를 작성하면 된다.
- 다만 함수 종속성을 포함할 수 없다는 단점이 존재한다.
- 따라서 종속성이 없는 람다 함수 코드를 사용하는 경우에만 클라우드 포메이션 템플릿을 사용할 수 있다.
람다 함수와 클라우드 포메이션 - S3를 이용하는 방법
- 람다함수 zip 파일을 S3에 미리 저장하고, 클라우드 포메이션에서 코드의 위치를 참조하도록 하는 방법이다.
- S3 버킷 네임, Key 값, 버전 등등을 사용해서 참조한다.
- 만약 함수를 업데이트 했다면 당연히 Key값 등을 변경해야 할 것이다.
여러 지역에서 S3 코드 참조 방법
- 다른 지역의 클라우드 포메이션에서 s3에 담긴 리소스를 참조하기 위해선 두 가지가 필요하다.
- 첫 번째는 S3에서 버킷 정책을 통해 다른 리전에서 접근이 가능하도록 하는 것이다.
- 두 번째는 클라우드 포메이션 익스큐션 롤에서 S3의 get 권한을 허용해주는 것이다.
- 이렇게 두 가지가 되면, 다른 지역의 S3 버킷에서 코드를 가져올 수 있다.
람다 컨테이너 이미지
- 람다에서 컨테이너 실행이 가능하다.
- ECR에서 최대 10GB의 이미지를 가져와 컨테이너를 실행한다.
- 이미지는 다음과 같이 구성해야한다.
- 코드 부분
- 코드 실행에 필요한 의존성과 데이터셋
- 그리고 도커 컨테이너를 실행할 기본 이미지
- 여기서 기본 이미지는 무조건 람다 런타임 API를 구현해야한다.
- 이러한 베이스 이미지의 언어는 여러가지다.
- 자바, 파이썬, node.js, Go, Ruby 등등
- 람다 런타임 인터페이스 애뮬레이터를 사용하면 컨테이너를 로컬에서 테스트할 수도 있다.
- 람다 함수를 컨테이너로 사용한다면, 앱을 개시할 때 작업량을 줄일 수 있다.
람다 컨테이너 이미지
베이스 이미지를 기반으로 컨테이너를 구축하는 예시
- 먼저 람다 런타임 API를 구현하는 베이스 이미지를 선택한다.
- 그 다음 애플리케이션 코드를 복사하기 위해 app.js package*.json 파일과 데이터를 COPY한다.
- 컨테이너에 필요한 종속성을 설치한다.
- 이후 함수를 실행하는 명령어를 적으면 된다.
람다 버전 관리
- 변경이 가능한 가장 최근의 람다 함수가 있고
- 그 밑에는 publish한 버전이 달린 람다함수가 있다.
- publish한 람다함수는 변경이 불가능하고, 한 번 게시할 때마다 버전이 올라간다.
- 각각의 버전에 따로 따로 접근이 가능한데, 안정적으로 각각의 함수에 접근이 가능한 방법은 바로
별칭을 사용하는 것이다.
람다 별칭
- 별칭은 각각의 람다 함수를 가르키는 포인터가 된다.
- dev, test, prod 등의 별칭을 정의할 수 있다.
- 별칭은 각각의 다른 함수에 %를 나눠서 전송할 수도 있다.
- 예를 들어, v1에 95%를 보내고 v2에 5%를 보내 미리 배포환경에서의 테스트가 가능하다.
- 별칭은 다른 별칭을 가르킬 수 없다. 오로지 람다함수만 가르킬 수 있다.
- 각각의 람다함수는 고유한 ARN을 갖는다.
람다와 코드 디플로이
- 코드 디플로이를 사용하면 람다 별칭에 트래픽 이동을 자동화할 수 있고, 해당 별칭에 코드 빌드를 시킬 수도 있다.
- 코드 디플로이는 SAM과 통합된 기능이다.
- 코드 디플로이는 다음과 같이 트래픽을 뉴 버전에 점점 늘리는 방식으로 동작한다.
- Linear10PercentEvery3Minutes 또는 10분 전략이 가능하다.
- 카나리 전략은 x분간 Y 퍼센트였다가, 이후에 바로 100%로 바뀌는 전략이다.
- 10percent5miniutes면 5분간 10퍼였다가 5분 후 바로 100%로 바뀐다.
- 트래픽 보내기 이전이나 이후의 후크를 만들어 람다 함수의 상태를 미리 또는 이후에 확인할 수 있다.
- 문제가 발생하면 트래픽 후크가 실패하거나 클라우드 워치 알림이 실패하게 되고,
코드 디플로이에서 이를 감지해 원래 버전으로 돌려놓는다.
- 이름은 말 그대로 함수의 이름이다.
- 별칭은 함수의 별칭을 의미한다
- 밑은 현재 함수의 버전
- 타깃 버전은 트래픽이 이동할 함수의 버전을 의미한다
Function URL
- URL을 람다 함수에 할당해 람다함수를 사용할 수 있다.
- CORS 설정도 가능하고
- 람다 최신 버전 또는 별칭에는 연결이 가능하지만 버전에 연결은 불가능하다.
- AWS Console 또는 AWS API를 통해서 만들 수 있다.
- 사용량을 제한하고 싶다면 예약된 동시성을 사용해서 함수 자체의 동시 수행량을 제한하면 된다.
Function URL - 보안
- 리소스 기반 정책
- 어떤 계정이나 CIDR의 특정한 IP 범위, IAM 보안 주제를 기반으로 동작시킬 수 있다.
- CORS
- 다른 도메인에서 람다 함수 URL을 호출한다면, CORS 설정을 꼭해주어야 리소스를 가져갈 수 있다.
- AutyType - None
- none로 설정하면 람다 함수에 인증되지 않은 퍼블릭 액세스가 가능해진다.
- 그리고 리소스 기반 정책에 따라 액세스 허용 여부를 결정한다.
- AutyType - IAM
- IAM을 기반으로 접근 여부를 평가하고 리소스 정책 기반으로도 접근 여부를 평가하는 방식이다.
- 그러니 이 두 가지 모두 람다 함수 호출 권한이 있어야한다.
- 같은 계정 내의 서비스라면 둘 중 하나만 허용해도 접근이 가능하다.
- 교차 계정일 경우에만 두 개 다 허용이 되어야 한다.
람다 함수 limit
- 메모리는 128MB - 10GB 까지 가능하다.
- 메모리를 늘리는 것은 씨피유를 늘리는 것
- 최대 실행 시간은 15분
- 환경 변수는 최대 4KB까지 설정 가능하다
- tmp 폴더는 512MB 까지 가능하다.
- 람다 함수의 동시 실행 최대는 1000건이다.
- 배포의 경우 최대 압축 크기는 50MB이다.
- 압축하지 않았을 시는 250MB이다
- 그 이상의 큰 파일을 사용해야 할 경우 tmp를 사용하자
- 환경변수는 마찬가지로 4KB이다.