Terraform을 사용하여 조직 전체에서 VM Manager 설정

일관된 운영체제 구성을 적용하고 규정 준수를 자동화하려면 리소스 계층 구조 Google Cloud 전반에서 Terraform을 사용하여 조직 수준에서 VM Manager를 구성합니다.

이 문서에서는 Terraform을 사용하여 VM Manager (OS 구성 API)를 자동으로 사용 설정하고, 일반적인 인스턴스 메타데이터를 설정하고, 리소스 계층 구조의 모든 대상 프로젝트에 OS 정책을 할당하는 방법을 설명합니다.

VM Manager에 사용할 수 있는 Terraform 리소스의 개요는 Terraform을 사용하여 VM Manager 리소스 프로비저닝을 참고하세요.

시작하기 전에

시작하기 전에

필수 IAM 권한

VM Manager를 자동으로 사용 설정하고 여러 프로젝트에 OS 정책을 할당하려면 Terraform을 실행하는 보안 주체 또는 서비스 계정에 특정 Identity and Access Management (IAM) 권한이 필요합니다.

대상 프로젝트 권한

VM Manager 서비스를 활성화하고 프로젝트 메타데이터를 설정하는 데 필요한 권한을 얻으려면 관리자에게 각 대상 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참고하세요.

이러한 사전 정의된 역할에는 VM Manager 서비스를 활성화하고 프로젝트 메타데이터를 설정하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

VM Manager 서비스를 활성화하고 프로젝트 메타데이터를 설정하려면 다음 권한이 필요합니다.

  • serviceusage.services.enable
  • compute.projects.setCommonInstanceMetadata

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

서비스 계정 및 커스텀 역할 설정

중앙 집중식 Terraform 자동화를 실행할 전용 서비스 계정을 만드는 것이 좋습니다.

여러 프로젝트에서 이 서비스 계정에 필요한 권한을 부여하려면 조직 수준에서 IAM 커스텀 역할을 만듭니다.

  1. serviceusage.services.enablecompute.projects.setCommonInstanceMetadata를 포함하는 조직 수준 커스텀 역할을 만듭니다.
  2. 조직 또는 폴더 수준과 같이 가장 낮은 적용 가능한 범위에서 서비스 계정에 커스텀 역할을 부여합니다. 예를 들어 대상 프로젝트가 모두 특정 폴더에 포함되어 있는 경우 폴더 수준에서 역할을 부여합니다.

Terraform을 사용하여 VM Manager 사용 설정

VM Manager를 사용 설정하고 여러 프로젝트에 OS 정책을 할당하려면 골든 프로젝트 청사진 또는 중앙 집중식 프로젝트 관리와 같은 자동화된 접근 방식 중 하나를 사용합니다.

골든 프로젝트 청사진 사용

조직에서 표준화된 Terraform 프로젝트 모듈 (골든 청사진) 또는 중앙에서 적용되는 프로젝트 프로비저닝 메커니즘을 사용하는 경우 프로젝트 청사진에 다음 리소스 정의를 추가합니다.

VM Manager를 사용 설정하려면 다음 서비스 및 메타데이터 리소스를 포함합니다.

# Enable the OS Config API
resource "google_project_service" "osconfig" {
  service            = "osconfig.googleapis.com"
  disable_on_destroy = false
}

# Explicitly provision the OS Config Service Agent
resource "google_project_service_identity" "osconfig_identity" {
  provider = google-beta
  project  = google_project_service.osconfig.project
  service  = "osconfig.googleapis.com"
}

# Grant the required role to the explicitly provisioned Service Agent
resource "google_project_iam_member" "osconfig_service_agent_binding" {
  project = google_project_service.osconfig.project
  role    = "roles/osconfig.serviceAgent"
  member  = "serviceAccount:${google_project_service_identity.osconfig_identity.email}"
}

# Set project metadata to enable VM Manager
resource "google_compute_project_metadata_item" "enable_osconfig" {
  key   = "enable-osconfig"
  value = "TRUE"
}

청사진으로 프로비저닝된 모든 VM에 OS 정책 할당을 배포하려면 다음 정책 할당 리소스를 추가합니다.

resource "google_os_config_os_policy_assignment" "base_security_policy" {
  name        = "base-security-ospolicy"
  description = "Ensure baseline security agent is installed and operational"
  location    = var.zone

  os_policies {
    id   = "no-op-policy"
    mode = "ENFORCEMENT"

    resource_groups {
      resources {
        id = "sample"
        exec {
          validate {
            interpreter = "SHELL"
            script      = "exit 100"
          }
          enforce {
            interpreter = "SHELL"
            script      = "exit 100"
          }
        }
      }
    }
  }

  os_policies {
    id   = "install-security-agent"
    mode = "ENFORCEMENT"

    resource_groups {
      resources {
        id = "install-agent"
        pkg {
          desired_state = "INSTALLED"
          apt {
            name = "security-agent"
          }
          yum {
            name = "security-agent"
          }
        }
      }
    }
  }

  instance_filter {
    all = true
  }

  rollout {
    disruption_budget {
      percent = 10
    }
    min_wait_duration = "3.5s"
  }
}

모든 프로젝트를 중앙에서 관리

골든 프로젝트 청사진을 수정하는 것이 적합하지 않은 경우 Terraform for_each 인수를 사용하여 여러 기존 프로젝트에서 VM Manager 사용 설정 및 OS 정책 할당을 중앙에서 관리할 수 있습니다.

대상 프로젝트에서 VM Manager를 사용 설정하려면 for_each 인수를 사용하여 프로젝트 맵을 반복합니다.

resource "google_project_service" "osconfig" {
  for_each           = var.target_projects
  project            = each.key
  service            = "osconfig.googleapis.com"
  disable_on_destroy = false
}

