AWS攻略——使用CodeBuild进行自动化构建和部署Lambda(Python)
? ? ? ? Aws Lambda是Amazon推出的“無服務(wù)架構(gòu)”服務(wù)。我們只需要簡單的上傳代碼,做些簡單的配置,便可以使用。而且它是按運行時間收費,這對于低頻訪問的服務(wù)來說很劃算。具體的介紹可以常見aws lambda的官網(wǎng)。(轉(zhuǎn)載請指明出于breaksoftware的csdn博客)
? ? ? ? 比較正統(tǒng)的方法是使用Aws CloudFormation方案,但是鑒于這個方案過于復(fù)雜,所以我們還是借助CloudBuild的自定義命令來解決。
? ? ? ? 本文適用于熟悉在Aws Lambda人工部署python代碼,而不熟悉自動化部署的同學(xué)。
創(chuàng)建Lambda函數(shù)??
? ? ? ? 因為我們只是涉及“部署”,所以我們需要先手工在us-east-1(我們的生產(chǎn)環(huán)境)上創(chuàng)建一個Lambda函數(shù)。
? ? ? ? 我們選用python3.7,函數(shù)名為jobs_manager
? ? ? ? 最后記得將入口函數(shù)的路徑和函數(shù)名給指定正確。
創(chuàng)建S3存儲桶
? ? ? ? 我們做python開發(fā)時,往往需要引入其他第三方庫。Aws Lambda讓我們通過配置函數(shù)的“層”(layer)來配置這些引入。如果是手工部署,我們需要把這些庫壓縮到python.zip的文件中,然后在Lambda層中創(chuàng)建一個層并上傳,最后在函數(shù)設(shè)置中引入。
? ? ? ? 當(dāng)我們使用自動化部署方案時,我們可以將壓縮的層文件保存到S3中,然后配置給對應(yīng)函數(shù)。這樣我們就需要新建一個存儲桶。
? ? ? ? 給桶的名字取名規(guī)則是:“區(qū)域”-layers-of-lambda。因為我們將“生產(chǎn)”和“測試”環(huán)境部署在不同的區(qū)域中,所以可以通過配置不同的區(qū)域來對同一套代碼進行分區(qū)部署。(具體看之后介紹的buildspec.yml和CodeBuild設(shè)置)
創(chuàng)建CodeBuild工程
? ? ? ? 創(chuàng)建過程和《AWS攻略——使用CodeBuild進行自動化構(gòu)建和部署靜態(tài)網(wǎng)頁》類似,同樣需要設(shè)置下環(huán)境變量REGION的值為us-east-1,這樣之后的buildspec.yml將可以使用到該值做“生產(chǎn)”和“測試”環(huán)境區(qū)分。
? ? ? ? 同時記下角色名
修改IAM
? ? ? ? 在IAM中找到上步的角色名稱,修改其策略。
? ? ? ? 為簡單起見,我們給與S3所有資源的所有權(quán)限。(不嚴(yán)謹(jǐn))
? ? ? ? 還要新增lambda權(quán)限,也是所有資源所有權(quán)限。(不嚴(yán)謹(jǐn))
創(chuàng)建Buildspec.yml文件
? ? ? ? 該文件放置在項目(我們的項目名叫apollo)的根目錄下。
version: 0.2phases:install:runtime-versions:python: 3.7commands:- pip install --upgrade pip- pip install --upgrade awsclipre_build:commands:build:commands:- pip install -r requirements.txt -t ./python- zip layer_apollo.zip -r python/- aws s3 cp layer_apollo.zip --region $REGION s3://$REGION-layers-of-lambda/layer_apollo.zip- layer_version=$(aws lambda publish-layer-version --region $REGION --layer-name apollo --description "apollo layer" --license-info "MIT" --content S3Bucket=$REGION-layers-of-lambda,S3Key=layer_apollo.zip --compatible-runtimes python3.7 | jq '.LayerVersionArn' | sed 's/\"//g')- echo $layer_version- update_jobs_manager_layer_cmd='aws lambda update-function-configuration --region '$REGION' --function-name jobs_manager --layers '$layer_version- echo $update_jobs_manager_layer_cmd- $update_jobs_manager_layer_cmd- zip apollo.zip -r aws/ conf/ jobs_manager/ kvdb/ modules/ rollback_sqs/ proto/ services/ sqs/ utils/ - aws lambda --region $REGION update-function-code --function-name jobs_manager --zip-file fileb://apollo.zip
? ? ? ? 第6行指明我們需要使用python3.7的環(huán)境。
? ? ? ? 第8,9行,讓構(gòu)建環(huán)境先更新pip和aws的工具awscli。
? ? ? ? 第16行,我們將項目依賴都裝到構(gòu)建環(huán)境的python目錄下。requestments.txt是通過下面指令生成的,但是需要手工剔除包含版本是0.0.0的庫,否則之后部署會報錯。
pip freeze >requestments.txt
? ? ? ? 第17,18行將依賴打包并上傳到之前步驟創(chuàng)建的S3上。
? ? ? ? 第19行將S3上的依賴包發(fā)布到lambda的層上,并獲取期版本號。
? ? ? ? 第22~24將更新lambda函數(shù)層的版本號。
? ? ? ? 第26,27行將項目打包并更新到lambda函數(shù)中。
構(gòu)建
? ? ? ? 進入之前創(chuàng)建的apollo_online的構(gòu)建項目中,然后點擊“構(gòu)建”
總結(jié)
以上是生活随笔為你收集整理的AWS攻略——使用CodeBuild进行自动化构建和部署Lambda(Python)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AWS攻略——使用CodeBuild进行
- 下一篇: 谈一次单元测试驱动代码重构