將 Lambda 函數匯入為元件 (AWS CLI) - AWS IoT Greengrass

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 Lambda 函數匯入為元件 (AWS CLI)

使用 CreateComponentVersion 操作從 Lambda 函數建立元件。當您呼叫此操作時,請指定 lambdaFunction 以匯入 Lambda 函數。

步驟 1:定義 Lambda 函數組態

  1. 建立名為 的檔案lambda-function-component.json,然後將下列 JSON 物件複製到 檔案。將 取代lambdaArn為要匯入的 Lambda 函數 ARN。

    { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1" } }
    重要

    您必須指定包含要匯入之函數版本的 ARN。您不能使用 $LATEST 之類的版本別名。

  2. (選用) 指定元件的名稱 (componentName)。如果您省略此參數, 會使用 Lambda 函數的名稱 AWS IoT Greengrass 建立元件。

    { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda" } }
  3. (選用) 指定元件的版本 (componentVersion)。如果您省略此參數, 會使用 Lambda 函數的版本 AWS IoT Greengrass 建立元件,做為有效的語意版本。例如,如果您的函數版本為 3,則元件版本會變成 3.0.0

    注意

    您上傳的每個元件版本都必須是唯一的。請確定您上傳正確的元件版本,因為上傳後就無法編輯。

    AWS IoT Greengrass 使用元件的語意版本。語意版本遵循 major.minor.patch 號碼系統。例如,版本1.0.0代表元件的第一個主要版本。如需詳細資訊,請參閱語意版本規格

    { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0" } }
  4. (選用) 指定此 Lambda 函數支援的平台。每個平台都包含識別平台的屬性映射。所有核心裝置都有作業系統 (os) 和架構 () 的屬性architecture。Core AWS IoT Greengrass 軟體可能會新增其他平台屬性。您也可以在將 Greengrass 核元件部署至核心裝置時指定自訂平台屬性。請執行下列操作:

    1. 將平台清單 (componentPlatforms) 新增至 中的 Lambda 函數lambda-function-component.json

      { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ ] } }
    2. 將每個支援的平台新增至清單。每個平台都有一個易於name識別的 和屬性映射。下列範例指定此函數支援執行 Linux 的 x86 裝置。

      { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } }

      您的 lambda-function-component.json可能包含類似下列範例的文件。

      { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ] } }
  5. (選用) 指定 Lambda 函數的元件相依性。當您部署 Lambda 函數元件時,部署會包含這些相依性,以便您的函數執行。

    重要

    若要匯入您建立以在 AWS IoT Greengrass V1 上執行的 Lambda 函數,您必須為函數使用的功能定義個別元件相依性,例如秘密、本機影子和串流管理員。將這些元件定義為硬相依性,以便在相依性變更狀態時重新啟動 Lambda 函數元件。如需詳細資訊,請參閱匯入 V1 Lambda 函數

    請執行下列操作:

    1. 將元件相依性 (componentDependencies) 的映射新增至 中的 Lambda 函數lambda-function-component.json

      { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { } } }
    2. 將每個元件相依性新增至映射。指定元件名稱做為金鑰,並使用下列參數指定物件:

      • versionRequirement – npm 樣式語意版本限制,可識別元件相依性的相容版本。您可以指定單一版本或一系列版本。如需語意版本限制的詳細資訊,請參閱 npm 轉換器計算器

      • dependencyType – (選用) 相依性的類型。請選擇下列項目:

        • SOFT – 如果相依性變更狀態,Lambda 函數元件不會重新啟動。

        • HARD – 如果相依性變更狀態,Lambda 函數元件會重新啟動。

        預設值為 HARD

      下列範例指定此 Lambda 函數取決於串流管理員元件第一個主要版本中的任何版本。當串流管理員重新啟動或更新時,Lambda 函數元件會重新啟動。

      { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }

      您的 lambda-function-component.json可能包含類似下列範例的文件。

      { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } } } }
  6. (選用) 設定 Lambda 函數參數以用來執行函數。您可以設定選項,例如環境變數、訊息事件來源、逾時和容器設定。請執行下列操作:

    1. 將 Lambda 參數物件 (componentLambdaParameters) 新增至 中的 Lambda 函數lambda-function-component.json

      { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { } } }
    2. (選用) 指定 Lambda 函數訂閱工作訊息的事件來源。您可以指定事件來源,以將此函數訂閱本機發佈/訂閱訊息和 AWS IoT Core MQTT 訊息。當 Lambda 函數收到來自事件來源的訊息時,就會呼叫它。

      注意

      若要將此函數訂閱其他 Lambda 函數或元件的訊息,請在部署此 Lambda 函數元件時部署舊版訂閱路由器元件。部署舊版訂閱路由器元件時,請指定 Lambda 函數使用的訂閱。

      請執行下列操作:

      1. 將事件來源清單 (eventSources) 新增至 Lambda 函數參數。

        { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ ] } } }
      2. 將每個事件來源新增至清單。每個事件來源都有下列參數:

        • topic – 要訂閱訊息的主題。

        • type – 事件來源的類型。您可以從以下選項中選擇:

          • PUB_SUB - 訂閱本機發佈/訂閱訊息。

            如果您使用 Greengrass nucleus 2.6.0 版或更新版本,以及 Lambda Manager 2.2.5 版或更新版本,則可以在指定此類型topic時使用 中的 MQTT 主題萬用字元 (+#)。

          • IOT_CORE – 訂閱 AWS IoT Core MQTT 訊息。

            當您指定此類型topic時,您可以在 中使用 MQTT 主題萬用字元 (+#)。

          下列範例會針對符合主題篩選條件hello/world/+的主題訂閱 AWS IoT Core MQTT。

          { "topic": "hello/world/+", "type": "IOT_CORE" }

          您的 看起來lambda-function-component.json可能會類似下列範例。

          { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ { "topic": "hello/world/+", "type": "IOT_CORE" } ] } } }
    3. (選用) 在 Lambda 函數參數物件中指定下列任何參數:

      • environmentVariables – Lambda 函數執行時可用的環境變數映射。

      • execArgs – 執行時要傳遞給 Lambda 函數的引數清單。

      • inputPayloadEncodingType – Lambda 函數支援的承載類型。您可以從以下選項中選擇:

        • json

        • binary

        預設:json

      • pinned – Lambda 函數是否已固定。預設值為 true

        • 固定 (或長期) Lambda 函數會在 AWS IoT Greengrass 啟動時啟動,並在自己的容器中持續執行。

        • 非固定 (或隨需) Lambda 函數只會在接收工作項目時啟動,並在閒置達指定的最長閒置時間後結束。如果函數有多個工作項目,則 AWS IoT Greengrass Core 軟體會建立函數的多個執行個體。

        使用 maxIdleTimeInSeconds設定函數的閒置時間上限。

      • timeoutInSeconds – Lambda 函數在逾時之前可以執行的時間上限,以秒為單位。預設為 3 秒。

      • statusTimeoutInSeconds – Lambda 函數元件將狀態更新傳送至 Lambda 管理員元件的間隔,以秒為單位。此參數僅適用於固定函數。預設值為 60 秒。

      • maxIdleTimeInSeconds – 在 AWS IoT Greengrass 核心軟體停止其程序之前,非固定 Lambda 函數可以閒置的時間上限,以秒為單位。預設值為 60 秒。

      • maxInstancesCount – 非固定 Lambda 函數可同時執行的執行個體數目上限。預設為 100 個執行個體。

      • maxQueueSize – Lambda 函數元件的訊息佇列大小上限。 AWS IoT Greengrass 核心軟體會將訊息存放在 FIFO first-in-first-out佇列中,直到可以執行 Lambda 函數來取用每個訊息為止。預設為 1,000 則訊息。

      您的 lambda-function-component.json可能包含類似下列範例的文件。

      { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ { "topic": "hello/world/+", "type": "IOT_CORE" } ], "environmentVariables": { "LIMIT": "300" }, "execArgs": [ "-d" ], "inputPayloadEncodingType": "json", "pinned": true, "timeoutInSeconds": 120, "statusTimeoutInSeconds": 30, "maxIdleTimeInSeconds": 30, "maxInstancesCount": 50, "maxQueueSize": 500 } } }
    4. (選用) 設定 Lambda 函數的容器設定。根據預設,Lambda 函數會在 AWS IoT Greengrass Core 軟體內的隔離執行期環境中執行。您也可以選擇執行 Lambda 函數作為程序,而不需要任何隔離。如果您在容器中執行 Lambda 函數,您可以設定容器的記憶體大小,以及 Lambda 函數可用的系統資源。請執行下列操作:

      1. 將 Linux 程序參數物件 (linuxProcessParams) 新增至 中的 Lambda 參數物件lambda-function-component.json

        { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ { "topic": "hello/world/+", "type": "IOT_CORE" } ], "environmentVariables": { "LIMIT": "300" }, "execArgs": [ "-d" ], "inputPayloadEncodingType": "json", "pinned": true, "timeoutInSeconds": 120, "statusTimeoutInSeconds": 30, "maxIdleTimeInSeconds": 30, "maxInstancesCount": 50, "maxQueueSize": 500, "linuxProcessParams": { } } } }
      2. (選用) 指定 Lambda 函數是否在容器中執行。將 isolationMode 參數新增至程序參數物件,然後從下列選項中選擇:

        • GreengrassContainer – Lambda 函數會在容器中執行。

        • NoContainer – Lambda 函數以程序執行,沒有任何隔離。

        預設值為 GreengrassContainer

      3. (選用) 如果您在容器中執行 Lambda 函數,您可以設定記憶體數量和系統資源,例如磁碟區和裝置,以提供給容器。請執行下列操作:

        1. 將容器參數物件 (containerParams) 新增至 中的 Linux 程序參數物件lambda-function-component.json

          { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ { "topic": "hello/world/+", "type": "IOT_CORE" } ], "environmentVariables": { "LIMIT": "300" }, "execArgs": [ "-d" ], "inputPayloadEncodingType": "json", "pinned": true, "timeoutInSeconds": 120, "statusTimeoutInSeconds": 30, "maxIdleTimeInSeconds": 30, "maxInstancesCount": 50, "maxQueueSize": 500, "linuxProcessParams": { "containerParams": { } } } } }
        2. (選用) 新增 memorySizeInKB 參數以指定容器的記憶體大小。預設值為 16,384 KB (16 MB)。

        3. (選用) 新增 mountROSysfs 參數,以指定容器是否可以從裝置/sys資料夾讀取資訊。預設值為 false

        4. (選用) 設定容器化 Lambda 函數可存取的本機磁碟區。當您定義磁碟區時, AWS IoT Greengrass Core 軟體會將來源檔案掛載到容器內的目的地。請執行下列操作:

          1. 將磁碟區清單 (volumes) 新增至容器參數。

            { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ { "topic": "hello/world/+", "type": "IOT_CORE" } ], "environmentVariables": { "LIMIT": "300" }, "execArgs": [ "-d" ], "inputPayloadEncodingType": "json", "pinned": true, "timeoutInSeconds": 120, "statusTimeoutInSeconds": 30, "maxIdleTimeInSeconds": 30, "maxInstancesCount": 50, "maxQueueSize": 500, "linuxProcessParams": { "containerParams": { "memorySizeInKB": 32768, "mountROSysfs": true, "volumes": [ ] } } } } }
          2. 將每個磁碟區新增至清單。每個磁碟區都有下列參數:

            • sourcePath – 核心裝置上的來源資料夾路徑。

            • destinationPath – 容器中目的地資料夾的路徑。

            • permission – (選用) 從容器存取來源資料夾的許可。您可以從以下選項中選擇:

              • ro – Lambda 函數具有來源資料夾的唯讀存取權。

              • rw – Lambda 函數具有來源資料夾的讀寫存取權。

              預設值為 ro

            • addGroupOwner – (選用) 是否要新增執行 Lambda 函數元件的系統群組,做為來源資料夾的擁有者。預設值為 false

            您的 lambda-function-component.json可能包含類似下列範例的文件。

            { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ { "topic": "hello/world/+", "type": "IOT_CORE" } ], "environmentVariables": { "LIMIT": "300" }, "execArgs": [ "-d" ], "inputPayloadEncodingType": "json", "pinned": true, "timeoutInSeconds": 120, "statusTimeoutInSeconds": 30, "maxIdleTimeInSeconds": 30, "maxInstancesCount": 50, "maxQueueSize": 500, "linuxProcessParams": { "containerParams": { "memorySizeInKB": 32768, "mountROSysfs": true, "volumes": [ { "sourcePath": "/var/data/src", "destinationPath": "/var/data/dest", "permission": "rw", "addGroupOwner": true } ] } } } } }
        5. (選用) 設定容器化 Lambda 函數可存取的本機系統裝置。請執行下列操作:

          1. 將系統裝置清單 (devices) 新增至容器參數。

            { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ { "topic": "hello/world/+", "type": "IOT_CORE" } ], "environmentVariables": { "LIMIT": "300" }, "execArgs": [ "-d" ], "inputPayloadEncodingType": "json", "pinned": true, "timeoutInSeconds": 120, "statusTimeoutInSeconds": 30, "maxIdleTimeInSeconds": 30, "maxInstancesCount": 50, "maxQueueSize": 500, "linuxProcessParams": { "containerParams": { "memorySizeInKB": 32768, "mountROSysfs": true, "volumes": [ { "sourcePath": "/var/data/src", "destinationPath": "/var/data/dest", "permission": "rw", "addGroupOwner": true } ], "devices": [ ] } } } } }
          2. 將每個系統裝置新增至清單。每個系統裝置都有下列參數:

            • path – 核心裝置上的系統裝置的路徑。

            • permission – (選用) 從容器存取系統裝置的許可。您可以從以下選項中選擇:

              • ro – Lambda 函數具有系統裝置的唯讀存取權。

              • rw – Lambda 函數具有系統裝置的讀寫存取權。

              預設值為 ro

            • addGroupOwner – (選用) 是否要新增執行 Lambda 函數元件的系統群組,做為系統裝置的擁有者。預設值為 false

          您的 lambda-function-component.json可能包含類似下列範例的文件。

          { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "componentPlatforms": [ { "name": "Linux x86", "attributes": { "os": "linux", "architecture": "x86" } } ], "componentDependencies": { "aws.greengrass.StreamManager": { "versionRequirement": "^1.0.0", "dependencyType": "HARD" } }, "componentLambdaParameters": { "eventSources": [ { "topic": "hello/world/+", "type": "IOT_CORE" } ], "environmentVariables": { "LIMIT": "300" }, "execArgs": [ "-d" ], "inputPayloadEncodingType": "json", "pinned": true, "timeoutInSeconds": 120, "statusTimeoutInSeconds": 30, "maxIdleTimeInSeconds": 30, "maxInstancesCount": 50, "maxQueueSize": 500, "linuxProcessParams": { "containerParams": { "memorySizeInKB": 32768, "mountROSysfs": true, "volumes": [ { "sourcePath": "/var/data/src", "destinationPath": "/var/data/dest", "permission": "rw", "addGroupOwner": true } ], "devices": [ { "path": "/dev/sda3", "permission": "rw", "addGroupOwner": true } ] } } } } }
  7. (選用) 為元件新增標籤 (tags)。如需詳細資訊,請參閱標記您的 AWS IoT Greengrass Version 2 資源

