如何使用CDK为AWS Logs SubscriptionFilter创建指标/警报?

时间:2020-05-21 05:42:08

标签: amazon-web-services amazon-cloudformation aws-cdk

上下文

我已经使用CDK创建了AWS Logs SubscriptionFilter。我现在正在尝试为此资源的一些指标创建指标/警报。

问题

  • 我感兴趣的所有指标(请参阅Monitoring AWS Logs with CloudWatch Metrics文档中的ForwardedLogEventsDeliveryErrorsDeliveryThrottling)都需要指定以下维度:
    • LogGroupName
    • DestinationType
    • FilterName

前两个很容易指定,因为在创建构造时也需要LogGroupName,而在我的情况下,DestinationType只是Lambda。但是,我看不到使用CDK来获得FilterName的方法。

  • 使用CloudWatch,我发现FilterName就像MyStackName-MyLogicalID29669D87-GCMA0Q4KKALH。因此,我无法使用Fn.ref直接指定它(因为我不知道逻辑ID)。使用CloudFormation,我可以直接完成Ref: LogicalId
  • 我也没有看到any properties on the SubscriptionFilter object会返回此值(与大多数其他CDK构造不同,这个看上去很裸,并且绝对不返回有关资源的信息)。
  • metric*对象上也没有SubscriptionFilter方法(与其他标准构造(如Lambda函数,S3存储桶等)不同),因此我必须手动指定Metric对象。例如,请参见:CDK metric objects docs
  • CDK构造(以及基础CloudFormation资源:AWS::Logs::SubscriptionFilter)不允许我指定FilterName-因此,我也不能使用变量来指定它,并且名称是动态生成的。

非常接近我需要的示例代码:

const metric = new Metric({
  namespace: 'AWS/Logs',
  metricName: 'ForwardedLogEvents',
  dimensions: {
    DestinationType: 'Lambda',

    // I know this value since I specified it while creating the SubscriptionFilter
    LogGroupName: 'MyLogGroupName', 

    FilterName: Fn.ref('logical-id-wont-work-since-it-is-dynamic-in-CDK')
  }
})

问题

  1. 如何弄清楚如何获取FilterName属性以构造Metric对象?
  2. 否则,还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

我可以使用Stack#getLogicalId方法来解决此问题。

示例代码

在科特林,以extension functionConstruct开头):

fun Construct.getLogicalId() = Stack.of(this).getLogicalId(this.node.defaultChild as CfnElement)

...,然后将其与任何Construct一起使用:

        val metric = Metric.Builder.create()
            .namespace("AWS/Logs")
            .metricName("ForwardedLogEvents")
            .dimensions(mapOf(
                "DestinationType" to "Lambda",
                "LogGroupName" to myLogGroup.logGroupName,
                "FilterName" to mySubscriptionFilter.getLogicalId()
            ))
            .statistic("sum")
            .build()