跑来跑去:假人与AWS Lambda的第一次接触
一切始于埃及人在一個木框上滑動幾塊大理石以簡單的算術使其大腦放松。 或許是希臘人發(fā)明了Antikythera機制來追蹤行星的運動至每千年2度的精度 。 無論哪種方式,計算都已經走了很長一段路:查爾斯·巴貝奇的分析引擎 ,艾倫·圖靈的Enigma-breaker , 將人送上月球的美國國家航空航天局的袖珍計算器 ,深藍擊敗國際象棋大師加里·卡斯帕羅夫( Garry Kasparov)。 與此相應,軟件應用程序范例也發(fā)生了巨大變化:從無(基于純硬件的編程),整體式,模塊化,SOA,云到現在無服務器。
此時,“無服務器”通常表示FaaS(功能即服務); 從流行度和采用角度來看,FaaS和字面意思是AWS Lambda 。 因此,聲稱無服務器開發(fā)的普及與lambda的易用性成正比并不夸張。
好吧,lambda 自2015年以來就已經存在,已經集成到許多AWS生態(tài)系統中,并且已有數百(即使不是數千)公司在生產中使用。 所以lambda應該非常直觀且易于使用,對嗎?
好吧,至少在我看來,這似乎不是。 我的案例是AWS的官方示例之一,我不太確定lambda是否足夠友好,足以讓新手了解圖片。
首先,我想實現AWS自己的縮略圖創(chuàng)建用例, 而不遵循他們自己的指南 ,以了解我能走多遠。
作為程序員,我自然而然地開始使用Lambda管理控制臺 。 該代碼已經由慷慨的AWS專家編寫 ,那么為什么要重新發(fā)明輪子呢? 復制,粘貼,保存,運行。 da!
嗯,看來我需要長大一點。
坦率地說, “創(chuàng)建功能”向導非常醒目。 有這么多現成的藍圖。 太遺憾了,它還沒有S3縮略圖生成示例,或者這個故事可能就在這里結束!
因此,我只是使用了一個名為s3-thumbnail-generator的好名字,選擇了“從頭開始創(chuàng)作”選項。
哦,等等,這是什么“角色”? 這也是必需的。 幸運的是,它具有“從模板創(chuàng)建新角色”選項,這可以節(jié)省我的時間。 (我在“選擇現有角色”下沒有任何選擇,而且我還太年輕,無法“創(chuàng)建自定義角色”。)
別緊張。 “角色名稱”: s3-thumbnail-generator-role 。 但是“政策模板”呢?
也許我應該找到與S3有關的東西,因為我的Lambda是全S3。
驚喜! 當我搜索S3時,唯一得到的是“ S3對象只讀權限”。 沒有其他選擇,我只是搶奪了它。 讓我們看看我能跌倒多遠!
是時候點擊“創(chuàng)建功能”了。
哇,他們的Lambda設計師真的很棒!
“恭喜! 您的Lambda函數“ s3-thumbnail-generator”已成功創(chuàng)建。 現在,您可以更改其代碼和配置。 準備測試功能時,單擊“測試”按鈕以輸入測試事件。”
好的,我該執(zhí)行復制粘貼任務了。 樣本源代碼上的“復制”,lambda代碼編輯器上的Ctrl + A和Ctrl + V。 簡單!
全部為綠色(無紅色)。 很高興知道。
“保存”和“測試”。
哦,我應該知道得更好。 是的,如果我要“測試”,則需要“測試輸入”。 明顯。
我知道測試我的全新lambda并不那么容易,但是我并不希望必須手動將JSON系列化事件組合在一起。 值得慶幸的是,他們在這里也做得很好,提供了現成的“ S3 Put”事件模板。 那我還要選擇什么呢? :)
不出所料,第一次運行失敗:
{"errorMessage": "Cannot find module 'async'","errorType": "Error","stackTrace": ["Function.Module._load (module.js:417:25)","Module.require (module.js:497:17)","require (internal/module.js:20:19)","Object. (/var/task/index.js:2:13)","Module._compile (module.js:570:32)","Object.Module._extensions..js (module.js:579:10)","Module.load (module.js:487:32)","tryModuleLoad (module.js:446:12)","Function.Module._load (module.js:438:3)"] }該死的,我應該注意到那些require線。 無論哪種方式都不好,因為我復制示例代碼的頁面上有一個很大的標題“創(chuàng)建Lambda 部署程序包 ”,并且清楚地說明了如何將示例捆綁到可Lambda部署的zip中。
因此,我創(chuàng)建了一個包含我的代碼和package.json的本地目錄,并運行了npm install (好東西,我已經預安裝了node和npm !)。 構建,壓縮和上載該應用程序非常容易,希望我不必經歷數不勝數的工作,這樣的周期就可以使我的lambda正常工作。
(順便說一句,我希望我可以在他們的內置編輯器中完成此操作;很遺憾,我無法找到添加依賴項的方法。)
無論如何,我第二次考試的時機已經成熟。
{"errorMessage": "Cannot find module '/var/task/index'","errorType": "Error","stackTrace": ["Function.Module._load (module.js:417:25)","Module.require (module.js:497:17)","require (internal/module.js:20:19)"] }index ? 那個是從哪里來的?
等等...我的壞,我的壞。
似乎Handler參數仍然保留默認值index.handler 。 就我而言,它應該是CreateThumbnail.handler ( filename.method )。
讓我們再試一次。
認真嗎 沒門!
是的。 日志不會說謊。
2018-02-04T17:00:37.060Z ea9f8010-09cc-11e8-b91c-53f9f669b596Unable to resize sourcebucket/HappyFace.jpg and upload tosourcebucketresized/resized-HappyFace.jpg due to an error: AccessDenied: Access Denied END RequestId: ea9f8010-09cc-11e8-b91c-53f9f669b596很公平; 我沒有sourcebucket或sourcebucketresized ,但可能其他人有。 因此,拒絕訪問。 說得通。
因此,我創(chuàng)建了自己的存儲桶s3-thumb-input和s3-thumb-inputresized ,編輯了事件輸入(由于“ Configure test event”下拉菜單),然后再次嘗試。
2018-02-04T17:06:26.698Z bbf940c2-09cd-11e8-b0c7-f750301eb569Unable to resize s3-thumb-input/HappyFace.jpg and upload tos3-thumb-inputresized/resized-HappyFace.jpg due to an error: AccessDenied: Access Denied拒絕訪問? 再次?
幸運的是,基于事件輸入,我發(fā)現403實際上指示404(未找到)錯誤,因為我的存儲桶中并未真正包含HappyFace.jpg文件。
親愛的讀者,請稍等,我急忙前往S3控制臺并將開心的表情上傳到新的存儲桶中。 等一下!
好的,準備下一次測試。
2018-02-04T17:12:53.028Z a2420a1c-09ce-11e8-9506-d10b864e6462Unable to resize s3-thumb-input/HappyFace.jpg and upload tos3-thumb-inputresized/resized-HappyFace.jpg due to an error: AccessDenied: Access Denied完全一樣的錯誤? 再次? 來吧!
對我來說這沒有意義; 為什么在地球上,我自己的lambda將在我自己的AWS帳戶中運行,而無法訪問我自己的S3存儲桶?
等等,這可能與那個執(zhí)行角色有關嗎? 我在哪里盲目分配了S3 只讀權限?
稍作谷歌搜索后,我得到了針對lambda的非常全面的AWS IAM文檔 ,在其中我了解到lambda是在其自己的IAM角色下執(zhí)行的; 而且我必須根據要使用的AWS服務手動配置角色。 更糟糕的是,為了配置角色,我必須一直走到IAM管理控制臺 (幸運的是,該控制臺已經從執(zhí)行角色下拉列表中鏈接了,更重要的是在新選項卡中打開)。
雙手合十,直到加載自定義角色頁面。
哦,不……更多JSON編輯嗎?
在原始指南中,AWS伙計們似乎也釘上了執(zhí)行角色部分 ,但是奇怪的是,那里沒有提到S3(名稱除外)。 他們錯過了什么嗎?
好的,這是歷史上第一次,我將創(chuàng)建自己的IAM角色!
保佑那些AWS工程師,一個快速的Google搜索顯示了他們的策略生成器寶珠。 就是我需要的東西。
但是,擺脫JSON語法只能解決一小部分問題。 我怎么知道我需要哪些權限?
Google,哥們? 有什么事嗎
哦…回到AWS文檔中? 大…
好吧,這還不錯,這要感謝S3權限指南 。 盡管有點讓人不知所措,但我猜想我需要的是“對象操作”的某些權限,而且幸運的是,該文檔有一張漂亮的桌子,暗示我需要s3:GetObject和s3:PutObject (與s3.getObject(...)和s3.putObject(...)調用)。
經過一番思考,我最終在我的存儲桶上獲得了具有上述權限的“ IAM策略”(以乏味的語法arn:aws:s3:::s3-thumb-input命名):
{"Version": "2012-10-17","Statement": [{"Sid": "Stmt1517766308321","Action": ["s3:PutObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-inputresized"},{"Sid": "Stmt1517766328849","Action": ["s3:GetObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-input"}] }并將其粘貼并保存到IAM角色編輯器中(這自動將我?guī)Щ氐絣ambda控制臺頁面;太好了!)
再試一次:
同樣的錯誤?
回顧S3權限文檔,我注意到對象權限似乎在資源名稱下包含一個星號( /*后綴,可能表示文件)。 因此,我們也嘗試使用新的自定義策略:
{"Version": "2012-10-17","Statement": [{"Sid": "Stmt1517766308321","Action": ["s3:PutObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-inputresized/*"},{"Sid": "Stmt1517766328849","Action": ["s3:GetObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-input/*"}] }再次(開始感覺像Whiplash ):
2018-02-04T17:53:45.484Z 57ce3a71-09d4-11e8-a2c5-a30ce229e8b7Successfully resized s3-thumb-input/HappyFace.jpg and uploaded tos3-thumb-inputresized/resized-HappyFace.jpg嗚嗚!
并且,不管您信不信,一個resized-HappyFace.jpg文件剛剛出現在我的s3-thumb-inputresized存儲桶中; 是的
現在,當我將文件放入存儲桶時,如何配置lambda自動運行?
值得慶幸的是,lambda控制臺(具有直觀的“觸發(fā)功能允許”布局)使我清楚地知道我想要的是S3觸發(fā)器。 因此,我添加了一個,將“創(chuàng)建的對象(所有)”作為“事件類型”,將“ jpg”作為后綴,保存所有內容,然后立即將JPG文件拖放到我的存儲桶中。
是的,就像魅力一樣。
要查看整個過程花費了多長時間(在實際執(zhí)行中,而不是在“測試”中),我單擊了(上一個)執(zhí)行結果窗格上的“日志”鏈接,然后進入那里顯示的最新“日志流”; 沒有!
更令人懷疑的是,盡管我已經超過了這一點,甚至實現了成功的調整大小,但最新日志流中的最后一個日志是“訪問被拒絕”日志。 也許我最近的更改打破了lambda的記錄功能?
多虧了Google和StackOverflow ,我發(fā)現我的執(zhí)行角色也需要包含一些與日志記錄相關的權限; 確實,現在我記得當我開始創(chuàng)建自定義角色時,權限編輯器文本框中有一些權限,并且我再一次無知地將我的S3策略粘貼在它們上面。
另一輪政策編輯:
{"Version": "2012-10-17","Statement": [{"Sid": "Stmt1517766308321","Action": ["s3:PutObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-inputresized/*"},{"Sid": "Stmt1517766328849","Action": ["s3:GetObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-input/*"},{"Action": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Effect": "Allow","Resource": "arn:aws:logs:*:*:*"}] }另一個文件刪除了,這次調整大小和日志都完美地工作了……最后!
既然一切都理順了,我的縮略圖正在目標存儲桶中等待,我啟動了瀏覽器,輸入http://s3-thumb-inputresized.s3.amazonaws.com/resized-HappyFace.jpg (根據S3虛擬主機docs ),然后按Enter鍵,期望返回一個漂亮的縮略圖。
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>C8BAC3D4EADFF577</RequestId><HostId>PRnGbZ2olpLi2eJ5cYCy0Wqliqq5j1OHGYvj/HPmWqnBBWn5EMrfwSIrf2Y1LGfDT/7fgRjl5Io=</HostId> </Error>已經厭倦了“ AccessDenied”消息!
顯然,盡管我的代碼生成了文件,但它并未使文件可公開訪問(但是私有縮略圖有什么用,是吧?)
深入研究AWS文檔,我很快發(fā)現了putObject操作的ACL參數,該參數允許S3上傳的文件公開。 希望這能解決地球上的所有問題,我Swift升級了代碼,將文件的ACL設置為public-read :
s3.putObject({Bucket: dstBucket,Key: dstKey,Body: data,ContentType: contentType,ACL: 'public-read'},next);}保存函數,然后單擊“測試”:
2018-02-04T18:06:40.271Z 12e44f61-19fe-11e8-92e1-3f4fff4227faUnable to resize s3-thumb-input/HappyFace.jpg and upload tos3-thumb-inputresized/resized-HappyFace.jpg due to an error: AccessDenied: Access Denied再次?? 你在跟我開玩笑嗎?!
幸運的是,這一次我足夠了解S3權限指南 ,該指南立即顯示我還需要在策略中擁有s3:PutObjectAcl權限,才能在我的putObject調用中使用ACL參數。 因此,再次往返于策略編輯器,IAM儀表板和lambda控制臺。
2018-02-04T18:15:09.670Z 1d8dd7b0-19ff-11e8-afc0-138b93af2c40Successfully resized s3-thumb-input/HappyFace.jpg and uploaded tos3-thumb-inputresized/resized-HappyFace.jpg這次,令我非常滿意的是,當我將托管URL http://s3-thumb-inputresized.s3.amazonaws.com/resized-HappyFace.jpg放入瀏覽器時,瀏覽器高興地向我展示了我的笑臉縮略圖。
總而言之,我很滿意自己能夠通過將所有分散的零件放在一起來最終解決這個難題。 但是我不禁想像一下,如果我可以自由樣式地構建lambda,而AWS獨自負責角色,權限和其他方面的工作,而又不讓我在區(qū)塊中四處奔走,那將會有多酷。
也許我應該從一開始就遵循該官方指南……但是,再一次,naaah :)
翻譯自: https://www.javacodegeeks.com/2018/02/running-around-block-dummys-first-encounter-aws-lambda.html
總結
以上是生活随笔為你收集整理的跑来跑去:假人与AWS Lambda的第一次接触的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Spring Session和JDB
- 下一篇: d3dx9_30.dll如何修复