>上下文
我已经使用 CDK 创建了一个 AWS 日志订阅筛选器。我现在正在尝试为此资源的某些指标创建指标/警报。
问题
- 我感兴趣的所有指标(请参阅使用 CloudWatch 指标监控 AWS 日志文档中的
ForwardedLogEvents
、DeliveryErrors
DeliveryThrottling
(都需要指定以下维度:LogGroupName
DestinationType
FilterName
前两个很容易指定,因为在创建构造时也需要LogGroupName
,DestinationType
在我的情况下只是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')
}
})
问题
- 如何确定如何获取
FilterName
属性以构造Metric
对象? - 或者,有没有其他方法可以解决这个问题?
我能够通过使用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()