resource "google_project_service_identity" "osconfig_identity" {
  provider = google-beta
  for_each = var.target_projects
  project  = google_project_service.osconfig[each.key].project
  service  = "osconfig.googleapis.com"
}

resource "google_project_iam_member" "osconfig_service_agent_binding" {
  for_each = var.target_projects
  project  = google_project_service.osconfig[each.key].project
  role     = "roles/osconfig.serviceAgent"
  member   = "serviceAccount:${google_project_service_identity.osconfig_identity[each.key].email}"
}

resource "google_compute_project_metadata_item" "enable_osconfig" {
  for_each = var.target_projects
  project  = each.key
  key      = "enable-osconfig"
  value    = "TRUE"
}

대상 프로젝트에 OS 정책을 할당하려면 for_each 인수를 사용하여 정책 할당 리소스를 정의합니다.

resource "google_os_config_os_policy_assignment" "observability_agent_policy" {
  for_each    = var.target_projects
  project     = each.key
  name        = "observability-agent-ospolicy"
  description = "Install Google Cloud Observability agent on CentOS VMs across target projects"
  location    = var.zone

  os_policies {
    id   = "setup-repo-and-install-package-policy"
    mode = "ENFORCEMENT"

    resource_groups {
      inventory_filters {
        os_short_name = "centos"
        os_version    = "8"
      }

      resources {
        id = "setup-repo"
        repository {
          yum {
            id           = "google-cloud-ops-agent"
            display_name = "Google Cloud Ops Agent Repository"
            base_url     = "https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el8-x86_64-all"
            gpg_keys = [
              "https://packages.cloud.google.com/yum/doc/yum-key.gpg",
              "https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg",
            ]
          }
        }
      }

      resources {
        id = "install-pkg"
        pkg {
          desired_state = "INSTALLED"
          yum {
            name = "google-cloud-ops-agent"
          }
        }
      }
    }
  }

  instance_filter {
    all = true
  }

  rollout {
    disruption_budget {
      percent = 10
    }
    min_wait_duration = "3.5s"
  }
}

대상 프로젝트 정의

고정 범위 지정 또는 동적 범위 지정을 사용하여 Terraform 구성에 var.target_projects 맵을 제공할 수 있습니다.

  • 고정 범위 지정. 로컬 변수 또는 외부 데이터 파일에서 프로젝트 ID의 명시적 목록을 유지합니다. 고정 범위 지정을 사용하려면 프로젝트를 만들거나 삭제할 때마다 목록을 업데이트해야 합니다.
  • 동적 범위 지정. 리소스 계층 구조 규칙 (예: 조직 또는 폴더 내의 모든 프로젝트)을 기반으로 대상 프로젝트를 검색합니다. google_projects 데이터 소스를 사용하여 프로젝트를 쿼리할 수 있습니다.

     data "google_projects" "in_folder" {
     filter = "parent.id:${local.folder_id}"
     }
    

    예외를 처리하려면 특정 제외 라벨이 포함된 프로젝트를 필터링합니다. 또한 local_exec를 사용하여 Google Cloud CLI 명령어 (gcloud asset search-all-resources 등)를 실행하여 동적 대상 목록을 생성하는 외부 스크립트를 실행할 수도 있습니다.

스테이트리스 자동화 워크플로 설정

동적 범위 지정을 사용하면 대상 프로젝트 목록이 지속적으로 변경됩니다. 표준 영구 Terraform 상태 파일을 사용하려면 새 리소스를 가져오고 상태에서 삭제된 프로젝트를 삭제하는 수동 작업이 필요합니다.

동적 범위 지정을 효율적으로 관리하려면 Cloud Build를 사용하여 스테이트리스 자동화 워크플로를 구현합니다.

  1. Terraform을 초기화합니다. 비영구적인 임시 로컬 백엔드를 사용하여 terraform init를 실행합니다.
  2. 대상 프로젝트를 검색합니다. 동적 범위 지정 기준에 따라 대상 프로젝트의 현재 목록을 생성합니다.
  3. 기존 리소스를 가져옵니다. terraform import를 실행하여 기존 google_project_service, google_project_service_identity, google_project_iam_member, google_compute_project_metadata_item, google_os_config_os_policy_assignment 리소스를 로컬 상태로 가져옵니다.
  4. 구성을 적용합니다. 검색된 프로젝트 목록을 선언에 전달하여 표준 Terraform 명령어 (terraform planterraform apply)를 실행합니다.
  5. 실행 아티팩트를 저장합니다. 선택적으로 감사 목적으로 계획 출력, 상태 스냅샷, 복사 요약을 Cloud Storage 버킷에 저장합니다.

Cloud Build 파이프라인이 정기적으로 (예: 매일 또는 매주) 실행되도록 예약하여 구성 드리프트를 자동으로 감지하고 조직 전반에서 규정 준수를 적용합니다.

조직 수준 VM Manager 상태 보기

조직 전체에서 VM Manager를 설정한 후 계층 구조의 모든 프로젝트에서 사용 설정 및 운영체제 상태 보고서를 볼 수 있습니다. Cloud 애셋 인벤토리 데이터를 BigQuery로 내보내면 SQL 쿼리를 실행하여 VM Manager가 사용 설정되어 있는지 확인하고, OS 구성 에이전트 버전을 확인하고, 조직의 모든 프로젝트에서 운영체제 세부정보를 검사할 수 있습니다.

데이터를 내보내고 상태 보고서 쿼리를 실행하는 방법을 알아보려면 Cloud 애셋 인벤토리 및 BigQuery를 사용하여 조직의 VM Manager 상태 보기를 참고하세요.

다음 단계