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

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

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

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

시작하기 전에

  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인합니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음 옵션 중 하나를 선택하여 Compute Engine에 인증하면 됩니다.

    로컬 개발 환경에서 이 페이지의 Terraform 샘플을 사용하려면 gcloud CLI를 설치하고 초기화한 후 사용자 인증 정보로 애플리케이션 기본 사용자 인증 정보를 설정합니다.

    1. Google Cloud CLI를 설치합니다.

    2. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

    3. 로컬 셸을 사용하는 경우 사용자 계정에 대한 로컬 인증 사용자 인증 정보를 만듭니다.

      gcloud auth application-default login

      Cloud Shell을 사용하는 경우 이 작업을 수행할 필요는 없습니다.

      인증 오류가 반환되고 외부 ID 공급업체(IdP)를 사용하는 경우 제휴 ID로 gcloud CLI에 로그인했는지 확인합니다.

    자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

시작하기 전에

필수 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
}

# 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_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}"
     }
    

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

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

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

동적 범위 지정을 효율적으로 관리하려면 Cloud Build를 사용하여 상태 비저장 자동 워크플로를 구현하세요.

  1. Terraform을 초기화합니다. 영구적이지 않은 임시 로컬 백엔드를 사용하여 terraform init를 실행합니다.
  2. 타겟 프로젝트를 검색합니다. 동적 범위 지정 기준에 따라 현재 타겟 프로젝트 목록을 생성합니다.
  3. 기존 리소스 가져오기 terraform import를 실행하여 기존 google_project_service, 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 Config 에이전트 버전을 확인하고, 조직의 모든 프로젝트에서 운영체제 세부정보를 검사할 수 있습니다.

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

다음 단계