공부하기싫어
article thumbnail

#AWS Certified Developer Associate

 

302. Lambda 및 CloudFormation

  • inline

람다 코드를 인라인으로 CloudFormation 탬플릿에 정의 하는 것

cloudformation 람다 inline code

아주 단순한 함수에 쓰는 방법

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 로 해줬고 람다함수오 같은 리전에 생성해줬다

버저닝을 활성화해주고 생성

bucket

이후 해당 리전의 cloudshell 로 접속해서

이전에 만들어놨던 function.zip 파일을 여기 버킷에 업로드 한다고 한다

 

cloudshell 에 접속해서 해당 디렉토리로 이동한 다음

download file
function,zip

파일을 다운로드 해준다

로컬에 다운로드 된 파일을 그대로 버킷에 업로드 해준다

이제 이 function.zip 파일을 CloudFormation 탬플릿에서 직접 참조할 수 있다고 한다

 

이제 cloudformation 콘솔로 이동해서

스택 생성

새로 스택을 생성해주고

이후 이름과 함수에서 쓸 파라미터를 입력해준다

파라미터

첫번째 인자는 버킷 이름

두번째는 zip 파일 명이고

3번째는 버전 정보인데 객체 정보에 들어가보면 버전 정보를 확인할 수 있다

이후 다음 - 다음 하게되면

아래에서

Lambda 함수에 꼭 필요한 IAM 역할을 생성하도록 승인해주고 create stack

 

생성해주면 스택이 생성되고 완료될때 까지 조금 시간이 걸린다

스택 생성

스택이 모두 생성되면

람다 함수 콘솔로 이동해서

 

람다 함수 생성

위와 같은 알림을 확인할 수 있는데

이 함수는 애플리케이션에 속한다고 하는데 이는 lambda 콘솔이 cloudformation 과 lambda의 통합을 감지했기 때문이다

- cloudformation 탬플릿으로 관리되고 있음

이후 작동 테스트를 해보면

test

잘 작동되고잇는걸 확인할 수 있다

x-ray 도 활성화 되어있어서 x-ray 콘솔에서 추적 현황도 확인할 수 있다

active tracing

실습이 끝난 후 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 라이브러리를 참조하는 코드를 해당 함수의 종속성을 공격하는 일 없이 사용할 수 있다

code

아까 aws 공식 블로그의 코드를 가져와서 붙여넣고 테스트해보면

 

test

이처럼 랜덤 행렬을 반환하는 것을 확인할 수 있다

 

 

 

 

 

 

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 에서 새 버전 발행 클릭

새 버전 발행

설명은 임의로 입력하고 게시

 

version 1

함수 안에 버전 콘솔이 새로 나타나고

아래 코드 화면에서 알림으로 코드 편집은 퍼블리싱 되지 않은 함수 페이지에서만 사용할수 있다고 나온다

즉 LATEST 에서만 코드 편집이 가능하다

 

다시 함수 콘솔로 돌아가서

리턴 값에 verison 2 로 해주고 새 버전 발행

version 2 새 버전 발행
새 버전

새로운 코드로 새로운 버전을 만들 수 있다

 

이제 별칭을 실습한다고 함

람다 함수 콘솔 메인으로 돌아와서

버전 메뉴로 가보면

 

version

만들었던 버전들을 확인할 수 있다

 

이제 바로 왼쪽의 별칭 메뉴로 들어가서

새로 만들어보자

alias

별칭 이름은 dev 로 해주고 버전은 최신 버전을 선택해주고 저장

같은 방식으로 test 는 버전 2 , prod 는 버전 1 로 별칭을 생성해준다

 

alias

이렇게 버저닝을 환경별로 해놓은 상태에서

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 를 이용해 암호화 하여 환경변수로 사용 가능

 

배포 패키지 크기를 런타임에 맞게 최소화 해야함

- 함수가 너무 크면 나눠야 함

- 패키지 크기를 위한 람다 제한 준수

- 라이브러리 재사용을 위해 람다 계층 사용

 

재귀적인 코드 배제

- 람다 함수가 자기 자신을 호출해서는 안됨