SlideShare a Scribd company logo
© 2018, Amazon Web Services, Inc. or its affiliates. All rights reserved.
내 입맛에 맞는 프로그래밍 언어로
Lambda 함수 만들기
정창훈


당근마켓
당근마켓
CTO
정창훈
@seapy
유튜버
팟캐스트
당근마켓
Seapy
루비
A
W
S
람
다
Node.js
내 입맞에 맞는 프로그래밍 언어로 Lambda 함수 만들기 :: 정창훈 - AWS Community Day 2019
내 입맞에 맞는 프로그래밍 언어로 Lambda 함수 만들기 :: 정창훈 - AWS Community Day 2019
내 입맞에 맞는 프로그래밍 언어로 Lambda 함수 만들기 :: 정창훈 - AWS Community Day 2019
Fotran
VB.net
GraalVM
Swift
Pascal
Common Lisp
Haskell
Vim
Crystal
AWS Lambda Custom Runtimes芸⼈ Advent Calendar 2018
커스텀 런타임
(Custom Runtime)
• 커스텀 런타임은 bootstrap 파일을 실행
• bootstrap 을 만들어서 정해진 위치에 두면 끝
커스텀 런타임 실행 구조
bootstrap
에러 발생시 핸들링
이벤트 데이터
(SNS, S3, API GW )
컨텍스트
(파일이름, 함수 이름…)
루비파일의 함수 실행
실행결과
Lambda Runtime API
커스텀 런타임에서 해야 할 일
bootstrap 만들기
#!/bin/sh
cd $LAMBDA_TASK_ROOT
./node-v11.1.0-linux-x64/bin/node runtime.js
일반적인 bootstrap
#!/bin/sh
set -euo pipefail
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"
while true
do
HEADERS="$(mktemp)"
EVENT=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/
runtime/invocation/next")
REQ_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT")
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQ_ID/
response" -d “$RESPONSE"
done
bootstrap 코드에 Runtime 구현
http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01
AWS Lambda Runtime API
#!/bin/sh
set -euo pipefail
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"
while true
do
HEADERS="$(mktemp)"
EVENT=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/
runtime/invocation/next")
REQ_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT")
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQ_ID/
response" -d “$RESPONSE"
done
이벤트 데이터 가져오기
• /runtime/invocation/next
• 람다 실행과 함께 전달된 이벤트 데이터 조회
• Request ID
• Client Context
• X-Ray Trace ID
• Lambda Function ARN
• Deadline ms
• Cognito Identity
API : Next Invocation
#!/bin/sh
set -euo pipefail
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"
while true
do
HEADERS="$(mktemp)"
EVENT=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/
runtime/invocation/next")
REQ_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT")
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQ_ID/
response" -d “$RESPONSE"
done
람다 함수 실행
#!/bin/sh
set -euo pipefail
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"
while true
do
HEADERS="$(mktemp)"
EVENT=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/
runtime/invocation/next")
REQ_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT")
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQ_ID/
response" -d “$RESPONSE"
done
함수 실행 결과 전달
• /runtime/invocation/{RequestId}/response
• 람다 함수 실행 결과를 전달
API : Invocation Response
• Invocation Error
• /runtime/invocation/{RequestId}/error
• Initialization Error
• /runtime/init/error
해야되는데 안한것
귀찮다…
귀찮음을 극복한 이야기
AWS Lambda 루비 버전
2.5
매년 크리스마스
새로운 루비 버전 릴리즈
• 2.6.0 - 2018-12-25
• 2.5.0 - 2017-12-25
• 2.4.0 - 2016-12-25
• 2.3.0 - 2015-12-25
• 2.2.0 - 2014-12-25
• 2.1.0 - 2013-12-25
2.6.0이 나왔는데
2.5.0을 사용하기는 찝찝하다.
혹은 내가 좋아하는 언어를 지원 안해준다
(ex. Fortran)
내 입맞에 맞는 프로그래밍 언어로 Lambda 함수 만들기 :: 정창훈 - AWS Community Day 2019
루비 2.5 람다 어딘가 bootstrap이 있겠네!
def lambda_handler(event:, context:)
`tar -cvf /tmp/runtime.tar /var/runtime`
result = `curl -F "file=@/tmp/runtime.tar" https://file.io`
{ statusCode: 200, body: result }
end
루비 2.5 람다 런타임에 있는 bootstrap 및 관련 파일 다운로드
압축을 풀면 bootstrap 파일 및 관련된 lib 폴더가 같이 있음
def lambda_handler(event:, context:)
`tar -cvf /tmp/runtime.tar /var/runtime`
result = `curl -F "file=@/tmp/runtime.tar" https://file.io`
{ statusCode: 200, body: result }
end
루비 2.5 람다 런타임에 있는 bootstrap 및 관련 파일 다운로드
압축을 풀면 bootstrap 파일 및 관련된 lib 폴더가 같이 있음
def lambda_handler(event:, context:)
`tar -cvf /tmp/runtime.tar /var/runtime`
result = `curl -F "file=@/tmp/runtime.tar" https://file.io`
{ statusCode: 200, body: result }
end
루비 2.5 람다 런타임에 있는 bootstrap 및 관련 파일 다운로드
압축을 풀면 bootstrap 파일 및 관련된 lib 폴더가 같이 있음
• /var/runtime 을 /var/task/ruby 로 변경(Lambda
Layer 라면 /opt/ruby)
bootstrap 파일 수정
# 주요 변경 예시
export GEM_HOME=/var/task/vendor/bundle/ruby/2.6.0
export GEM_PATH=/var/task/vendor/bundle/ruby/2.6.0:/var/task/ruby/gems/
2.6.0:/var/task/ruby/lib/ruby/gems/2.6.0
export RUBYLIB=/var/task:/var/task/ruby/lib:$RUBYLIB
export PATH=/var/task/ruby/bin:$PATH
/var/task/lib/runtime.rb
• Lambda 가 실행되는 환경에서 빌드
• Operating system ‒ Amazon Linux
• AMI ‒ amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
• Linux kernel ‒ 4.14.77-70.59.amzn1.x86_64
• EC2에서 빌드하기 번거로우니까 

