在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。
現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的不同環境代碼。
首先,我們在目標lambda console開發,開發好了以後,點選右上方的發布新版本:
接著我們新建別名,別名會綁定指定的lambda版本,這邊我們將別名取為stage名稱:
之後如果code有改(包含升級lambda有使用的layer版本),我們就會再發布新版本,並到別名的地方更新版本:
我們等等會繼續回來設定lambda的權限,這邊先設定lambda的trigger: api gateway。
接著我們來設定api gateway:
首先我們會去不同的stage來去設定Stage變數:
接著我們按照一般API開發流程,新增resource:
接下來要特別注意了,我們要將這個api的呼叫能夠動態根據api gateway stage來去做不同的lambda別名呼叫。
這邊我們利用stage變數,會應用在lambda的綁定上:
在Lambda function的地方,我們先搜尋要綁定的lambda,接著再做後加上:${stageVariables.lambdaAlias}
這邊有兩種做法,第一種是用aws cli(請確保你已經設定好),這種方式最快,因為只需要把aws跳出來給你的指令稍作修改就好:
直接複製黃色區塊的指令,把--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的每個別名分別設定一次:
我們將剛才在api gateway設定時aws請我們設定的權限命令值填入:
每個別名都依序設定好之後,我們就可以在api gateway那邊先test,如果沒有設定成功,會跳500,說沒有權限,如果test沒問題之後就可以按右上角deploy API到不同的api gateway stage開放他們
這樣就大功告成拉!
目前覺得比較麻煩的地方就是如果layer有改,就還要重新創新版本,更新別名綁定的版本,有點麻煩,不像之前沒有別名的時候只要去layer那邊一鍵把版本xx layer版本1的lambda升級到xx layer版本2就好。