我使用 Amazon CloudFormation(CloudFormation)模板或 Amazon 命令行界面(Amazon CLI)创建了 Amazon CloudWatch Events(CloudWatch Events)规则。我尝试调用 Amazon Lambda 目标,但该目标未被调用。
## 简短描述
使用 CloudFormation 模板或 Amazon CLI 创建的 CloudWatch Events 规则必须明确授予 CloudWatch Events 规则权限才能调用 Lambda 目标。
## 解决方法
您可以在 CloudFormation 模板或 Amazon CLI 中添加调用 Lambda 目标所需的 CloudWatch Events 规则权限。
**注意**:如果在运行 Amazon CLI 命令时收到错误,[请确保您使用的是最新版本的 Amazon CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-troubleshooting.html?trk=cndc-detail)。
### 选项 1:在 CloudFormation 模板中添加权限
使用 [AWS::Lambda::Permission](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html?trk=cndc-detail) 资源将策略语句添加到您的 Lambda 函数的访问策略。
**重要提示**:在 CloudFormation 模板中,请确保:
* 将 **MyLambdaFunction** 替换为 Lambda 函数的逻辑名称。
* 将 **MyEventRule** 替换为事件规则的逻辑名称。
```JSON
"LambdaInvokePermission":
{
"Type": "AWS::Lambda::Permission",
"Properties": {
"FunctionName": {
"Fn::GetAtt": [
"MyLambdaFunction",
"Arn"
]
},
"Action": "lambda:InvokeFunction",
"Principal": "events.amazonaws.com",
"SourceArn": {
"Fn::GetAtt": [
"EventRule",
"Arn"
]
}
}
}
```
```YAML
LambdaInvokePermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName:
Fn::GetAtt:
- MyLambdaFunction
- Arn
Action: "lambda:InvokeFunction"
Principal: "events.amazonaws.com"
SourceArn:
Fn::GetAtt:
- "EventRule"
- "Arn"
```
### 选项 2:使用 Amazon CLI 添加权限
在显示命令提示符时,输入以下命令。
```
aws lambda add-permission
--statement-id "TrustCloudWatchToInvokeMyLambdaFunction" \
--action "lambda:InvokeFunction" \
--principal "events.amazonaws.com" \
--function-name "arn:aws:lambda:<region>:<account-id>:function:<function-name>"
\
--source-arn "arn:aws:events:<region>:<account-id>:rule/<rule-name>"
```
***
## 相关信息
[通过 Amazon CloudFormation 使用 Amazon Lambda](https://docs.aws.amazon.com/lambda/latest/dg/services-cloudformation.html?trk=cndc-detail)