lambci/lambda-base:build 도커 이미지 사용
루비 2.6.0 빌드
$ docker run -it --rm -v $(pwd):/var/task lambci/lambda-base:build /bin/bash
bash# yum install -y git bzip2 openssl-devel libyaml-devel libffi-devel 
readline-devel zlib-devel gdbm-devel ncurses-devel 
gcc gcc-c++ autoconf automake libtool bison
bash# git clone https://github.com/rbenv/ruby-build.git
bash# PREFIX=/usr/local ./ruby-build/install.sh
bash# ruby-build 2.6.0 /var/task/ruby
루비 2.6.0 빌드
/var/task/ruby
Lambda 실행시 루비 2.6.0이 설치될 경로
/opt/ruby
Lambda Layer 사용시
require 'json'
def lambda_handler(event:, context:)
r = {
version: "Current lambda ruby versions is #{RUBY_VERSION}",
endless: [0, 1, 2][0..]
}
{ statusCode: 200, body: JSON.generate(r) }
end
lambda_function.rb
준비된 파일들을 zip
.
├─ bootstrap 기존 람다에서 받은 파일. 루비 경로 변경
├─ lib 기존 람다에서 받은 파일
├─ ruby 빌드한 루비 2.6.0 폴더
└─ lambda_function.rb 실행될 람다 함수
$ zip -r ruby_260.zip bootstrap lib ruby lambda_function.rb
실행!
$ aws lambda create-function 
--function-name "aws-lambda-ruby-260" 
--zip-file "fileb://ruby_260.zip" 
--handler "lambda_function.lambda_handler" 
--runtime provided 
--role arn:aws:iam::xxxxxx:role/lambda_basic_execution
$ aws lambda invoke 
--function-name "aws-lambda-ruby-260" 
--payload '{"text":"Hello"}' 
response.txt
$ cat response.txt
{"statusCode":200,"body":"{"version":"Current lambda ruby
versions is 2.6.0","endless":[0,1,2]}"}
이것도 귀찮다!
루비 2.6.0을 쉽게 사용하는 방법
arn:aws:lambda:<region>:350831304703:layer:ruby-260:1
Ex) Seoul Region
arn:aws:lambda:ap-northeast-2:350831304703:layer:ruby-260:1
미리 만들어둔 람다 레이어 사용
루비 2.6 버전 커스텀 런타임에 대한
자세한 내용은 블로그 참고
AWS 람다(AWS Lambda) 커스텀 런타임 만들기

