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

问题描述 投票:0回答:1

上下文

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

问题

  • 我感兴趣的所有指标(请参阅ForwardedLogEvents文档中的DeliveryErrorsDeliveryThrottlingMonitoring AWS Logs with CloudWatch Metrics)要求指定以下尺寸:
    • 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. 否则,还有其他方法可以解决吗?
amazon-web-services amazon-cloudformation aws-cdk
1个回答
0
投票

我能够使用Stack#getLogicalId方法解决此问题。

示例代码

[在Kotlin中,作为任何extension functionConstruct):

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

...,然后将其与任何构造函数一起使用:

        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()
© www.soinside.com 2019 - 2024. All rights reserved.