将 Lambda 函数作为 组件导入 (AWS CLI) - AWS IoT Greengrass
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 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)。如果省略此参数 AWS IoT IoT Greengrass 将使用 Lambda 函数的名称创建 组件。

    { "lambdaFunction": { "lambdaArn": "arn:aws:lambda:region:account-id:function:HelloWorld:1", "componentName": "com.example.HelloWorldLambda" } }
  3. (可选)指定组件的版本 (componentVersion)。如果省略此参数 AWS IoT IoT Greengrass 将创建 组件,并将 Lambda 函数的 版本作为有效的语义版本。例如,如果您的函数版本是 3,则组件版本将变为 3.0.0

    注意

    您上传的每个组件版本必须是唯一的。上传组件版本后无法对其进行编辑。

    AWS IoT Greengrass 使用组件的语义版本。语义版本遵循 major.minor.patch 编号系统。例如,version 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) 的属性。AWS 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 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 semver 计算器

      • 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 函数订阅的工作消息的事件源。Lambda 函数在收到来自事件源的消息时调用。您可以将此函数订阅到本地发布/订阅消息和 AWS IoT Core MQTT 消息。执行以下操作:

      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 – 要订阅消息的主题。本主题在订阅 AWS AWS IoT Core MQTT 主题+时支持 MQTT 主题通配符(# 和 )。

        • type – 事件源的类型。从以下选项中进行选择:

          • PUB_SUB – 订阅本地发布/订阅消息。

          • IOT_CORE – 订阅 AWS IoT Core MQTT 消息。

          以下示例订阅与hello/world/+主题筛选条件匹配的主题上的 AWS 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

        • 当 AWS IoT IoT Greengrass 启动并在自己的容器中保持运行时,固定(或长时间生存的)Lambda 函数将启动。

        • 非固定(或按需)Lambda 函数仅在接收工作项时启动,并在保持空闲状态并达到指定的最大空闲时间后退出。如果该函数有多个工作项,AWS IoT Greengrass Core 软件将创建该函数的多个实例。

        使用 maxIdleTimeInSeconds 设置 函数的最长空闲时间。

      • timeoutInSeconds – Lambda 函数在超时之前可以运行的最长时间(以秒为单位)。默认值为 3 秒。

      • statusTimeoutInSeconds – Lambda 函数组件将状态更新发送到 Lambda Manager 组件的时间间隔 (以秒为单位)。此参数仅适用于固定的函数。默认值为 60 秒。

      • maxIdleTimeInSeconds – 在 AWS AWS IoT Greengrass 核心软件停止其进程之前,非固定 Lambda 函数可以空闲的最长时间(以秒为单位)。默认值为 60 秒。

      • maxInstancesCount – 非固定 Lambda 函数可同时运行的最大实例数。默认值为 100 个实例。

      • maxQueueSize – Lambda 函数组件的消息队列的最大大小。AWS AWS IoT Greengrass 核心软件将消息存储在 FIFO(先进先出)队列中,直到它可以运行 Lambda 函数来使用每条消息。默认值为 1000 条消息。

      您的 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 AWS IoT Greengrass 核心软件内的隔离运行时环境中运行。您还可以选择将 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 参数以指定容器的内存大小。默认值为 16384 KB (16 MB)。

        3. (可选)添加 mountROSysfs 参数以指定容器是否可以从设备的 /sys 文件夹中读取信息。默认值为 false

        4. (可选)配置容器化 Lambda 函数可访问的本地卷。定义卷时,AWS IoT Greengrass 核心软件会将源文件挂载到容器内的目标。执行以下操作:

          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 AWS IoT Greengrass 版本 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 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 AWS IoT Greengrass 组件部署到设备