如何使用 CDK 为 AWS 日志订阅筛选条件创建指标/警报?



>上下文

我已经使用 CDK 创建了一个 AWS 日志订阅筛选器。我现在正在尝试为此资源的某些指标创建指标/警报。

问题

  • 我感兴趣的所有指标(请参阅使用 CloudWatch 指标监控 AWS 日志文档中的ForwardedLogEventsDeliveryErrorsDeliveryThrottling(都需要指定以下维度:
    • LogGroupName
    • DestinationType
    • FilterName

前两个很容易指定,因为在创建构造时也需要LogGroupNameDestinationType在我的情况下只是Lambda。但是,我认为没有办法使用 CDK 获得FilterName

  • 使用CloudWatch,我看到FilterName就像MyStackName-MyLogicalID29669D87-GCMA0Q4KKALH一样。所以我不能使用Fn.ref直接指定它(因为我不知道逻辑 id(。使用CloudFormation,我可以直接完成Ref: LogicalId
  • 我也没有在 SubscriptionFilter 对象上看到任何将返回此属性的属性(与大多数其他 CDK 构造不同,这个构造看起来很裸露,并且绝对不返回有关资源的信息(。
  • SubscriptionFilter对象上也没有metric*方法(与其他标准结构不同,如 Lambda 函数、S3 存储桶等(,因此我必须手动指定Metric对象。例如,请参阅:CDK 指标对象文档。
  • 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. 或者,有没有其他方法可以解决这个问题?

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

示例代码

在 Kotlin 中,作为任何构造的扩展函数(:

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()

最新更新