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

Bak*_*vic 9 ruby amazon-web-services aws-sdk

我知道应该有一种方法可以使用aws ruby​​ sdk为AWS Lambda创建触发器(就像可以使用AWS管理控制台一样).

*更新,我能够找到一种创建触发器的方法.我正在使用以下代码来做到这一点:

@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
})
Run Code Online (Sandbox Code Playgroud)

我在尝试这样做时遇到以下错误:

*** Aws::CloudWatchLogs::Errors::InvalidParameterException Exception: Could not execute the lambda function. Make sure you have given CloudWatch Logs permission to execute your function
Run Code Online (Sandbox Code Playgroud)

只是为了测试它,我有角色X附加到Lambda函数,并且该角色添加了AWSLambdaFullAccess策略,但我仍然收到此错误.

我还缺少别人的东西

谢谢,巴基尔

小智 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,
})
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • 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
Run Code Online (Sandbox Code Playgroud)

它属于arn日志流,而不arn属于日志组。我花了一些时间来调试这个(直到我发现错误aws lambda get-policy

  • 注意:客户端是 CloudWatch 客户端 - 不是 Lambda 客户端。 (3认同)