(feat. 루비 2.6.0) | 44bits.io
루비 2.6.0 빌드 및 람다 레이어 배포 소스 코드
https://github.com/seapy/aws-lambda-custom-
runtime-builder-for-ruby
내가 만들어서 다른사람을 이롭게 하자
루비처럼 람다에 루비 지원해달라고
청원 사이트 만들 필요 없다!



https://www.serverless-ruby.org/
AWS가 언어의 새로운 버전 적용 해주기를
기다릴 필요가 없다.
루비 1.0 버전을 실행하고 싶을때 AWS가 해줄리가 없음.
Fotran
VB.net
GraalVM
Swift
Pascal
Common Lisp
Haskell
Vim
Crystal
AWS Lambda Custom Runtimes芸⼈ Advent Calendar 2018
당근마켓 채용중
https://dngn.kr/join-us

More Related Content

PDF
Amazon EC2에서 Tensorflow 돌려보기 - 최선근 (데이터과학모임) :: AWS Community Day 2017
PDF
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
PDF
Gaming on AWS - 4. 인프라 자동화와 유용한 7가지 Tip
PDF
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
PDF
ELB와 EBS의 아키텍터로 생각해보는 사용상 주의할 점들
PDF
AWS re:Invent 신규 서비스 총정리 (윤석찬, AWS테크에반젤리스트)
PDF
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호(넥슨코리아) :: AWS Community Day 2020
PDF
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
Amazon EC2에서 Tensorflow 돌려보기 - 최선근 (데이터과학모임) :: AWS Community Day 2017
AWS SAM으로 서버리스 아키텍쳐 운영하기 - 이재면(마이뮤직테이스트) :: AWS Community Day 2020
Gaming on AWS - 4. 인프라 자동화와 유용한 7가지 Tip
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
ELB와 EBS의 아키텍터로 생각해보는 사용상 주의할 점들
AWS re:Invent 신규 서비스 총정리 (윤석찬, AWS테크에반젤리스트)
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호(넥슨코리아) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020

What's hot (20)

PDF
개발자를 위한 AWS re:Invent 신규 서비스 - 윤석찬 (AWS수석테크에반젤리스트) :: AWS Community Day 2020
PPTX
AWS 보안서비스 소개
PDF
AWS Summit 2019 - GS네오텍
PPTX
Aws summit 2017_이상오_fn
PDF
게임업계 IT 관리자를 위한 7가지 유용한 팁 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
PPTX
DevOps with AWS Edge
PDF
데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)
PDF
AWS를 통한 신뢰성 높은 지속적 배포 및 통합(CD/CI) 사례 - AWS Summit Seoul 2017
PDF
20180124 naver labs aws network and security
PDF
초보자를 위한 AWS EC2, RDS 설정
PDF
Amazon Redshift로 데이터웨어하우스(DW) 구축하기
PDF
CloudFront 활용하기
PDF
Amazon Echo 기반 IoT 서비스 개발을 위한 Alexa Skills Kit 및 AWS Lambda 활용 (윤석찬)
PDF
[AWS Migration Workshop] SQL Server Performance on AWS
PDF
AWS 기반 Kubernetes 정복하기::정영준:: AWS Summit Seoul 2018
PDF
Basics for understanding the cloud
PDF
Lag 없는 실시간 데이터 파이프라인을 위한 아키텍처 개선기
PDF
모바일을 위한 (AWS) 클라우드 기술 동향
PDF
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
PPTX
성능 최대화를 위한 CloudFront 설정 Best Practice
개발자를 위한 AWS re:Invent 신규 서비스 - 윤석찬 (AWS수석테크에반젤리스트) :: AWS Community Day 2020
AWS 보안서비스 소개
AWS Summit 2019 - GS네오텍
Aws summit 2017_이상오_fn
게임업계 IT 관리자를 위한 7가지 유용한 팁 - 박선용 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
DevOps with AWS Edge
데브옵스(DevOps)의 현재와 미래 - ChatOps & VoiceOps (윤석찬)
AWS를 통한 신뢰성 높은 지속적 배포 및 통합(CD/CI) 사례 - AWS Summit Seoul 2017
20180124 naver labs aws network and security
초보자를 위한 AWS EC2, RDS 설정
Amazon Redshift로 데이터웨어하우스(DW) 구축하기
CloudFront 활용하기
Amazon Echo 기반 IoT 서비스 개발을 위한 Alexa Skills Kit 및 AWS Lambda 활용 (윤석찬)
[AWS Migration Workshop] SQL Server Performance on AWS
AWS 기반 Kubernetes 정복하기::정영준:: AWS Summit Seoul 2018
Basics for understanding the cloud
Lag 없는 실시간 데이터 파이프라인을 위한 아키텍처 개선기
모바일을 위한 (AWS) 클라우드 기술 동향
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
성능 최대화를 위한 CloudFront 설정 Best Practice
Ad

