AWS Lambda 調用其他 Lambda

tags: Serverless Lambda
category: AWS
description: AWS Lambda 調用其他 Lambda
created_at: 2021/07/18 21:00:00

cover image

事前準備

  • 首先你要有個 AWS 帳號
  • 會任何一種 aws lambda 支援的程式語言(?)

QA

Q: 為什麼不直接寫在一包 Lambda Function

A: 東西多容易亂,不好測試,函數的功能越單純越好(?),在讓一個主要的函數去 Call 各別的功能整合起來

Q: 那怎麼不用上一篇提到的 ECR 在自己習慣的 IDE 都弄好包一包丟上去

A: 如果有照著跑應該會發現每次一改 Push 上去都超久,如果切成單一功能上去好的就不用再改,省下很多時間


前言

這篇文假設

  • 會使用基本 IAM 操作
  • 你也已經會使用 Lambda 的基本操作 & 測試,所以首先先建立兩個 Lambda ,一個負責 Invoke 另一個 Lambda

首先我們要在你要有能力去 Invoke 其他 Lambda 的那個執行角色上加入政策(Policy)。

而那個政策(Policy)預設不存在,要自己建立,可以在建立的地方選 JSON 然後填入以下內容

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": "*"
        }
    ]
}

主要就是可以讓 lambdainvoke function,的政策(Policy),建立好之後把他掛到你的 lambda 執行角色上


之後回到你要呼叫別的 lambdalambda 上,最基本的用法如下

client = boto3.client('lambda')
response = client.invoke(
    FunctionName="arn:aws:lambda:xxxx",  # 你要 invoke 的 lambda arn
    InvocationType="RequestResponse",    # 還有其他可以參考官方文件,例如非同步
    Payload=json.dumps({"test":1, "aaa": "aaa"}) # 要送過去的資料
)
responsePayload = response['Payload'].read().decode()  # 取得回傳的資料
responseJson = json.loads(responsePayload)             # 轉換為 json
return responseJson

提示: Payload 送什麼,另一個 lambdaevent 就會是什麼


上面那段冗長,所以你可以把他包成函數,假設丟進 arn + payload ,就回傳給你 json 結果,就會變得很方便,還可以統一做錯誤處理。


偷懶完畢,希望文字描述看得懂




最後更新時間: 2021年07月18日.