興奮:AWS Lambda 支持容器鏡像初體驗

2021-12-20 求索雲途

看完費老師 2020 在線開發者大會 reinvent 的《在雲端運行你的Tiny ML 推理》主題演講,才發現自己又被推入了絕望深淵(太多令人興奮的內容)尤其是函數計算 AWS Lambda 的發展,今年發布的一系列新特性,包括 AWS Lambda 支持自定義容器鏡像,更多的資源支持,完整的開發語言和官方容器環境等等,我感覺函數計算從早期採用,逐漸走向成熟,必定會成為雲原生應用的一個潮流。

這幾天一直動手體驗 Tiny ML 的代碼(https://github.com/lianghong/reinvent2020),發現遇到最大的坑是 OpenCV 的編譯,比如指定 Python3.8,C++11,去除掉一些不必要的模塊等等,這方面後續會繼續整理成在 AWS EC2 Amazon Linux2 環境中如何編譯 OpenCV 4.5版本公布在 Github 上;

OpenCV 的正面人臉識別是費老師這個視頻的第一個示例,同時是學習 AWS Lambda 的很好的教程,先看看最後的效果,基於原來的代碼(最右側是費老師的圖片例子),我進一步添加了眼睛識別,基於 HAAR 特徵的 Cascade 分類器對於側臉效果一般:

以前寫 Lambda 函數最麻煩的就是調試和測試問題,利用這次新發布的對自定義容器鏡像的支持,發現在本地利用容器進行測試對於熟悉雲原生應用開發的同學來說,太方便了,見下圖,常見的 Lambda 項目是需要把主程序和依賴的包放在一個文件夾,opencv 用起來很簡單,但依賴不少其它庫。

- 1 -打包、部署和運行三部曲

正如費老師所演示的,通常的習慣是把 AWS Lambda 程序打成一個 ZIP 包,然後部署到 AWS 平臺,再進行調用,利用費老師的腳步,大家可以非常容易提高自己的效率,但假如你的代碼非常順利執行,這個方式大家還可以接受,但通常寫一段代碼需要相應的測試,尤其稍微複雜的場景實現,有沒有本地測試的辦法?

原本的方法,是利用 AWS Toolkit + SAM CLI + 本地 Lambda Docker 模擬環境,老實說,想想頭就有點大,沒想到今年的 reinvent 就給了一個非常大的驚喜,直接支持自定義容器鏡像!

$ ./zipfile.sh
$ ./deploy.sh
$ ./invoke.sh

Execution time was 3355973833 nanoseconds.
Execution time was 3355 milliseconds.
Execution time was 3.355 seconds.
{
"statusCode": 200,
"body": {
"message": "Find 7 face(s),image saved to s3://jxlabs/ml/opencv/vollyballcn.jpg_rs.jpg"
},
"headers": {
"Content-Type": "application/json"
}
}
Done.

- 2 -Lambda 支持容器鏡像

這是什麼概念呢?就是開發者可以直接把 Lambda 應用打包成容器,直接部署到 AWS Lambda 環境。

開發者可以從哪裡開始呢?簡單可以直接使用官方Lambda 鏡像,AWS 通過公開鏡像網站 https://gallery.ecr.aws/ 提供了支持 Python, Node.js, Java, .NET, Go, Ruby 基礎鏡像;當然你也可以基於自身的需求定製兼容 Lambda Runtime API 「黃金容器鏡像」;

AWS 開源了一系列的 Runtime Interface Clients (RIC) 的實現,比如 Python 版本的實現,如何使用見文末的參考資料:

https://github.com/aws/aws-lambda-python-runtime-interface-client

同時,AWS 還開源了一個 AWS Lambda Runtime Interface Emulator,該模擬器提供了一個 HTTP/S 的代理接口,允許用戶在本地利用容器來測試 Lambda 代碼。

比如前面的 OpenCV 的例子,我們首先引用官方 Python3.8的基礎鏡像,定義如下大家都熟悉的 Dockerfile:

FROM public.ecr.aws/lambda/python:3.8

COPY ./opencv_project ${LAMBDA_TASK_ROOT}
RUN ls ${LAMBDA_TASK_ROOT}

CMD [ "app.lambda_handler" ]

本地構建該容器鏡像,並在一個 Terminal 中啟動該鏡像,這個案例中,需要提供兩個 Lambda 環境變量,在 docker run 命令中直接設定 S3 的桶名和對象鍵值:

$ docker build -t lopencv .

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lopencv latest 24f55d9e6f7e 7 seconds ago 712MB
public.ecr.aws/lambda/python 3.8 80e51cc8a434 3 days ago 594MB

$ docker run -p 9000:8080 -e "BUCKET_NAME=jxlabs" -e "S3_KEY=ml/opencv/vollyballcn.jpg" lopencv
time="2020-12-13T13:18:55.011" level=info msg="exec '/var/runtime/bootstrap' (cwd=/var/task, handler=)"

接下來就可以進行 Lambda 函數的本地測試了,通過 CURL 命令傳入所需要的事件 JSON 數據(本案例不需要,演示用):

$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'

{"statusCode": 200, "body": {"message": "Find 7 face(s),image saved to s3://jxlabs/ml/opencv/vollyballcn.jpg_rs.jpg"}, "headers": {"Content-Type": "application/json"}}

完美!!!

- 3 -總結

DevOps 中的開發者特別討厭 Ops 中所涉及複雜的 PaaS 環境,比如 K8S,平時我們為了演示一個彈性伸縮,花了很多時間在構建平臺、網絡、訪問以及安全等方面,而無伺服器的興起,把這些複雜工作(運行時)交給平臺,而開發者更能聚焦業務代碼本身,AWS Lambda 函數計算是無伺服器生態的領路者,打通和容器雲原生技術的融合,為企業在採用無伺服器計算的道路上又清除了一個障礙。

參考資料

New for AWS Lambda – Container Image Support

費老師-在雲端運行你的Tiny ML 推理

費老師-在雲端運行你的Tiny ML 推理(代碼)

Jump-starting your serverless development environment

python-lambda-local

申明

本站點所有文章,僅代表個人想法,不代表任何公司立場,所有數據都來自公開資料,如有不妥的圖片或內容請公眾號「聯繫作者」

轉載請註明出處

相關焦點

  • 談談AWS Lambda和serverless architecture
    最近半年來,隨著AWS的各線服務都開始支持lambda,serverless architecture便漸漸成為一個火熱的話題。lambdlambda是amzon推出的一個受控的運行環境,起初僅僅支持nodejs(之後添加了java/python的支持)。你可以寫一段nodejs的代碼,為其創建一個lambda資源,這樣,當指定的事件來臨的時候,aws的運行時會創建你的運行環境,執行你的代碼,執行完畢(或者timeout)後,回收一切資源。
  • Serverless|Framework——圖文玩轉 AWS Lambda
    接下來我們就用 Lambda 實現經典的分布式訂單服務案例訂單服務 Demo為了增強用戶使用體驗,或者為了提升程序吞吐量,亦或是為了架構設計程序解耦SF 不但簡化了 AWS 原生 CFT 的編寫,還簡化了跨雲服務的定義,就好比設計模式當中的 Facade,在上面建立了一層門面,隱藏了底部不同服務的細節,降低了跨雲並用雲的門檻,目前支持的雲服務有下面這些
  • AWS執行長Andy Jassy介紹AWS容器生態系統
    繼Microsoft Azure和Google Cloud Platform之後,Amazon Web Services今天也開始提供了大家期待已久的,支持雲原生基礎設施的開源容器編排引擎下面是一些綱要內容:Amazon Elastic Container Service for Kubernetes (EKS):該服務將會運行Kubernetes的上遊版本,目前允許用戶使用所有的Kubernetes插件以及支持工具,同時允許用戶可以輕鬆的在AWS,其它雲提供商以及自有數據中心中遷移容器。
  • AWS ECS Fargate容器調試
    本文利用「創建ECS Fargate」中創建的Fargate集群,先創建一對RSA KEY,然後以httpd官方鏡像為基礎增加openssl軟體,最後在創建Fargate task時通過環境變量引入Public key。這樣在task運行後就可以通過ssh登錄進入容器內部進行調試。
  • 使用 AWS Lambda 隱藏 C&C 流量
    Lambda 還支持多種語言的開發,從 Python 和 NodeJS 到最近大火的 Go 語言,AWS Lambda 都支持,本文採用 Go 進行解釋。為了進一步提高便利性,使用 Serverless 框架提高效率。Serverless - AWS LambdaAWS Lambda 普及程度越來越高,這項技術的實用性已經被廣泛證實。
  • 西雲專欄 | 如何用 AWS Lambda 實現金絲雀部署?
    (Lambda 的代碼修改和配置修改都需要保存後生效)配置 Lambda 函數的層,添加 jinja2 支持。AWS 的 Code Deploy 可以對 Lambda 函數進行版本的管理,目前該功能 AWS 中國區域還不支持。
  • 宣布支持AWS Fargate的AWS Graviton2–為您的無伺服器容器提供優化達40%的性價比
    與在基於x86的實例上運行AWS Lambda函數相比,由AWS Graviton2支持的AWS Lambda函數提供了優化達19%的性能和低20%的成本。今天,我很高興地宣布AWS Graviton2通過亞馬遜彈性容器服務(Amazon ECS)支持AWS Fargate。AWS Fargate是AWS上容器的無伺服器計算引擎,無需配置、擴展和管理伺服器。
  • 容器化 | .NET 4.x on Docker 體驗(1)
    我們都知道.NET Core應用可以跑在Docker上,那.NET Framework 4.x應用呢?
  • 容器技術之容器鏡像篇
    This specification defines an OCI Image, consisting of a manifest, an image index (optional), a set of filesystem layers, and a configuration.
  • Amazon Lambda 現在支持包裝格式的容器映像
    客戶可以通過使用一組適用於 Lambda 的Amazon Web Services 基本映像,或者使用其首選社區或企業映像之一,開始將函數構建為容器映像。您可以使用自己熟悉的容器開發工具(如 Docker CLI)在本地構建和測試基於 Lambda 的應用程式,並將容器映像推送到 Amazon ECR(完全託管的容器註冊表)。
  • AWS容器雲原生三大發布,不只是Game Changer
    接下來,對於容器方面的三大發布做逐一的介紹。ECR Public——Docker Hub的免費替代品2020年11月,Docker Hub對於免費用戶的容器拉取用量做了一些限制,匿名和免費註冊用戶每六個小時最多能發出100和200個容器鏡像拉取請求,想要繼續享受無限制的使用,則需要付費訂閱,費用為每人 5 美元/月,相當於一個入門級VPS的費用。
  • AWS 容器三大新品:K8s 發行版,免費鏡像庫和 「Game Changer」AWS Proton
    ECR Public——Docker Hub 的免費替代品2020 年 11 月,Docker Hub 對於免費用戶的容器拉取用量做了一些限制,匿名和免費註冊用戶每六個小時最多能發出 100 和 200 個容器鏡像拉取請求,想要繼續享受無限制的使用,則需要付費訂閱,費用為每人 5 美元/月,相當於一個入門級 vps 的費用。
  • AWS CDK 利用asset編譯Docker鏡像並部署到ECS Fargate (Python)
    安裝配置 Docker DesktopDocker Desktop 是安裝在 Windows 中的 docker 環境,之前僅支持 Win cmd 和 PowerShell。在微軟推出完全 linux 內核的 WLS2 之後,新版本的 Docker Desktop 支持 WLS2 直接運行 linux 鏡像。所以用戶可以放棄 Win cmd 和 PowerShell,直接使用 WLS2 來完成所有工作。
  • AWS reinvent 2016:Primitives not framework
    之前 aws 對於運維的支持主要體現在各種產品,從計算到存儲到資料庫到消息隊列等等的 scaling 上,幾乎所有的工具都具備 internet scale 的能力。然而,由於其它運維工具的缺失,用戶不得不採用第三方的工具:監控使用 new relic / datadog / ...,構建使用 travis / codeship / ...
  • AWS發布SageMaker:省略數據清洗、建模、調參等步驟
    在短短兩小時內,Andy 宣布了一系列令人興奮的新服務。其中最重要的包括一款售價 249 美元的、名為 DeepLens 的人工智慧攝像機;一套用於開放並部署機器學習算法的 SageMaker 平臺;外加實時視頻識別、文字翻譯等多項應用層服務。
  • 什麼是容器鏡像?
    你可以通過提供一組特殊格式的指令來創建容器鏡像,這些指令可以提交到註冊表或Dockerfile。這裡的想法是,如果你有多個具有相同數據的鏡像,不是將這些數據重新複製,而是將通過使用稱為層的東西共享。每一層都是一個可以跨多個容器共享的文件系統,例如,httpd基本層是官方Apache鏡像,可以跨任意數量的容器使用。想像一下,我們剛剛節省了多少磁碟空間,因為所有的容器都使用相同的底層。
  • 基於Dockerfile構建容器鏡像的最佳實踐
    4.1 設置字符集4.2 時區校正4.3 進程管理4.4 降權啟動4.5 底層庫依賴5、小結1、背景概述容器鏡像是容器化落地轉型的第一步,總結幾點需要做鏡像優化的原因隨著應用容器化部署的大規模遷移以及版本迭代的加快
  • AWS Lambda 漫談
    那麼一個Task或者一個Micro-Service,即便足夠小,維護EC2/Docker Container仍然會存在浪費。從SLA/SLO的角度,我們往往會為任務所需要的資源留有buffer,這必然會帶來浪費。即使是充分優化的任務和機器配置,仍然會存在資源閒置的情況。
  • 讓鏡像漏洞無處藏身,Google推出容器鏡像掃描功能
    當容器技術已普遍落地在各大公有雲服務後,安全性也成為企業能否導入正式環境的關鍵點。
  • Docker安裝基本命令操作,帶你了解鏡像和容器的概念!
    點擊下方連結查看上一篇docker介紹原文一、Docker安裝聲明:Docker支持Centos 6及以後的版本。1.設置隨系統啟動[root@VM-0-3-centos /]# sudo chkconfig docker on6. docker初體驗輸入:docker run hello-world (進入docker世界)