如何使用AWS Ruby SDK为AWS Lambda创建CloudWatch日志触发器?

9

我知道可以使用AWS Ruby SDK创建AWS Lambda触发器(就像使用AWS Management Console一样)。

*更新,我找到了一种创建触发器的方法。 我正在使用以下代码:

@cloudwatchlogs = Aws::CloudWatchLogs::Client.new(region: region, credentials: Aws::Credentials.new(aws_access_key_id, aws_secret_access_key))
@cloudwatchlogs.put_subscription_filter({
   log_group_name: "RDSOSMetrics",
   filter_name: "RDS metrics filter",
   filter_pattern: "RDS metrics filter pattern",
   destination_arn: function_arn
})

在尝试执行此操作时,我遇到了以下错误:
*** Aws::CloudWatchLogs::Errors::InvalidParameterException Exception: Could not execute the lambda function. Make sure you have given CloudWatch Logs permission to execute your function

为了测试一下,我有一个角色X,它附加在Lambda函数上,这个角色已经添加了AWSLambdaFullAccess策略,但我仍然遇到了这个错误。

我还需要注意些什么吗?

谢谢, Bakir


你能澄清一下你想添加哪种'CloudWatch触发器'吗?这有点模糊不清;你可以添加一个CloudWatch事件(计划)触发器,一个CloudWatch日志触发器,或者基于通过CloudWatch警报发布的消息的SNS触发器。这个细节将改变答案的范围。 - Anthony Neace
更新了我的回复。一般来说,在我的情况下,我需要为Lambda函数设置CloudWatch日志触发器。 - Bakir Jusufbegovic
1个回答

6

可以通过以下方式添加CloudWatch Logs权限:

client.add_permission({
    action: "lambda:InvokeFunction",
    function_name: function_arn,
    principal: "logs." + region + ".amazonaws.com",
    source_account: account_id,
    source_arn: "arn:aws:logs:" + region + ":" + account_id + ":log-group:" + log_group_name + ":*",
    statement_id: unique_identifier,
})

其中:

  • function_arn 是您的函数标识符,类似于 arn:aws:lambda:eu-west-1:111111111111:function:yourFunctionName
  • region 是您服务区域的名称,类似于 eu-west-1
  • account_id 是您帐户的 ID,类似于 111111111111
  • log_group_name 是您将要从中流式传输日志的日志名称,类似于 /aws/lambda/logGroupName
  • unique_identifier 是用于策略语句的一些随机字符串。例如:ID-1

它应按以下序列执行:

  • 创建 Lambda 函数和日志组
  • 添加权限
  • 放置订阅过滤器

更多信息:


注意:source_arn 的末尾有一个星号符号:

arn:aws:logs:eu-west-1:111111111111:log-group:logGroup:*
arn:aws:logs:eu-west-1:111111111111:log-group:logGroup

这是日志流的ARN(而不是日志组的ARN)。我花了一些时间来调试这个问题(直到我发现了使用“aws lambda get-policy”时出错的地方)。

3
备注:客户端是CloudWatch客户端,不是Lambda客户端。 - roguequery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接