步驟 2:建立 Lambda 函數元件

  1. 執行下列命令,從 建立 Lambda 函數元件lambda-function-component.json

    aws greengrassv2 create-component-version --cli-input-json file://lambda-function-component.json

    如果請求成功,回應看起來與下列範例類似。

    { "arn": "arn:aws:greengrass:region:123456789012:components:com.example.HelloWorldLambda:versions:1.0.0", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "creationTimestamp": "Mon Dec 15 20:56:34 UTC 2020", "status": { "componentState": "REQUESTED", "message": "NONE", "errors": {} } }

    arn 從輸出複製 ,以在下一個步驟中檢查元件的狀態。

  2. 當您建立元件時,其狀態為 REQUESTED。然後, AWS IoT Greengrass 驗證元件可部署。您可以執行下列命令來查詢元件狀態,並確認元件可部署。將 取代arn為上一個步驟的 ARN。

    aws greengrassv2 describe-component \ --arn "arn:aws:greengrass:region:account-id:components:com.example.HelloWorldLambda:versions:1.0.0"

    如果元件驗證,回應會指出元件狀態為 DEPLOYABLE

    { "arn": "arn:aws:greengrass:region:account-id:components:com.example.HelloWorldLambda:versions:1.0.0", "componentName": "com.example.HelloWorldLambda", "componentVersion": "1.0.0", "creationTimestamp": "2020-12-15T20:56:34.376000-08:00", "publisher": "AWS Lambda", "status": { "componentState": "DEPLOYABLE", "message": "NONE", "errors": {} }, "platforms": [ { "name": "Linux x86", "attributes": { "architecture": "x86", "os": "linux" } } ] }

    元件為 之後DEPLOYABLE,您可以將 Lambda 函數部署至核心裝置。如需詳細資訊,請參閱將 AWS IoT Greengrass 元件部署至裝置