更新於 2024/01/09閱讀時間約 4 分鐘

AWS Lambda切分不同環境

在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。

現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的不同環境代碼。

Lambda設定

基本flow

首先,我們在目標lambda console開發,開發好了以後,點選右上方的發布新版本:

接著我們新建別名,別名會綁定指定的lambda版本,這邊我們將別名取為stage名稱:

之後如果code有改(包含升級lambda有使用的layer版本),我們就會再發布新版本,並到別名的地方更新版本:

編輯別名的lambda版本

選擇別名要用的lambda版本

我們等等會繼續回來設定lambda的權限,這邊先設定lambda的trigger: api gateway。

API Gateway設定

接著我們來設定api gateway:

設定不同stage的api gateway能吃到相應的lambda別名

首先我們會去不同的stage來去設定Stage變數:

到相應的api gateway stage設定stage變數

stage變數新增要對應的lambda別名為何

接著我們按照一般API開發流程,新增resource:

新增api resource

新增api

接下來要特別注意了,我們要將這個api的呼叫能夠動態根據api gateway stage來去做不同的lambda別名呼叫。

這邊我們利用stage變數,會應用在lambda的綁定上:

利用stage變數動態呼叫不同別名的lambda

在Lambda function的地方,我們先搜尋要綁定的lambda,接著再做後加上:${stageVariables.lambdaAlias}


為每個lambda別名設定權限

這邊有兩種做法,第一種是用aws cli(請確保你已經設定好),這種方式最快,因為只需要把aws跳出來給你的指令稍作修改就好:

複製黃色區塊的指令,我們要將lambda冒號後的${stageVariables.lambdaAlias}換成實際上的別名名稱

直接複製黃色區塊的指令,把--function-name裡面的值冒號後替換成該lambda的別名,我們有staging跟production,所以就需要兩組指令。

aws lambda add-permission
--function-name "你的lambda arn:staging"
--source-arn "這會是這個api的arn"
--principal apigateway.amazonaws.com
--statement-id 這是aws生成給我們的辨識碼
--action lambda:InvokeFunction這是權限名稱
aws lambda add-permission
--function-name "你的lambda arn:production"
--source-arn "這會是這個api的arn"
--principal apigateway.amazonaws.com
--statement-id 這是aws生成給我們的辨識碼
--action lambda:InvokeFunction這是權限名稱


第二種方法是利用aws console的圖形界面設定,要在lambda的每個別名分別設定一次:

分別為每個別名設定lambda權限

接著就會到別名的設定頁面,點選左側權限,再到最下面點選新增權限開始設定

我們將剛才在api gateway設定時aws請我們設定的權限命令值填入:

每個別名都依序設定好之後,我們就可以在api gateway那邊先test,如果沒有設定成功,會跳500,說沒有權限,如果test沒問題之後就可以按右上角deploy API到不同的api gateway stage開放他們

這樣就大功告成拉!


目前覺得比較麻煩的地方就是如果layer有改,就還要重新創新版本,更新別名綁定的版本,有點麻煩,不像之前沒有別名的時候只要去layer那邊一鍵把版本xx layer版本1的lambda升級到xx layer版本2就好。








分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.