Slide 1

Slide 1 text

introducing 
 AWS Lambda @qrtt1 at TWJUG
 2015/8/1 For Java Developer

Slide 2

Slide 2 text

"84-BNCEB • 讓開發者專注於功能開發,減少 infrastructure 維運 負擔的事件驅動(event-driven)服務 • ⾃自動依 event 或 request 的速率決定 auto scaling。 • 結合 AWS 其他產品提供的 Event 或 Stream 資料, ⾜足以應付⼤大多數的背景服務實作。 • 例如:使⽤用者上傳圖⽚片,製作圖⽚片縮圖以便在各種 device 或不同情境使⽤用。

Slide 3

Slide 3 text

ක೯ ྼЪIBOEMF 1

Slide 4

Slide 4 text

ක೯ ྼЪIBOEMF ᇜᙇeɪෂ೻ό 1 2

Slide 5

Slide 5 text

ක೯ foo.bar.Class ::lambdaHandler ྼЪIBOEMF ൗ̅IBOEMF ᇜᙇeɪෂ೻ό 1 2 3

Slide 6

Slide 6 text

ੂБ DynamoDB
 Kinesis streams poll & invoke pull mode CreateEventSourceMapping

Slide 7

Slide 7 text

ੂБ streams poll & invoke pull mode S3 SNS Cognito Echo User App DynamoDB Kinesis push mode invoke directly Event Event/RequestResponse

Slide 8

Slide 8 text

ੂБ streams poll & invoke pull mode S3 SNS Cognito Echo User App DynamoDB Kinesis push mode invoke directly Event Event/ whatever mode API Gateway

Slide 9

Slide 9 text

ੂБ streams poll & invoke pull mode S3 SNS Cognito Echo User App DynamoDB Kinesis push mode invoke directly Event Event Event RequestResponse • Invocation Type • ResquestResponse • synchronously • return supported types • Event • asynchronously • must return void

Slide 10

Slide 10 text

ੂБᐑྤ ኹ׬-BNCEBලᇌdלഒලᇌሙၤ 實際上會在 Linux Container 上執⾏行 僅 /tmp 有寫⼊入權限 上傳的 ZIP 被解壓縮⾄至 /var/task ⺫⽬目錄 LD_LIBRARY_PATH="/var/runtime :/var/task:/var/task/lib"

Slide 11

Slide 11 text

-BNCEB'VODUJPO • lambda function 必需是 stateless 的。 • lambda function 除了可讀寫 /tmp 路徑,其他路徑都 是唯讀或無法存取,不應該依賴或假設執⾏行環境的狀 態。 • 不能假設 lambda function 總是在同⼀一台機器上執⾏行 (隨著 event/request rate 會⾃自動 auto scaling) • 可以將 native library 包成 deployable package (ZIP format) 內,但記得標⽰示為 executable 權限。

Slide 12

Slide 12 text

ᇜᄳ-BNCEB'VODUJPO dependencies { compile 'com.amazonaws:aws-lambda-java-core:1.+' compile 'com.amazonaws:aws-lambda-java-events:1.+' } ̀ࠅධͦd݊ྼЪMBNCEBGVODUJPOٙBQJ ፯͜ධͦd݊QSFEFGJOFEFWFOUTٙBQJ com.amazonaws.services.lambda.runtime.events.S3Event

Slide 13

Slide 13 text

ᇜᄳ-BNCEB'VODUJPO outputType handler-name(inputType input, Context context) { ... } • Invocation Type • ResquestResponse • synchronously • return supported types • Event • asynchronously • must return void • supported types • simple java types • POJO (java bean convention) • InputStream
 OutputStream ՉྼʔึᏨݟ̴݊ʔ݊WPJE

Slide 14

Slide 14 text

ᛆࠢ-BNCEB&YFDVUPS JO*".3PMF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] } ცΎ̋ɪԴ͜Չ̴؂ਕึ͜ՑٙᛆࠢdԷν4ᛘᄳ

Slide 15

Slide 15 text