Similar to 내 입맞에 맞는 프로그래밍 언어로 Lambda 함수 만들기 :: 정창훈 - AWS Community Day 2019 (20)

PPTX
Digging into helm
PDF
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
PDF
[AWS Dev Day] 앱 현대화 | 코드 기반 인프라(IaC)를 활용한 현대 애플리케이션 개발 가속화, 우리도 할 수 있어요 - 김필중...
PDF
Amazed by aws 2nd session
PDF
AWS Innovate: Infrastructure Automation on AWS - Seungdo Yang
PDF
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
PDF
성공적인 게임 런칭을 위한 비밀의 레시피 #3
PPTX
PHP Log Tracking with ELK & Filebeat part#2
PDF
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
PPTX
2015 oce garuda
PPTX
AWS의 하둡 관련 서비스 - EMR/S3
PDF
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
PPTX
Eclipse RAP
PDF
Node.js 팀 스터디 발표자료.
PPTX
리스펙토링 6월 세미나, AWS로 개인서버 구축하기
PPTX
Hadoop security DeView 2014
PDF
AWS Kubernetes 서비스 자세히 살펴보기 (정영준 & 이창수, AWS 솔루션즈 아키텍트) :: AWS DevDay2018
PDF
KAFKA 3.1.0.pdf
PDF
고급 서버리스 앱 개발 자세히 살펴보기::김필중:: AWS Summit Seoul 2018
PDF
Laravel 로 배우는 서버사이드 #1
Digging into helm
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[AWS Dev Day] 앱 현대화 | 코드 기반 인프라(IaC)를 활용한 현대 애플리케이션 개발 가속화, 우리도 할 수 있어요 - 김필중...
Amazed by aws 2nd session
AWS Innovate: Infrastructure Automation on AWS - Seungdo Yang
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
성공적인 게임 런칭을 위한 비밀의 레시피 #3
PHP Log Tracking with ELK & Filebeat part#2
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
2015 oce garuda
AWS의 하둡 관련 서비스 - EMR/S3
Create-React-App으로 SSR을 구현하며 배운 점 (feat. TypeScript)
Eclipse RAP
Node.js 팀 스터디 발표자료.
리스펙토링 6월 세미나, AWS로 개인서버 구축하기
Hadoop security DeView 2014
AWS Kubernetes 서비스 자세히 살펴보기 (정영준 & 이창수, AWS 솔루션즈 아키텍트) :: AWS DevDay2018
KAFKA 3.1.0.pdf
고급 서버리스 앱 개발 자세히 살펴보기::김필중:: AWS Summit Seoul 2018
Laravel 로 배우는 서버사이드 #1
Ad

More from AWSKRUG - AWS한국사용자모임 (20)

