terraform.gcp.best-practice.gcp-gke-use-cos-image.gcp-gke-use-cos-image
semgrep
Author
unknown
Download Count*
License
Ensure Container-Optimized OS (cos) is used for Kubernetes Engine Clusters Node image
Run Locally
Run in CI
Defintion
rules:
- id: gcp-gke-use-cos-image
patterns:
- pattern: resource
- pattern-inside: |
resource "google_container_node_pool" "..." {
...
}
- pattern-not-inside: |
resource "google_container_node_pool" "..." {
...
node_config {
...
image_type = "COS"
}
...
}
message: Ensure Container-Optimized OS (cos) is used for Kubernetes Engine
Clusters Node image
metadata:
category: best-practice
technology:
- terraform
- gcp
license: Commons Clause License Condition v1.0[LGPL-2.1-only]
languages:
- hcl
severity: WARNING
Examples
gcp-gke-use-cos-image.tf
# fail
# ruleid: gcp-gke-use-cos-image
resource "google_container_node_pool" "fail" {
autoscaling {
max_node_count = "4"
min_node_count = "1"
}
cluster = google_container_cluster.tfer.name
initial_node_count = "2"
location = "us-west1"
management {
auto_repair = "true"
auto_upgrade = "true"
}
max_pods_per_node = "110"
name = "async-pool-2"
node_config {
disk_size_gb = "400"
disk_type = "pd-ssd"
image_type = "SomethingElse"
labels = {
async = "true"
}
local_ssd_count = "0"
machine_type = "custom-32-65536"
metadata = {
async = "true"
disable-legacy-endpoints = "true"
}
oauth_scopes = ["https://www.googleapis.com/auth/cloud-platform"]
preemptible = "false"
service_account = "default"
shielded_instance_config {
enable_integrity_monitoring = "true"
enable_secure_boot = "true"
}
}
node_count = "1"
node_locations = ["us-west1-b", "us-west1-a"]
project = "test-project"
upgrade_settings {
max_surge = "1"
max_unavailable = "0"
}
version = "1.14.10-gke.36"
zone = "us-west1"
}
# ok: gcp-gke-use-cos-image
resource "google_container_node_pool" "success" {
autoscaling {
max_node_count = "4"
min_node_count = "1"
}
cluster = google_container_cluster.tfer.name
initial_node_count = "2"
location = "us-west1"
management {
auto_repair = "true"
auto_upgrade = "true"
}
max_pods_per_node = "110"
name = "async-pool-2"
node_config {
disk_size_gb = "400"
disk_type = "pd-ssd"
image_type = "COS"
labels = {
async = "true"
}
local_ssd_count = "0"
machine_type = "custom-32-65536"
metadata = {
async = "true"
disable-legacy-endpoints = "true"
}
oauth_scopes = ["https://www.googleapis.com/auth/cloud-platform"]
preemptible = "false"
service_account = "default"
shielded_instance_config {
enable_integrity_monitoring = "true"
enable_secure_boot = "true"
}
}
node_count = "1"
node_locations = ["us-west1-b", "us-west1-a"]
project = "test-project"
upgrade_settings {
max_surge = "1"
max_unavailable = "0"
}
version = "1.14.10-gke.36"
zone = "us-west1"
}
Short Link: https://sg.run/D6YP