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
함수 실행 결과 전달
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 빌드
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