PDF
IaC로 AWS인프라 관리하기 - 이진성 (AUSG) :: AWS Community Day Online 2021
PPTX
Docker를 활용한 손쉬운 ECS 활용기 - 김민태 (AUSG) :: AWS Community Day Online 2021
PDF
AWS와 함께하는 무중단 배포 파이프라인 개선기 - 황성찬 (AUSG) :: AWS Community Day Online 2021
PDF
보안을 위한 AWS Network 구성 - 우수연 (AUSG) :: AWS Community Day Online 2021
PDF
자연어 처리 ML모델을 활용한 이커머스 문제 해결하기 - 진현두 (카카오스타일) :: AWS Community Day Online 2021
PDF
Athena & Step Function 으로 통계 파이프라인 구축하기 - 변규현 (당근마켓) :: AWS Community Day Onl...
PPTX
자바개발자가 최대한 빠르게 서비스를 오픈하는 방법 - 최진환 (드라마앤컴퍼니) :: AWS Community Day Online 2021
PDF
스타트업 나홀로 데이터 엔지니어: 데이터 분석 환경 구축기 - 천지은 (Tappytoon) :: AWS Community Day Onlin...
PDF
커뮤니티 빌더를 아시나요? - 윤평호(AWSKRUG) :: AWS Community Day Online 2021
PDF
복잡한 권한신청문제 ConsoleMe로 해결하기 - 손건 (AB180) :: AWS Community Day Online 2021
PDF
ECS to EKS 마이그레이션 경험기 - 유용환(Superb AI) :: AWS Community Day Online 2021
PDF
복잡한 기존 시스템에 피쳐 애드업 후기 - 김태웅(브랜디) :: AWS Community Day Online 2021
PDF
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
PDF
Amazon EKS로 간단한 웹 애플리케이션 구축하기 - 김주영 (AWS) :: AWS Community Day Online 2021
PDF
[AWS Hero 스페셜] 서버리스 기반 검색 서비스 구축하기 - 이상현(스마일벤처스) :: AWS Community Day Online ...
PDF
초기 스타트업의 AWS - 김지훈(투어라이브) :: AWS Community Day Online 2020
PDF
[AWS Hero 스페셜] Amazon Personalize를 통한 개인화/추천 서비스 개발 노하우 - 소성운(크로키닷컴) :: AWS C...
PPTX
goployer, 코드 기반의 배포 도구 - 송주영 (beNX) :: AWS Community Day 2020
PDF
온라인 주문 서비스를 서버리스 아키텍쳐로 구축하기 - 김태우(Classmethod) :: AWS Community Day Online 2020
PDF
엔터프라이즈 기업을 위한 Digital 플랫폼 구축 사례 - 권낙주(SK C&C) :: AWS Community Day Online 2020
IaC로 AWS인프라 관리하기 - 이진성 (AUSG) :: AWS Community Day Online 2021
Docker를 활용한 손쉬운 ECS 활용기 - 김민태 (AUSG) :: AWS Community Day Online 2021
AWS와 함께하는 무중단 배포 파이프라인 개선기 - 황성찬 (AUSG) :: AWS Community Day Online 2021
보안을 위한 AWS Network 구성 - 우수연 (AUSG) :: AWS Community Day Online 2021
자연어 처리 ML모델을 활용한 이커머스 문제 해결하기 - 진현두 (카카오스타일) :: AWS Community Day Online 2021
Athena & Step Function 으로 통계 파이프라인 구축하기 - 변규현 (당근마켓) :: AWS Community Day Onl...
자바개발자가 최대한 빠르게 서비스를 오픈하는 방법 - 최진환 (드라마앤컴퍼니) :: AWS Community Day Online 2021
스타트업 나홀로 데이터 엔지니어: 데이터 분석 환경 구축기 - 천지은 (Tappytoon) :: AWS Community Day Onlin...
커뮤니티 빌더를 아시나요? - 윤평호(AWSKRUG) :: AWS Community Day Online 2021
복잡한 권한신청문제 ConsoleMe로 해결하기 - 손건 (AB180) :: AWS Community Day Online 2021
ECS to EKS 마이그레이션 경험기 - 유용환(Superb AI) :: AWS Community Day Online 2021
복잡한 기존 시스템에 피쳐 애드업 후기 - 김태웅(브랜디) :: AWS Community Day Online 2021
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
Amazon EKS로 간단한 웹 애플리케이션 구축하기 - 김주영 (AWS) :: AWS Community Day Online 2021
[AWS Hero 스페셜] 서버리스 기반 검색 서비스 구축하기 - 이상현(스마일벤처스) :: AWS Community Day Online ...
초기 스타트업의 AWS - 김지훈(투어라이브) :: AWS Community Day Online 2020
[AWS Hero 스페셜] Amazon Personalize를 통한 개인화/추천 서비스 개발 노하우 - 소성운(크로키닷컴) :: AWS C...
goployer, 코드 기반의 배포 도구 - 송주영 (beNX) :: AWS Community Day 2020
온라인 주문 서비스를 서버리스 아키텍쳐로 구축하기 - 김태우(Classmethod) :: AWS Community Day Online 2020
엔터프라이즈 기업을 위한 Digital 플랫폼 구축 사례 - 권낙주(SK C&C) :: AWS Community Day Online 2020

