#AWS Certified Developer Associate
302. Lambda 및 CloudFormation
- inline
람다 코드를 인라인으로 CloudFormation 탬플릿에 정의 하는 것
아주 단순한 함수에 쓰는 방법
Code.ZipFile 속성 사용
함수 종속성은 포함시킬 수 없음
- 함수 종속성이 없는 간단한 코드만 사용 가능
- through S3
s3 버킷을 통해 zip file 을 업로드 하는 방식
람다 함수 zip 파일을 Amazon S3 에 저장해야 함
CloudFormation 코드에 S3 zip 의 위치를 참조하도록 설정해야 함
- S3 Bucket
- S3 Key : full path to zip
- S3ObjectVersion (버저닝된 버킷)
s3 에 코드를 업데이트 했으나 cloudformation 에서 속성들을 업데이트 하지 않는다면 cloudformation 은 함수를 자동으로 업데이트 시켜주지 않음 - 버저닝 추천됨
- lambda and cloudformation - through s3 multiple accounts
람다 함수를 CloudFormation 을 통해 다수의 계정에 배포하고 싶은 경우
버킷 정책을 통해 타 계정에서 접근 허용
접속하는 계정 자체의 CloudFormation 의 실행 역할을 정의해서 접근하려고 하는 계정에 있는 s3 버킷에 가서 리스팅을 하도록 허용
303. Lambda 및 CloudFormation - 실습
우선 예제 cloudformation 탬플릿을 살펴본다고 한다
Parameters:
S3BucketParam:
Type: String
S3KeyParam:
Type: String
S3ObjectVersionParam:
Type: String
Resources:
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: "/"
Policies:
- PolicyName: root
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- logs:*
Resource: arn:aws:logs:*:*:*
- Effect: Allow
Action:
- xray:PutTraceSegments
- xray:PutTelemetryRecords
- xray:GetSamplingRules
- xray:GetSamplingTargets
- xray:GetSamplingStatisticSummaries
Resource: "*"
- Effect: Allow
Action:
- s3:Get*
- s3:List*
Resource: "*"
LambdaWithXRay:
Type: "AWS::Lambda::Function"
Properties:
Handler: "index.handler"
Role:
Fn::GetAtt:
- "LambdaExecutionRole"
- "Arn"
Code:
S3Bucket:
Ref: S3BucketParam
S3Key:
Ref: S3KeyParam
S3ObjectVersion:
Ref: S3ObjectVersionParam
Runtime: "nodejs14.x"
Timeout: 10
# Enable XRay
TracingConfig:
Mode: "Active"
3개의 파라미터를 사용한다
이것들은 S3에서 function.zip 파일을 찾을 때 사용된다고 한다
리소스 항목에 보면
LambdaExecutionRole 을 만든다
IAM 역할로 정책뿐만 아니라 람다 함수가 이 iam 역할을 가정하게 하는 PolicyDocument 가 있다
이 뭄ㄴ서에는 다수의 문장이 포함되어 있다
- CloudWatch 에서의 작업
- X-Ray 에서의 작업
- S3 에서의 작업
다음 리소스는 LambdaWithXRay 인데
핸들러를 특정해야 하는 함수여서 index.handler 라고 속성에 기재되어있다
GetAtt 함수를 사용해서 위에 LambdaExecution Role 로 부터의 속성을 받을 수 있다
그리고 코드 그 자체가 나온다 - 세 개의 입력값을 가진다 - 탬플릿 초반의 파라미터에서 값을 받아옴
이제 s3 로 가서 새로운 버킷을 하나 만든다고 한다
이름은 s3-cloudformation-lambda-demo-yeonwoo 로 해줬고 람다함수오 같은 리전에 생성해줬다
버저닝을 활성화해주고 생성
이후 해당 리전의 cloudshell 로 접속해서
이전에 만들어놨던 function.zip 파일을 여기 버킷에 업로드 한다고 한다
cloudshell 에 접속해서 해당 디렉토리로 이동한 다음
파일을 다운로드 해준다
로컬에 다운로드 된 파일을 그대로 버킷에 업로드 해준다
이제 이 function.zip 파일을 CloudFormation 탬플릿에서 직접 참조할 수 있다고 한다
이제 cloudformation 콘솔로 이동해서
새로 스택을 생성해주고
이후 이름과 함수에서 쓸 파라미터를 입력해준다
첫번째 인자는 버킷 이름
두번째는 zip 파일 명이고
3번째는 버전 정보인데 객체 정보에 들어가보면 버전 정보를 확인할 수 있다
이후 다음 - 다음 하게되면
아래에서
Lambda 함수에 꼭 필요한 IAM 역할을 생성하도록 승인해주고 create stack
생성해주면 스택이 생성되고 완료될때 까지 조금 시간이 걸린다
스택이 모두 생성되면
람다 함수 콘솔로 이동해서
위와 같은 알림을 확인할 수 있는데
이 함수는 애플리케이션에 속한다고 하는데 이는 lambda 콘솔이 cloudformation 과 lambda의 통합을 감지했기 때문이다
- cloudformation 탬플릿으로 관리되고 있음
이후 작동 테스트를 해보면
잘 작동되고잇는걸 확인할 수 있다
x-ray 도 활성화 되어있어서 x-ray 콘솔에서 추적 현황도 확인할 수 있다
실습이 끝난 후 cloudformation 스택은 모두 삭제해줬다
304. Lambda 계층
람다 계층이 제공하는 기능 2가지
- 람다에 사용자 지정 런타임을 생성할 수 있다
ex) C++, Rust
- 재사용을 위해 종속성을 외부화 할 수 있다
람다 함수 업데이트를 위해 아주 큰 라이브러리나 큰 종속성을 매번 압축해서 업로드 해야 할 경우,
이때 사용하는 종속성이 바뀌지 않는 경우도 있게 됨
- layer 에 종속성을 외부화하여 코드만 업로드 후 참조
305. Lambda 계층 - 실습
이번 실습은 aws 공식 튜토리얼을 따라한다고 한다
함수를 새로 생성한다
이름은 lambda-layer-demo 로 하고 런타임은 파이썬 3.8 로 놓고 생성
계층을 생성하는 과정은 복잡하지만 이번 실습에서는 계층이 동작하는 부분을 실습한다고 한다
아래 공식 블로그 링크로 들어가주고
내리다 보면
사용할 수 있는 python 코드를 확인할 수 있다
다시 람다 콘솔로 돌아와서
함수 이름 아래 layer(0) 는 현재 등록된 레이어가 없다는걸 의미하고
눌러보면 페이지 하단으로 이동하게 된다
add layer 로 계층 추가 콘솔로 들어가서 추가해준다
위 사진처럼 설정한다
이 말은 계층이 람다 함수에 사용 가능한 python 3.8용 으로 이미 컴파일된 SciPy 라이브러리를 갖는다는 의미이다
버전은 최신 버전으로 선택해준다
이후 추가 하게 되면
SciPy 라이브러리를 참조하는 코드를 해당 함수의 종속성을 공격하는 일 없이 사용할 수 있다
아까 aws 공식 블로그의 코드를 가져와서 붙여넣고 테스트해보면
이처럼 랜덤 행렬을 반환하는 것을 확인할 수 있다
306. Lambda 컨테이너 이미지
람다 함수를 ECR 로 부터 최대 10GB 의 이미지 컨테이너로서 배포할 수 있다
복잡한 종속성과 큰 종속성을 한 컨테이너에 패키징 할 수 있게 됨
람다는 컨테이너라는 가상 기기를 구동하고 사용자는 그 컨테이너의 기본 이미지를 사용함
- 그 이미지에 애플리케이션 코드와 종속성을 추가하고 이걸 람다가 실행할 수 있는 이미지로서 패키징함
기본 이미지는 반드시 Lambda Runtime API 를 사용해야 함
- Python, Node.js , Java, .NET, Go, Ruby
Lambda Runtime API 를 통해 사용자 지정 이미지를 사용할 수도 있지만 상당히 복잡하다고 함
Lambda Runtime Interface Emulator 를 통해 사용자 컨테이너를 로컬에서 테스트 할 수 있다고 함
- 만약 람다 함수를 컨테이너로 사용한다면 이를 통해 통일된 워크 플로우로 앱을 개시할 수 있음
Lambda Container Images
aws 에서 제공하는 기본 이미지를 이용한 예시
#Lambda Runtime API 를 사용하는 이미지를 선택함
#애플리케이션 코드와 파일을 복사함
#컨테이너에 필요한 종속성을 설치함
#람다 함수가 호출될 때 어느 함수를 실행할지 선택함
종속성이나 올바른 컴파일 등에 대해 거의 신경 쓸 필요가 없음
307. Lambda 버전 및 Alias
Lambda Version
버전을 퍼블리싱 하게 되면 코드나 환경변수 등 어떤것도 변경이 불가능하다
퍼블리싱을 할때마다 버전의 번호는 커지게 됨
각 버전은 독립적이며 저마다의 ARN(Amazon Resource Name)을 받음
즉 버전=코드+구성
각 람다 함수의 버전은 $LATEST 와 마찬가지로 액세스가 가능함
AWS Lambda Aliases
별칭(Aliases) 은 람다 함수 버전을 알리는 포인터가 되어줌
- 예를들어 dev , test , prod 등의 별칭
람다 별칭은 수정(변경)이 가능함
별칭은 블루/그린 배포를 가능하게 함 - 사용자가 가리키는 람다 함수 버전에 비중을 할당해 줄 수 있음
별칭은 트리거 혹은 최종 사용자에게 안정적인 환경 설정을 제공함
따라서 별칭은 저마다 고유의 ARN 을 갖게 됨
별칭은 다른 별칭을 참조할 수 없음
308. Lambda 버전 및 Alias - 실습
함수를 새로 생성한다
이름은 lambda-version-demo 로 하고 파이썬 최신 버전으로 생성
코드를 간단하게
import json
def lambda_handler(event, context):
return "this is version 1"
이정도로 수정한뒤 테스트 해보면 잘 출력된다
이 함수를 버전 1로 퍼블리싱 할거다
람다 함수 콘솔에서 action 에서 새 버전 발행 클릭
설명은 임의로 입력하고 게시
함수 안에 버전 콘솔이 새로 나타나고
아래 코드 화면에서 알림으로 코드 편집은 퍼블리싱 되지 않은 함수 페이지에서만 사용할수 있다고 나온다
즉 LATEST 에서만 코드 편집이 가능하다
다시 함수 콘솔로 돌아가서
리턴 값에 verison 2 로 해주고 새 버전 발행
새로운 코드로 새로운 버전을 만들 수 있다
이제 별칭을 실습한다고 함
람다 함수 콘솔 메인으로 돌아와서
버전 메뉴로 가보면
만들었던 버전들을 확인할 수 있다
이제 바로 왼쪽의 별칭 메뉴로 들어가서
새로 만들어보자
별칭 이름은 dev 로 해주고 버전은 최신 버전을 선택해주고 저장
같은 방식으로 test 는 버전 2 , prod 는 버전 1 로 별칭을 생성해준다
이렇게 버저닝을 환경별로 해놓은 상태에서
prod 환경의 버전을 2로 업그레이드 한다고 가정해보자
prod alias 의 편집에 들어가준다
이런 식으로 새로운 버전에 대해 weight 를 설정해서 새 버전의 함수를 테스트 해볼 수 있다
실습을 위해 50%로 둘다 설정하고 해당 함수 테스트를 여러번 해보면 50% 확률로 version 1 과 version 2 를 리턴한다
309. Lambda 및 CodeDeploy
lambda 는 codedeploy 와 통합될 수 있고 codedeploy 는 람다 별칭의 트래픽 전환을 자동화 할 수 있게 해줌
version 과 alias 의 부수적인 내용
CodeDeploy 의 기능은 SAM framework 에 통합되어 있음 - Serverless Application Model - 나중 강의에서 배움
Linear - n분마다 트래픽을 올려 100%까지 도달시킴
Canary - x% 를 시도한 다음 100%로 전환함
- Canary 10% 5min : 5분간 10% 카나리의 경우 5분간은 10% 트래픽을 변경 버전으로 보내다가 5분 후에는 100%를 변경 버전으로 트래픽을 보냄
AllAtOnce - v1 과 v2 사이의 트래픽을 즉시 전환 - 가장 빠르고 가장 위험한 방법
사전 및 사후 트래픽 후크를 만들어 ㄹ마다 함수의 상태를 확인할 수 있음 - 만약 뭔가가 잘못될 경우(트래픽 후크가 실패 or CloudWatch 알림 실패) CodeDeploy 가 실패를 감지하여 롤백시킴
310. Lambda 제한(Limits)
- Execution (실행 제한)
메모리 할당 : 128MB - 10GB
최대 실행 시간 : 900초(15분)
환경 변수 : 최대 4KB
/tmp space : 512MB
람다 함수의 동시 실행은 최대 1000건
- Deployment (배포 제한)
zip 압축 파일의 최대 크기 : 50MB
압축하지 않았을 시 (code + dependencies) : 250MB
처음부터 큰 사이즈의 파일을 사용해야 한다면 /tmp 디렉토리를 사용
환경 변수 : 최대 4KB
311. Lambda 모범 사례
핸들러가 실행되는 시간을 최소화 하기 위해 함수 핸들러 외부에서 많은 작업을 수행해야 함
- 함수 핸들러 외부에서 데이터 베이스를 연결
- 핸들러 외부에서 AWS SDK 를 초기화
- 함수 핸들러 외부에서 종속성과 데이터 셋을 가져오기
환경 변수 사용
- 시간에 따라 변화할 수 있는 변수들에 사용
- db 연결 문자열, s3 버킷 이름 등등
- 비밀번호와 같은 민감한 값은 KMS 를 이용해 암호화 하여 환경변수로 사용 가능
배포 패키지 크기를 런타임에 맞게 최소화 해야함
- 함수가 너무 크면 나눠야 함
- 패키지 크기를 위한 람다 제한 준수
- 라이브러리 재사용을 위해 람다 계층 사용
재귀적인 코드 배제
- 람다 함수가 자기 자신을 호출해서는 안됨
'AWS > AWS Certified Developer Associate' 카테고리의 다른 글
[Udemy][day-52,53] Section22 : AWS 서버리스 : DynamoDB - 2 (0) | 2023.02.11 |
---|---|
[Udemy][day-50,51] Section22 : AWS 서버리스 : DynamoDB (0) | 2023.02.08 |
[Udemy][day-48] Section21 : AWS 서버리스 : Lambda - 2 (0) | 2023.01.13 |
[Udemy][day-47] Section21 : AWS 서버리스 : Lambda - 1 (0) | 2023.01.11 |
[Udemy][day-45,46] Section20 : AWS 통합 및 메시징 : SQS, SNS 및 Kinesis - 2 (0) | 2023.01.02 |