ᛆࠢԴ͜-BNCEB"1* { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:*", "iam:PassRole" ], "Resource": "*" } ] } މ%&.0˙کdҢࡁᔊఊԴ͜MBNCEB°ܸ֛הϞᛆࠢ JBN1BTT3PMFʔ̋œೌجխ̣MBNCEBBQJd ྅݊œһอMBNCEBGVODUJPODPEFఱʔঐਂə

Slide 16

Slide 16 text

)FMMP-BNCEB%&.0 • 由 Lambda Console Overview • 使⽤用 low level api 呼叫 • 使⽤用 Service 呼叫

Slide 17

Slide 17 text

1FFQ-BNCEB&OWJSPONFOU • ⽤用 Lambda 呼叫 Linux 指令,觀察 Lambda 執⾏行環 境 • Java 版本,No SecurityManager • 環境變數 • Image • User

Slide 18

Slide 18 text

ffprobe version 0.9, Copyright (c) 2007-2011 the FFmpeg developers built on Jan 8 2015 14:27:50 with clang 6.0 (clang-600.0.56) configuration: --prefix=/opt/muzee --disable-yasm --disable-doc --enable-openssl --enable-nonfree libavutil 51. 32. 0 / 51. 32. 0 libavcodec 53. 42. 0 / 53. 42. 0 libavformat 53. 24. 0 / 53. 24. 0 libavdevice 53. 4. 0 / 53. 4. 0 libavfilter 2. 53. 0 / 2. 53. 0 libswscale 2. 1. 0 / 2. 1. 0 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'foo.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2014-11-22 13:54:19 Duration: 00:05:12.21, start: 0.000000, bitrate: 675 kb/s Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 576 kb/s, 30 fps, 30 tbr, 30 tbn, 60 tbc Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 95 kb/s Metadata: creation_time : 2014-11-22 13:54:20 handler_name : FYBNQMF -BNCEB8JUI/BUJWF-JCSBSJFT • 利⽤用 FFMpeg 製作影⽚片預覽圖 • 使⽤用 ffprobe 取得影⽚片⻑⾧長度,每 30 秒建⽴立⼀一個縮圖 任務 (VideoPreviewTaskGenerator) • 使⽤用 ffmpeg 執⾏行縮圖任務 { "bucket": "qty.lambda.video", "offset": 60, "image_key": "images/sample.mp4.2.png", "key": "videos/sample.mp4" }

Slide 19

Slide 19 text

FYBNQMF -BNCEB8JUI/BUJWF-JCSBSJFT • 註冊的 S3 Event • OnVideoUploaded 取得 video duration 建⽴立截圖 任務 • OnReceivedPreviewJob 建⽴立縮圖

Slide 20

Slide 20 text

• 注意檔案權限,執⾏行檔與 shared object 需要可執⾏行 權限 task buildZip(type: Zip) { from compileJava from processResources into('lib') { from configurations.runtime } eachFile { if (it.name.contains(".so.")) fileMode 0755 if (it.name.contains("ffprobe")) fileMode 0755 if (it.name.contains("ffmpeg")) fileMode 0755 } } FYBNQMF -BNCEB8JUI/BUJWF-JCSBSJFT

Slide 21

Slide 21 text

Չ˼ਪᕚ "84$-* aws lambda create-function help --runtime (string) The runtime environment for the Lambda function you are uploading. Currently, Lambda supports "java" and "nodejs" as the runtime. KBWBʑ݊࿁ٙ

Slide 22

Slide 22 text

Չ˼ਪᕚ -JNJU4VQQPSU ӚϞ؇ԯlk

Slide 23

Slide 23 text

Չ˼ਪᕚ 4FDVSJUZ.BOBHFS ӚϞ4FDVSJUZ.BOBHFSڜኺ΂О؇Г ӚϞ4FDVSJUZ.BOBHFSڜኺ΂О؇Г ӚϞ4FDVSJUZ.BOBHFSڜኺ΂О؇Г 4ZTUFNFYJU  ̙݊˸І૨ٙ

Slide 24

Slide 24 text

Q & A