내 입맞에 맞는 프로그래밍 언어로 Lambda 함수 만들기 :: 정창훈 - AWS Community Day 2019

  • 1. © 2018, Amazon Web Services, Inc. or its affiliates. All rights reserved. 내 입맛에 맞는 프로그래밍 언어로 Lambda 함수 만들기 정창훈 
 당근마켓
  • 9. • 커스텀 런타임은 bootstrap 파일을 실행 • bootstrap 을 만들어서 정해진 위치에 두면 끝 커스텀 런타임 실행 구조
  • 10. bootstrap 에러 발생시 핸들링 이벤트 데이터 (SNS, S3, API GW ) 컨텍스트 (파일이름, 함수 이름…) 루비파일의 함수 실행 실행결과 Lambda Runtime API 커스텀 런타임에서 해야 할 일
  • 13. #!/bin/sh set -euo pipefail source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" while true do HEADERS="$(mktemp)" EVENT=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/ runtime/invocation/next") REQ_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT") curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQ_ID/ response" -d “$RESPONSE" done bootstrap 코드에 Runtime 구현
  • 15. #!/bin/sh set -euo pipefail source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" while true do HEADERS="$(mktemp)" EVENT=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/ runtime/invocation/next") REQ_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT") curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQ_ID/ response" -d “$RESPONSE" done 이벤트 데이터 가져오기
  • 16. • /runtime/invocation/next • 람다 실행과 함께 전달된 이벤트 데이터 조회 • Request ID • Client Context • X-Ray Trace ID • Lambda Function ARN • Deadline ms • Cognito Identity API : Next Invocation
  • 17. #!/bin/sh set -euo pipefail source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" while true do HEADERS="$(mktemp)" EVENT=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/ runtime/invocation/next") REQ_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT") curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQ_ID/ response" -d “$RESPONSE" done 람다 함수 실행
  • 18. #!/bin/sh set -euo pipefail source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" while true do HEADERS="$(mktemp)" EVENT=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/ runtime/invocation/next") REQ_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT") curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQ_ID/ response" -d “$RESPONSE" done 함수 실행 결과 전달
  • 19. • /runtime/invocation/{RequestId}/response • 람다 함수 실행 결과를 전달 API : Invocation Response
  • 20. • Invocation Error • /runtime/invocation/{RequestId}/error • Initialization Error • /runtime/init/error 해야되는데 안한것
  • 23. AWS Lambda 루비 버전 2.5
  • 24. 매년 크리스마스 새로운 루비 버전 릴리즈 • 2.6.0 - 2018-12-25 • 2.5.0 - 2017-12-25 • 2.4.0 - 2016-12-25 • 2.3.0 - 2015-12-25 • 2.2.0 - 2014-12-25 • 2.1.0 - 2013-12-25
  • 25. 2.6.0이 나왔는데 2.5.0을 사용하기는 찝찝하다. 혹은 내가 좋아하는 언어를 지원 안해준다 (ex. Fortran)
  • 27. 루비 2.5 람다 어딘가 bootstrap이 있겠네!
  • 28. def lambda_handler(event:, context:) `tar -cvf /tmp/runtime.tar /var/runtime` result = `curl -F "file=@/tmp/runtime.tar" https://file.io` { statusCode: 200, body: result } end 루비 2.5 람다 런타임에 있는 bootstrap 및 관련 파일 다운로드 압축을 풀면 bootstrap 파일 및 관련된 lib 폴더가 같이 있음
  • 29. def lambda_handler(event:, context:) `tar -cvf /tmp/runtime.tar /var/runtime` result = `curl -F "file=@/tmp/runtime.tar" https://file.io` { statusCode: 200, body: result } end 루비 2.5 람다 런타임에 있는 bootstrap 및 관련 파일 다운로드 압축을 풀면 bootstrap 파일 및 관련된 lib 폴더가 같이 있음
  • 30. def lambda_handler(event:, context:) `tar -cvf /tmp/runtime.tar /var/runtime` result = `curl -F "file=@/tmp/runtime.tar" https://file.io` { statusCode: 200, body: result } end 루비 2.5 람다 런타임에 있는 bootstrap 및 관련 파일 다운로드 압축을 풀면 bootstrap 파일 및 관련된 lib 폴더가 같이 있음
  • 31. • /var/runtime 을 /var/task/ruby 로 변경(Lambda Layer 라면 /opt/ruby) bootstrap 파일 수정 # 주요 변경 예시 export GEM_HOME=/var/task/vendor/bundle/ruby/2.6.0 export GEM_PATH=/var/task/vendor/bundle/ruby/2.6.0:/var/task/ruby/gems/ 2.6.0:/var/task/ruby/lib/ruby/gems/2.6.0 export RUBYLIB=/var/task:/var/task/ruby/lib:$RUBYLIB export PATH=/var/task/ruby/bin:$PATH /var/task/lib/runtime.rb
  • 32. • Lambda 가 실행되는 환경에서 빌드 • Operating system ‒ Amazon Linux • AMI ‒ amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 • Linux kernel ‒ 4.14.77-70.59.amzn1.x86_64 • EC2에서 빌드하기 번거로우니까 
 lambci/lambda-base:build 도커 이미지 사용 루비 2.6.0 빌드
  • 33. $ docker run -it --rm -v $(pwd):/var/task lambci/lambda-base:build /bin/bash bash# yum install -y git bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel gcc gcc-c++ autoconf automake libtool bison bash# git clone https://github.com/rbenv/ruby-build.git bash# PREFIX=/usr/local ./ruby-build/install.sh bash# ruby-build 2.6.0 /var/task/ruby 루비 2.6.0 빌드
  • 34. /var/task/ruby Lambda 실행시 루비 2.6.0이 설치될 경로 /opt/ruby Lambda Layer 사용시
  • 35. require 'json' def lambda_handler(event:, context:) r = { version: "Current lambda ruby versions is #{RUBY_VERSION}", endless: [0, 1, 2][0..] } { statusCode: 200, body: JSON.generate(r) } end lambda_function.rb
  • 36. 준비된 파일들을 zip . ├─ bootstrap 기존 람다에서 받은 파일. 루비 경로 변경 ├─ lib 기존 람다에서 받은 파일 ├─ ruby 빌드한 루비 2.6.0 폴더 └─ lambda_function.rb 실행될 람다 함수 $ zip -r ruby_260.zip bootstrap lib ruby lambda_function.rb
  • 38. $ aws lambda create-function --function-name "aws-lambda-ruby-260" --zip-file "fileb://ruby_260.zip" --handler "lambda_function.lambda_handler" --runtime provided --role arn:aws:iam::xxxxxx:role/lambda_basic_execution $ aws lambda invoke --function-name "aws-lambda-ruby-260" --payload '{"text":"Hello"}' response.txt $ cat response.txt {"statusCode":200,"body":"{"version":"Current lambda ruby versions is 2.6.0","endless":[0,1,2]}"}
  • 40. 루비 2.6.0을 쉽게 사용하는 방법
  • 42. 루비 2.6 버전 커스텀 런타임에 대한 자세한 내용은 블로그 참고 AWS 람다(AWS Lambda) 커스텀 런타임 만들기
 (feat. 루비 2.6.0) | 44bits.io
  • 43. 루비 2.6.0 빌드 및 람다 레이어 배포 소스 코드 https://github.com/seapy/aws-lambda-custom- runtime-builder-for-ruby
  • 45. 루비처럼 람다에 루비 지원해달라고 청원 사이트 만들 필요 없다!
 
 https://www.serverless-ruby.org/
  • 46. AWS가 언어의 새로운 버전 적용 해주기를 기다릴 필요가 없다. 루비 1.0 버전을 실행하고 싶을때 AWS가 해줄리가 없음.