

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

# Lambda
<a name="lambda-rule-action"></a>

Lambda (`lambda`) 操作调用一个 AWS Lambda 函数，传入 MQTT 消息。 AWS IoT 异步调用 Lambda 函数。

您可以按照教程执行操作，该教程向您说明如何使用 Lambda 操作创建并测试规则。有关更多信息，请参阅 [教程：使用 AWS Lambda 函数格式化通知](iot-lambda-rule.md)。

## 要求
<a name="lambda-rule-action-requirements"></a>

此规则操作具有以下要求：
+  AWS IoT 要调用 Lambda 函数，必须配置授予`lambda:InvokeFunction`权限的策略。 AWS IoT您只能调用 Lambda 策略 AWS 区域 所在位置定义的 Lambda 函数。Lambda 函数使用基于资源的策略，因此您必须将该策略附加到 Lambda 函数本身。

  使用以下 AWS CLI 命令附加授予`lambda:InvokeFunction`权限的策略。在该命令中，将：
  + *function\$1name*使用 Lambda 函数的名称。添加新的权限来更新函数的资源策略。
  + *region*使用函数 AWS 区域 的。
  + *account-id*使用定义规则的 AWS 账户 数字。
  + *rule-name*使用您要为其定义 Lambda 操作的 AWS IoT 规则的名称。
  + *unique\$1id*带有唯一的语句标识符。
**重要**  
如果您在不提供`source-arn`或的情况下为 AWS IoT 委托人添加权限`source-account`，则任何 AWS 账户 使用您的 Lambda 操作创建规则的人都可以激活规则，从中调用您的 Lambda 函数。 AWS IoT

  有关更多信息，请参阅 [AWS Lambda 权限](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html)。

  ```
  aws lambda add-permission \ 
      --function-name function_name \ 
      --region region \ 
      --principal iot.amazonaws.com \
      --source-arn arn:aws:iot:region:account-id:rule/rule_name \
      --source-account account-id 
      --statement-id unique_id 
      --action "lambda:InvokeFunction"
  ```
+ 如果您使用 AWS IoT 控制台为 Lambda 规则操作创建规则，则会自动触发 Lambda 函数。如果 AWS CloudFormation 改用 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-lambdaaction.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-lambdaaction.html)，则必须添加[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html)资源。然后该资源授予您触发 Lambda 函数的权限。

  以下代码显示了如何添加此资源的示例。在此示例中：
  + *function\$1name*使用 Lambda 函数的名称。
  + *region*使用函数 AWS 区域 的。
  + *account-id*使用定义规则的 AWS 账户 数字。
  + *rule-name*使用您要为其定义 Lambda 操作的 AWS IoT 规则的名称。

  ```
  Type: AWS::Lambda::Permission
  Properties:
    Action: lambda:InvokeFunction
    FunctionName: !Ref function_name
    Principal: "iot.amazonaws.com"
    SourceAccount: account-id
    SourceArn: arn:aws:iot:region:account-id:rule/rule_name
  ```
+ 如果您使用 AWS KMS 客户托管 AWS KMS key 对 Lambda 中的静态数据进行加密，则该服务必须有权代表调用者使用这些数据。 AWS KMS key 有关更多信息，请参阅*《AWS Lambda 开发人员指南》*中的[静态加密](https://docs.aws.amazon.com/lambda/latest/dg/security-dataprotection.html#security-privacy-atrest)。

## 参数
<a name="lambda-rule-action-parameters"></a>

使用此操作创建 AWS IoT 规则时，必须指定以下信息：

`functionArn`  
要调用的 Lambda 函数的 ARN。 AWS IoT 必须具有调用该函数的权限。有关更多信息，请参阅 [要求](#lambda-rule-action-requirements)。  
如果您未指定 Lambda 函数的版本或别名，则将关闭该函数的最新版本。如果要关闭 Lambda 函数的特定版本，则可指定版本或别名。要指定一个版本或别名，请将该版本或别名附加到 Lambda 函数的 ARN。  

```
arn:aws:lambda:us-east-2:123456789012:function:myLambdaFunction:someAlias
```
有关版本控制和别名的更多信息，请参阅 [AWS Lambda 函数版本控制和别名](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)。  
仅支持[替换模板](iot-substitution-templates.md)：API 且 AWS CLI 仅支持

## 示例
<a name="lambda-rule-action-examples"></a>

以下 JSON 示例在规则中定义了 Lambda 操作。 AWS IoT 

```
{
    "topicRulePayload": {
        "sql": "SELECT * FROM 'some/topic'", 
        "ruleDisabled": false, 
        "awsIotSqlVersion": "2016-03-23",
        "actions": [
            {
                "lambda": {
                    "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myLambdaFunction"
                 }
            }
        ]
    }
}
```

以下 JSON 示例定义了在规则中使用替换模板的 Lambda 操作。 AWS IoT 

```
{
    "topicRulePayload": {
        "sql": "SELECT * FROM 'some/topic'",
        "ruleDisabled": false,
        "awsIotSqlVersion": "2016-03-23",
        "actions": [
            {
                "lambda": {
                    "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:${topic()}"
                }
            }
        ]
    }
}
```

## 另请参阅
<a name="lambda-rule-action-see-also"></a>
+ [什么是 AWS Lambda？](https://docs.aws.amazon.com/lambda/latest/dg/) 在《*AWS Lambda 开发者指南》*中
+ [教程：使用 AWS Lambda 函数格式化通知](iot-lambda-rule.md)