Skip to content

Commit 8d245d4

Browse files
CCM-8197: Cross Account Observability
1 parent a502ab9 commit 8d245d4

3 files changed

Lines changed: 44 additions & 19 deletions

File tree

infrastructure/modules/observability-datasource/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
| <a name="input_component"></a> [component](#input\_component) | The name of the terraformscaffold component calling this module | `string` | n/a | yes |
1616
| <a name="input_default_tags"></a> [default\_tags](#input\_default\_tags) | Default tag map for application to all taggable resources in the module | `map(string)` | `{}` | no |
1717
| <a name="input_environment"></a> [environment](#input\_environment) | The name of the terraformscaffold environment the module is called for | `string` | n/a | yes |
18+
| <a name="input_log_group_configuration"></a> [log\_group\_configuration](#input\_log\_group\_configuration) | Configuration for filtering log groups in the link configuration. | <pre>object({<br/> filter = string<br/> })</pre> | `null` | no |
19+
| <a name="input_metric_configuration"></a> [metric\_configuration](#input\_metric\_configuration) | Configuration for filtering metrics in the link configuration. | <pre>object({<br/> filter = string<br/> })</pre> | `null` | no |
1820
| <a name="input_name"></a> [name](#input\_name) | A unique name to distinguish this module invocation from others within the same CSI scope | `string` | n/a | yes |
1921
| <a name="input_oam_sink_id"></a> [oam\_sink\_id](#input\_oam\_sink\_id) | The ID of the Cloudwatch OAM sink in the appropriate observability account. | `string` | `""` | no |
2022
| <a name="input_observability_account_id"></a> [observability\_account\_id](#input\_observability\_account\_id) | The Observability Account ID that needs access | `string` | n/a | yes |
Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,42 @@
11
resource "aws_oam_link" "cross_account_obs" {
2-
count = var.oam_sink_id != "" ? 1 : 0
32
label_template = "$AccountName"
43
resource_types = [
54
"AWS::CloudWatch::Metric",
65
"AWS::Logs::LogGroup"
76
]
87
sink_identifier = "arn:aws:oam:${var.region}:${var.observability_account_id}:sink/${var.oam_sink_id}"
98
tags = var.default_tags
9+
10+
link_configuration {
11+
dynamic "log_group_configuration" {
12+
for_each = var.log_group_configuration != null ? [var.log_group_configuration] : []
13+
content {
14+
filter = log_group_configuration.value.filter
15+
}
16+
}
17+
18+
dynamic "metric_configuration" {
19+
for_each = var.metric_configuration != null ? [var.metric_configuration] : []
20+
content {
21+
filter = metric_configuration.value.filter
22+
}
23+
}
24+
}
1025
}
1126

1227
data "aws_iam_policy" "cloudwatch_read_only" {
13-
count = var.oam_sink_id != "" ? 1 : 0
14-
name = "CloudWatchReadOnlyAccess"
28+
name = "CloudWatchReadOnlyAccess"
1529
}
1630

1731
data "aws_iam_policy" "cloudwatch_automatic_dashboards" {
18-
count = var.oam_sink_id != "" ? 1 : 0
19-
name = "CloudWatchAutomaticDashboardsAccess"
32+
name = "CloudWatchAutomaticDashboardsAccess"
2033
}
2134

2235
data "aws_iam_policy" "aws_xray_read_only" {
23-
count = var.oam_sink_id != "" ? 1 : 0
24-
name = "AWSXrayReadOnlyAccess"
36+
name = "AWSXrayReadOnlyAccess"
2537
}
2638

2739
data "aws_iam_policy_document" "cross_account_obs_assume_role_policy" {
28-
count = var.oam_sink_id != "" ? 1 : 0
2940
statement {
3041
effect = "Allow"
3142
principals {
@@ -37,25 +48,21 @@ data "aws_iam_policy_document" "cross_account_obs_assume_role_policy" {
3748
}
3849

3950
resource "aws_iam_role" "cross_account_obs_role" {
40-
count = var.oam_sink_id != "" ? 1 : 0
4151
name = "CloudWatch-CrossAccountSharingRole"
42-
assume_role_policy = data.aws_iam_policy_document.cross_account_obs_assume_role_policy[0].json
52+
assume_role_policy = data.aws_iam_policy_document.cross_account_obs_assume_role_policy.json
4353
}
4454

4555
resource "aws_iam_role_policy_attachment" "cloudwatch_read_only_attachment" {
46-
count = var.oam_sink_id != "" ? 1 : 0
47-
policy_arn = data.aws_iam_policy.cloudwatch_read_only[0].arn
48-
role = aws_iam_role.cross_account_obs_role[0].name
56+
policy_arn = data.aws_iam_policy.cloudwatch_read_only.arn
57+
role = aws_iam_role.cross_account_obs_role.name
4958
}
5059

5160
resource "aws_iam_role_policy_attachment" "cloudwatch_automatic_dashboards_attachment" {
52-
count = var.oam_sink_id != "" ? 1 : 0
53-
policy_arn = data.aws_iam_policy.cloudwatch_automatic_dashboards[0].arn
54-
role = aws_iam_role.cross_account_obs_role[0].name
61+
policy_arn = data.aws_iam_policy.cloudwatch_automatic_dashboards.arn
62+
role = aws_iam_role.cross_account_obs_role.name
5563
}
5664

5765
resource "aws_iam_role_policy_attachment" "aws_xray_read_only_attachment" {
58-
count = var.oam_sink_id != "" ? 1 : 0
59-
policy_arn = data.aws_iam_policy.aws_xray_read_only[0].arn
60-
role = aws_iam_role.cross_account_obs_role[0].name
66+
policy_arn = data.aws_iam_policy.aws_xray_read_only.arn
67+
role = aws_iam_role.cross_account_obs_role.name
6168
}

infrastructure/modules/observability-datasource/variables.tf

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,19 @@ variable "observability_account_id" {
5555
type = string
5656
description = "The Observability Account ID that needs access"
5757
}
58+
59+
variable "log_group_configuration" {
60+
description = "Configuration for filtering log groups in the link configuration."
61+
type = object({
62+
filter = string
63+
})
64+
default = null
65+
}
66+
67+
variable "metric_configuration" {
68+
description = "Configuration for filtering metrics in the link configuration." # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/oam_link#link_configuration-block
69+
type = object({
70+
filter = string
71+
})
72+
default = null
73+
}

0 commit comments

Comments
 (0)