Skip to content

Commit d5eecf8

Browse files
authored
feat: added support for the new cloud logs agent to send logs directly to a Cloud Logs instance. This is now the default logging agent deployed by this module as the Log Analysis service is deprecated (#368)
1 parent 88a1002 commit d5eecf8

30 files changed

+1222
-234
lines changed

.secrets.baseline

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"files": "go.sum|^.secrets.baseline$",
44
"lines": null
55
},
6-
"generated_at": "2023-12-09T09:50:09Z",
6+
"generated_at": "2024-10-02T13:57:09Z",
77
"plugins_used": [
88
{
99
"name": "AWSKeyDetector"
@@ -76,7 +76,28 @@
7676
"name": "TwilioKeyDetector"
7777
}
7878
],
79-
"results": {},
79+
"results": {
80+
"README.md": [
81+
{
82+
"hashed_secret": "3f0155e75563ab3adc0505000a86da5baa207d1f",
83+
"is_secret": false,
84+
"is_verified": false,
85+
"line_number": 64,
86+
"type": "Secret Keyword",
87+
"verified_result": null
88+
}
89+
],
90+
"modules/logs-agent/README.md": [
91+
{
92+
"hashed_secret": "3f0155e75563ab3adc0505000a86da5baa207d1f",
93+
"is_secret": false,
94+
"is_verified": false,
95+
"line_number": 36,
96+
"type": "Secret Keyword",
97+
"verified_result": null
98+
}
99+
]
100+
},
80101
"version": "0.13.1+ibm.62.dss",
81102
"word_list": {
82103
"file": null,

README.md

Lines changed: 64 additions & 36 deletions
Large diffs are not rendered by default.

cra-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# More info about this file at https://github.com/terraform-ibm-modules/common-pipeline-assets/blob/main/.github/workflows/terraform-test-pipeline.md#cra-config-yaml
22
version: "v1"
33
CRA_TARGETS:
4-
- CRA_TARGET: "examples/basic" # Target directory for CRA scan. If not provided, the CRA Scan will not be run.
4+
- CRA_TARGET: "examples/obs-agent-ocp" # Target directory for CRA scan. If not provided, the CRA Scan will not be run.
55
CRA_IGNORE_RULES_FILE: "cra-tf-validate-ignore-rules.json" # CRA Ignore file to use. If not provided, it checks the repo root directory for `cra-tf-validate-ignore-rules.json`
66
PROFILE_ID: "0e6e7b5a-817d-4344-ab6f-e5d7a9c49520" # SCC profile ID (currently set to the FSCloud 1.4.0 profile).
77
# SCC_INSTANCE_ID: "" # The SCC instance ID to use to download profile for CRA scan. If not provided, a default global value will be used.

examples/basic/README.md

Lines changed: 0 additions & 7 deletions
This file was deleted.

examples/basic/version.tf

Lines changed: 0 additions & 27 deletions
This file was deleted.

examples/obs-agent-iks/README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Monitoring agent + Cloud Logs agent on Kubernetes using CSE ingress endpoint with an apikey
2+
3+
An example that shows how to deploy Logs agents and Monitoring agent in a Kubernetes cluster to send Logs directly to IBM Cloud Logs and Cloud Monitoring instance respectively.
4+
5+
The example provisions the following resources:
6+
- A new resource group, if an existing one is not passed in.
7+
- A basic VPC (if `is_vpc_cluster` is true).
8+
- A Kubernetes cluster.
9+
- A Service ID with `Sender` role to `logs` service and an apikey.
10+
- An IBM Cloud Logs and Cloud Monitoring instance
11+
- Logs agents and Monitoring agent

examples/basic/main.tf renamed to examples/obs-agent-iks/main.tf

Lines changed: 62 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,36 @@
33
##############################################################################
44

55
module "resource_group" {
6-
source = "git::https://github.com/terraform-ibm-modules/terraform-ibm-resource-group.git?ref=v1.1.6"
6+
source = "terraform-ibm-modules/resource-group/ibm"
7+
version = "1.1.6"
78
# if an existing resource group is not set (null) create a new one using prefix
89
resource_group_name = var.resource_group == null ? "${var.prefix}-resource-group" : null
910
existing_resource_group_name = var.resource_group
1011
}
1112

1213
##############################################################################
13-
# Observability Instances
14+
# Service ID with logs sender role + apikey
1415
##############################################################################
1516

16-
module "observability_instances" {
17-
source = "git::https://github.com/terraform-ibm-modules/terraform-ibm-observability-instances?ref=v2.18.1"
18-
providers = {
19-
logdna.at = logdna.at
20-
logdna.ld = logdna.ld
17+
# As a `Sender`, you can send logs to your IBM Cloud Logs service instance - but not query or tail logs. This role is meant to be used by agents and routers sending logs.
18+
module "iam_service_id" {
19+
source = "terraform-ibm-modules/iam-service-id/ibm"
20+
version = "1.2.0"
21+
iam_service_id_name = "${var.prefix}-service-id"
22+
iam_service_id_description = "Logs Agent service id"
23+
iam_service_id_apikey_provision = true
24+
iam_service_policies = {
25+
logs = {
26+
roles = ["Sender"]
27+
resources = [{
28+
service = "logs"
29+
}]
30+
}
2131
}
22-
resource_group_id = module.resource_group.resource_group_id
23-
region = var.region
24-
log_analysis_plan = "7-day"
25-
cloud_monitoring_plan = "graduated-tier"
26-
activity_tracker_provision = false
27-
enable_platform_logs = false
28-
enable_platform_metrics = false
29-
cloud_logs_provision = false
30-
log_analysis_instance_name = "${var.prefix}-log-analysis"
31-
cloud_monitoring_instance_name = "${var.prefix}-cloud-monitoring"
3232
}
3333

3434
##############################################################################
35-
# Create VPC and Cluster
35+
# Create VPC and IKS Cluster
3636
##############################################################################
3737

3838
resource "ibm_is_vpc" "example_vpc" {
@@ -42,63 +42,36 @@ resource "ibm_is_vpc" "example_vpc" {
4242
tags = var.resource_tags
4343
}
4444

45-
resource "ibm_is_public_gateway" "public_gateway" {
46-
count = var.is_vpc_cluster ? 1 : 0
47-
name = "${var.prefix}-gateway-1"
48-
vpc = ibm_is_vpc.example_vpc[0].id
49-
resource_group = module.resource_group.resource_group_id
50-
zone = "${var.region}-1"
51-
}
52-
5345
resource "ibm_is_subnet" "testacc_subnet" {
5446
count = var.is_vpc_cluster ? 1 : 0
5547
name = "${var.prefix}-subnet"
5648
vpc = ibm_is_vpc.example_vpc[0].id
5749
zone = "${var.region}-1"
5850
total_ipv4_address_count = 256
5951
resource_group = module.resource_group.resource_group_id
60-
public_gateway = ibm_is_public_gateway.public_gateway[0].id
61-
}
62-
63-
resource "ibm_resource_instance" "cos_instance" {
64-
count = var.is_openshift ? 1 : 0
65-
name = "${var.prefix}-cos"
66-
service = "cloud-object-storage"
67-
plan = "standard"
68-
location = "global"
69-
resource_group_id = module.resource_group.resource_group_id
70-
tags = var.resource_tags
7152
}
7253

7354
# Lookup the current default kube version
7455
data "ibm_container_cluster_versions" "cluster_versions" {}
7556
locals {
76-
default_version = var.is_openshift ? "${data.ibm_container_cluster_versions.cluster_versions.default_openshift_version}_openshift" : data.ibm_container_cluster_versions.cluster_versions.default_kube_version
57+
default_version = data.ibm_container_cluster_versions.cluster_versions.default_kube_version
7758
}
7859

79-
# Create either a VPC or classic cluster, depending on the is_vpc_cluster variable
8060
resource "ibm_container_vpc_cluster" "cluster" {
8161
count = var.is_vpc_cluster ? 1 : 0
8262
name = var.prefix
8363
vpc_id = ibm_is_vpc.example_vpc[0].id
8464
kube_version = local.default_version
8565
flavor = "bx2.4x16"
8666
worker_count = "2"
87-
entitlement = var.is_openshift ? "cloud_pak" : null
88-
cos_instance_crn = var.is_openshift ? ibm_resource_instance.cos_instance[0].id : null
8967
force_delete_storage = true
90-
wait_till = "Normal"
68+
wait_till = "IngressReady"
9169
zones {
9270
subnet_id = ibm_is_subnet.testacc_subnet[0].id
9371
name = "${var.region}-1"
9472
}
9573
resource_group_id = module.resource_group.resource_group_id
9674
tags = var.resource_tags
97-
98-
timeouts {
99-
delete = "2h"
100-
create = "3h"
101-
}
10275
}
10376

10477
resource "ibm_container_cluster" "cluster" {
@@ -109,7 +82,6 @@ resource "ibm_container_cluster" "cluster" {
10982
default_pool_size = 2
11083
hardware = "shared"
11184
kube_version = local.default_version
112-
entitlement = var.is_openshift ? "cloud_pak" : null
11385
force_delete_storage = true
11486
machine_type = "b3c.4x16"
11587
public_vlan_id = ibm_network_vlan.public_vlan[0].id
@@ -124,6 +96,10 @@ resource "ibm_container_cluster" "cluster" {
12496
}
12597
}
12698

99+
locals {
100+
cluster_name_id = var.is_vpc_cluster ? ibm_container_vpc_cluster.cluster[0].id : ibm_container_cluster.cluster[0].id
101+
}
102+
127103
resource "ibm_network_vlan" "public_vlan" {
128104
count = var.is_vpc_cluster ? 0 : 1
129105
datacenter = var.datacenter
@@ -137,39 +113,56 @@ resource "ibm_network_vlan" "private_vlan" {
137113
}
138114

139115
data "ibm_container_cluster_config" "cluster_config" {
140-
cluster_name_id = var.is_vpc_cluster ? ibm_container_vpc_cluster.cluster[0].id : ibm_container_cluster.cluster[0].id
116+
cluster_name_id = local.cluster_name_id
141117
resource_group_id = module.resource_group.resource_group_id
142118
}
143119

144120
# Sleep to allow RBAC sync on cluster
145121
resource "time_sleep" "wait_operators" {
146122
depends_on = [data.ibm_container_cluster_config.cluster_config]
147-
create_duration = "5s"
123+
create_duration = "45s"
148124
}
149125

150126
##############################################################################
151-
# Observability Agents
127+
# Observability Instance
152128
##############################################################################
153129

130+
module "observability_instances" {
131+
source = "terraform-ibm-modules/observability-instances/ibm"
132+
version = "2.19.1"
133+
providers = {
134+
logdna.at = logdna.at
135+
logdna.ld = logdna.ld
136+
}
137+
resource_group_id = module.resource_group.resource_group_id
138+
region = var.region
139+
cloud_logs_plan = "standard"
140+
cloud_monitoring_plan = "graduated-tier"
141+
enable_platform_logs = false
142+
enable_platform_metrics = false
143+
cloud_logs_instance_name = "${var.prefix}-cloud-logs"
144+
cloud_monitoring_instance_name = "${var.prefix}-cloud-monitoring"
145+
}
146+
147+
##############################################################################
148+
# Observability Agents
149+
##############################################################################
154150

155151
module "observability_agents" {
156-
source = "../.."
157-
depends_on = [time_sleep.wait_operators]
158-
is_vpc_cluster = var.is_vpc_cluster
159-
cluster_id = var.is_vpc_cluster ? ibm_container_vpc_cluster.cluster[0].id : ibm_container_cluster.cluster[0].id
160-
cluster_resource_group_id = module.resource_group.resource_group_id
161-
log_analysis_instance_region = module.observability_instances.region
162-
log_analysis_ingestion_key = module.observability_instances.log_analysis_ingestion_key
163-
cloud_monitoring_access_key = module.observability_instances.cloud_monitoring_access_key
164-
log_analysis_agent_tags = var.resource_tags
165-
log_analysis_add_cluster_name = true
166-
# example of how to include / exclude metrics - more info https://cloud.ibm.com/docs/monitoring?topic=monitoring-change_kube_agent#change_kube_agent_log_metrics
167-
cloud_monitoring_metrics_filter = [{ type = "exclude", name = "metricA.*" }, { type = "include", name = "metricB.*" }]
168-
cloud_monitoring_agent_tags = var.resource_tags
152+
source = "../.."
153+
depends_on = [time_sleep.wait_operators]
154+
cluster_id = local.cluster_name_id
155+
is_vpc_cluster = var.is_vpc_cluster
156+
cluster_resource_group_id = module.resource_group.resource_group_id
157+
# Logs Agent
158+
logs_agent_enabled = true
159+
logs_agent_iam_mode = "IAMAPIKey"
160+
logs_agent_iam_api_key = module.iam_service_id.service_id_apikey
161+
cloud_logs_ingress_endpoint = module.observability_instances.cloud_logs_ingress_private_endpoint
162+
cloud_logs_ingress_port = 3443
163+
logs_agent_enable_scc = false # only true for Openshift
164+
# # Monitoring agent
165+
cloud_monitoring_enabled = true
166+
cloud_monitoring_access_key = module.observability_instances.cloud_monitoring_access_key
169167
cloud_monitoring_instance_region = module.observability_instances.region
170-
# Log Analysis agent custom settings to setup Kubernetes metadata logs filtering by setting
171-
# LOGDNA_K8S_METADATA_LINE_INCLUSION and LOGDNA_K8S_METADATA_LINE_EXCLUSION in the agent daemonset definition
172-
# Ref https://github.com/logdna/logdna-agent-v2/blob/3.8/docs/KUBERNETES.md#configuration-for-kubernetes-metadata-filtering
173-
log_analysis_agent_custom_line_exclusion = "label.app.kubernetes.io/name:sample-app\\, annotation.user:sample-user"
174-
log_analysis_agent_custom_line_inclusion = "namespace:default"
175168
}
File renamed without changes.

examples/basic/provider.tf renamed to examples/obs-agent-iks/provider.tf

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,26 @@ provider "ibm" {
33
region = var.region
44
}
55

6+
provider "helm" {
7+
kubernetes {
8+
host = data.ibm_container_cluster_config.cluster_config.host
9+
token = data.ibm_container_cluster_config.cluster_config.token
10+
cluster_ca_certificate = data.ibm_container_cluster_config.cluster_config.ca_certificate
11+
}
12+
# IBM Cloud credentials are required to authenticate to the helm repo
13+
registry {
14+
url = "oci://icr.io/ibm/observe/logs-agent-helm"
15+
username = "iamapikey"
16+
password = var.ibmcloud_api_key
17+
}
18+
}
19+
20+
provider "kubernetes" {
21+
host = data.ibm_container_cluster_config.cluster_config.host
22+
token = data.ibm_container_cluster_config.cluster_config.token
23+
cluster_ca_certificate = data.ibm_container_cluster_config.cluster_config.ca_certificate
24+
}
25+
626
locals {
727
at_endpoint = "https://api.${var.region}.logging.cloud.ibm.com"
828
}
@@ -18,16 +38,3 @@ provider "logdna" {
1838
servicekey = module.observability_instances.log_analysis_resource_key != null ? module.observability_instances.log_analysis_resource_key : ""
1939
url = local.at_endpoint
2040
}
21-
22-
provider "kubernetes" {
23-
host = data.ibm_container_cluster_config.cluster_config.host
24-
token = data.ibm_container_cluster_config.cluster_config.token
25-
}
26-
27-
provider "helm" {
28-
kubernetes {
29-
host = data.ibm_container_cluster_config.cluster_config.host
30-
token = data.ibm_container_cluster_config.cluster_config.token
31-
cluster_ca_certificate = data.ibm_container_cluster_config.cluster_config.ca_certificate
32-
}
33-
}

0 commit comments

Comments
 (0)