5
也來玩玩 aws lambda for java (/z/programming)

大致依著官方手冊作一次就會用了,不過有些東西他好像沒說得太清楚:

  1. upload from s3 的來源必需與 lambda 同一個 region。用錯 region 的錯誤訊是
    The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
    
  2. 實作 RequestHandler 想要傳 json string 進去,INPUT TYPE 實測 起來要放 LinkedHashMap
  3. 因為無法連到 http://169.254.169.254/latest/meta-data/,所以建立 aws api client 時,不能使用 InstanceProfileCredentialsProvider2,就用預設值就能吃到 role 的權限。
  4. lambda console 上有個 Add API endpoint 是連到 api gateway3 ,猜測是某種新服務,目前點開只有 404 Page Not Found,透過 http request 的功能應該就快出來了。

這次練習弄個了 web screen capture 的小專案 aws-lambda-phantomjs1,美中不足是沒有權限裝中文字型(連 fc-cache 都沒地方可寫入)

START RequestId: 6660667e-269e-11e5-bc9d-4343c24dc284
[INPUT] {cmd=/usr/bin/fc-cache, args=[-fv, /tmp]}Jul 10, 2015 12:55:49 AM qty.aws.lambda.ApplicationExecutor <init>
INFO: [/usr/bin/fc-cache, -fv, /tmp]
RESULT: /tmp: /tmp: failed to write cache
RESULT: caching, new cache contents: 0 fonts, 1 dirs
RESULT: /tmp/hsperfdata_sbx_user1051: /tmp/hsperfdata_sbx_user1051: failed to write cache
RESULT: caching, new cache contents: 0 fonts, 0 dirs
RESULT: /var/cache/fontconfig: not cleaning unwritable cache directory
RESULT: /usr/bin/fc-cache: failed
END RequestId: 6660667e-269e-11e5-bc9d-4343c24dc284
REPORT RequestId: 6660667e-269e-11e5-bc9d-4343c24dc284  Duration: 3040.71 ms    Billed Duration: 3100 ms    Memory Size: 512 MB Max Memory Used: 78 MB  
IngramChen 積分 0

這會不會有 cold startup 的問題啊,每次都要經過啟動的程序,所以很慢?

qrtt1 積分 2

不過它的使用模型分為 Push Model 跟 Pull Mode。

Pull Mode 是讓它去「聽(不是真的 listen,而是去 polling)」其他 resource 的 event 就是非同步的,應該不會太在呼有沒有啟動慢,不過看 aws 論壇有些抱怨是 throughput 不夠大,或有些 event 沒聽到(?)

現在練習在玩的是 Push Mode 是直接塞 event 給它,這就是同步的呼叫了,會等到它處理完才回來。以目前用 phantomjs 的感覺,就真的慢慢的。

不過,我預想的應用情境也是 Pull Mode 的,所以應該可以接受。像是我們會讓 content provider(片商!?)上片,它是一組檔案合起來成一部完整的內容,我可以看到新的檔上來後,再臨時判斷它有沒有「集滿一組」再做處理:簡單的由上傳區,移到該放的位置,或是出診斷訊息。告訴使用者「你馬幫幫忙,上個片缺東缺西的」或「你欺騙我的感情,明明片長 3 小時,內容只有 1 小時多」

qrtt1 積分 1 編輯於

如果考慮不呼叫外部的程式慢。它的 jvm 本身會保持活著一陣子,應該是還好哩

下面這個不含第 1 次啟動,call 外部程式 ps aux 的時間 100 ms

START RequestId: bfa611fa-26c6-11e5-b17e-e52ad05c62a9
[INPUT] {cmd=/bin/ps, args=[aux]}Jul 10, 2015 5:44:36 AM qty.aws.lambda.ApplicationExecutor <init>
INFO: [/bin/ps, aux]
RESULT: USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
RESULT: 496          1  0.2  1.3 2426740 52136 ?       Ssl  05:39   0:00 java -XX:MaxHeapSize=445645k -XX:MaxMetaspaceSize=52429k -XX:ReservedCodeCacheSize=26214k -XX:+UseSerialGC -Xshare:on -XX:-TieredCompilation lambdainternal.LambdaRTEntry
RESULT: 496         15  0.0  0.0  13560  1068 ?        R    05:44   0:00 /bin/ps aux
END RequestId: bfa611fa-26c6-11e5-b17e-e52ad05c62a9
REPORT RequestId: bfa611fa-26c6-11e5-b17e-e52ad05c62a9  Duration: 21.40 ms  Billed Duration: 100 ms     Memory Size: 512 MB Max Memory Used: 78 MB  

放久一點讓它被砍掉的話,含第 1 次啟動就到 500 ms,差異不算太大就是了

START RequestId: 0e07d9af-26cb-11e5-a5ca-510262c74bd7
[INPUT] {cmd=/bin/ps, args=[aux]}Jul 10, 2015 6:15:26 AM qty.aws.lambda.ApplicationExecutor <init>
INFO: [/bin/ps, aux]
RESULT: USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
RESULT: 495          1 31.5  1.2 2227848 47788 ?       Ssl  06:15   0:00 java -XX:MaxHeapSize=445645k -XX:MaxMetaspaceSize=52429k -XX:ReservedCodeCacheSize=26214k -XX:+UseSerialGC -Xshare:on -XX:-TieredCompilation lambdainternal.LambdaRTEntry
RESULT: 495         11  0.0  0.0  13556  1064 ?        R    06:15   0:00 /bin/ps aux
END RequestId: 0e07d9af-26cb-11e5-a5ca-510262c74bd7
REPORT RequestId: 0e07d9af-26cb-11e5-a5ca-510262c74bd7  Duration: 492.38 ms Billed Duration: 500 ms     Memory Size: 512 MB Max Memory Used: 33 MB  
qrtt1 積分 1

如果執行 whoami 會是個 sandbox user (看起來真的頗安全)

START RequestId: b60ab05d-269e-11e5-a8cd-1d9c095ef12f
[INPUT] {cmd=/usr/bin/whoami}Jul 10, 2015 12:58:01 AM qty.aws.lambda.ApplicationExecutor <init>
INFO: [/usr/bin/whoami]
RESULT: sbx_user1053
END RequestId: b60ab05d-269e-11e5-a8cd-1d9c095ef12f
REPORT RequestId: b60ab05d-269e-11e5-a8cd-1d9c095ef12f  Duration: 1024.78 ms    Billed Duration: 1100 ms    Memory Size: 512 MB Max Memory Used: 37 MB  
qrtt1 積分 0

忘了寫「檔案權限」,需要在 zip 打包時就設定1 完成,因為上了 lambda 後就只剩 execute 跟 read 二種權限在工作目錄,沒法跑 chmod

kaif 積分 0

不怕vendor lock in?

qrtt1 積分 0 編輯於

也沒什好 lock 的,就只是實作 1 個 interface,或不實作 1 個 interface 被呼叫。跟自己開機器放 code 聽 queue 差不多啊。只是要注意 timeout 這就比較麻煩一些 xd