organizationSecurityPolicies에서 firewallPolicies로 Terraform 리소스 마이그레이션

firewallPolicies 메서드를 사용하여 Cloud Next Generation Firewall 정책을 구성하는 것이 좋습니다. 이 문서에서는 organizationSecurityPolicies 메서드 대신 firewallPolicies 메서드를 사용하도록 Terraform 구성을 마이그레이션하는 방법을 안내합니다.

firewallPolicies 메서드는 세분화된 제어를 통해 조직 관리 옵션을 제공합니다. Terraform을 사용한 리소스 관리에는 firewallPolicies 메서드를 사용하는 것이 좋습니다. 이 문서에서는 사용자가 Terraform 권장사항과 기본 Terraform 작업에 익숙하다고 가정합니다.

방화벽 정책을 사용하면 연결을 명시적으로 거부하거나 허용할 수 있는 여러 방화벽 규칙을 그룹화할 수 있습니다. 방화벽 정책에 대한 자세한 내용은 방화벽 정책을 참고하세요.

firewallPolicies 메서드로 이전할 때의 이점

firewallPolicies 메서드는Google Cloud 리소스 계층 구조에서 일관된 방화벽 환경을 제공하며 여러 운영 이점을 제공합니다.

  • 향상된 조직 보안: firewallPolicies 메서드는 고급 Identity and Access Management (IAM) 권한 제어를 사용하여 조직 보안을 적용합니다.

  • 운영 용이성: firewallPolicies 메서드는 운영 용이성과 효율성을 위해 정규화된 도메인 이름 (FQDN) 객체, 위치정보 객체, 위협 감지, 침입 방지, 주소 그룹과 같은 고급 기능의 사용을 지원합니다.

마이그레이션 작동 방식

마이그레이션 프로세스를 시작하기 전에 시작하기 전에 섹션에 설명된 다음 단계를 완료해야 합니다.

  • Google Cloud용 Terraform 제공업체 버전 4.0.0 이상을 사용해야 합니다.
  • Terraform 상태가 현재 구성과 일치하는지 확인합니다.
  • 정책, 규칙, 연결 등 마이그레이션 범위에 속하는 리소스를 식별합니다.
  • firewallPolicies 리소스를 Terraform 상태로 가져오는 명령어를 수동으로 또는 자동화된 스크립트를 사용하여 준비합니다.
  • Terraform 버전에 권장되는 백업 및 복구 절차를 검토하고 현재 Terraform 상태의 백업을 만듭니다.

organizationSecurityPolicies 리소스를 마이그레이션하도록 Terraform을 재구성하는 프로세스에는 다음 단계가 포함됩니다.

  1. Terraform 상태에서 기존 리소스 삭제 Terraform 상태에서 기존 organizationSecurityPolicies 리소스를 삭제합니다.

  2. Terraform 구성 업데이트 Terraform 구성 파일을 수정하여 기존 리소스 유형, 이름, 속성을 새 리소스 유형, 이름, 속성으로 바꿉니다.

  3. Terraform 상태로 새 리소스 가져오기firewallPolicies 리소스를 Terraform 상태로 가져옵니다.

시작하기 전에

이 섹션에서는 마이그레이션 프로세스의 기본 요건을 설명합니다.

Terraform 공급자가 지원되는지 확인

Google Cloud용 Terraform 제공업체 버전 4.0.0 이상을 사용해야 합니다. 여기에는 Terraform 레지스트리의 다음 리소스가 포함됩니다.

Terraform 상태가 최신 상태인지 확인

다음 Terraform 명령어를 실행하여 Terraform 상태가 현재 구성과 일치하는지 확인합니다.

terraform plan

불일치를 방지하려면 마이그레이션 프로세스를 진행하기 전에 보류 중인 변경사항이나 작업을 적용하는 것이 좋습니다.

마이그레이션할 리소스 식별

다음 Terraform 명령어를 실행하여 정책, 규칙, 연결을 비롯해 이전 범위에 속하는 리소스 목록을 생성합니다.

terraform state list | grep ^google_compute_organization_security_policy

출력은 다음과 비슷합니다.

google_compute_organization_security_policy.policy
google_compute_organization_security_policy_association.association["folders/45678"]
google_compute_organization_security_policy_rule.rule["allow-inbound-ssh"]
google_compute_organization_security_policy_rule.rule["deny-all-egress"]

firewallPolicies 메서드로 이전하려면 이러한 리소스가 필요합니다. 나중에 사용할 수 있도록 저장합니다.

자동 스크립트를 사용하여 가져오기 명령어 준비

마이그레이션 중에 오류가 발생하거나 구성이 누락되지 않도록 자동화된 스크립트를 사용하여 firewallPolicies 리소스를 Terraform 상태로 가져오는 데 필요한 명령어를 생성하는 것이 좋습니다.

다음 Terraform 스크립트를 실행하여 이러한 작업을 수행합니다.

  • 기존 리소스 주소에서 새 리소스 주소를 생성합니다.
  • 기존 리소스 주소에서 리소스 식별자 (또는 리소스 ID)를 가져옵니다.
  • 리소스 ID에서 가져오기 식별자 (또는 가져오기 ID)를 생성합니다.
  • 모든 새 firewallPolicies 리소스의 가져오기 명령어를 표시합니다.
terraform state list | grep ^google_compute_organization_security_policy | while read -r resource_address; do
# Generate the new resource address for google_compute_firewall_policy
new_address=$(echo "$resource_address" | sed 's/google_compute_organization_security_policy/google_compute_firewall_policy/')

# Get the full resource ID from terraform state and remove quotes
resource_id=$(echo "$resource_address.id" | terraform console | tr -d '"')

# Use awk to parse the resource_id and generate the correct import identifier
import_id=$(echo "$resource_id" | awk -F'/' '
  /association/ {
    split($0, a, "/association/");
    assoc_name = a[2];
    gsub(/\//, "%2F", assoc_name);
    print $4 "/" assoc_name;
    next
  }
  /priority/ {
    print $4 "/" $6;
    next
  }
  {
    print $4
  }
')

# Print the final import command
echo "terraform import '$new_address' '$import_id'"
done

리소스를 가져오려면 이 스크립트의 출력이 필요합니다. 나중에 사용할 수 있도록 출력을 저장합니다.

가져오기 명령어를 수동으로 준비

자동화된 접근 방식이 불가능한 경우 firewallPolicies 리소스를 가져오기 위한 명령어를 수동으로 생성할 수 있습니다. terraform console 명령어를 사용하여 리소스의 식별자 (ID)를 가져올 수 있습니다.

다음 Terraform 명령어는 google_compute_organization_security_policy.policy 리소스의 리소스 ID를 표시합니다.

echo google_compute_organization_security_policy.policy.id | terraform console

출력은 다음과 비슷합니다.

"locations/global/securityPolicies/12345"

마찬가지로 마이그레이션할 리소스 식별 섹션에서 식별한 다른 리소스의 리소스 ID를 가져옵니다.

또는 다음 Terraform 명령어를 사용하여 식별된 모든 리소스의 리소스 ID를 한 번에 가져올 수 있습니다.

terraform state list | grep ^google_compute_organization_security_policy | while read -r line; do echo "$line".id | terraform console; done

출력은 다음과 비슷합니다.

"locations/global/securityPolicies/12345"
"locations/global/securityPolicies/12345/association/locations/global/securityPolicies/23456-folders/56789"
"locations/global/securityPolicies/12345/priority/1000"
"locations/global/securityPolicies/12345/priority/65535"

firewallPolicies 리소스를 가져오려면 가져오기 ID가 필요합니다. 가져오기 ID는 이 섹션에 설명된 대로 정책 번호라는 숫자 식별자, 연결 이름, 규칙 우선순위 번호로 구성됩니다.

  • 세 번째 슬래시 문자 (/) 뒤에 오는 숫자 식별자는 정책 번호이며, 이는 정책의 가져오기 ID를 나타냅니다. 다음 표는 정책의 리소스 ID와 가져오기 ID의 예를 보여줍니다.

    리소스 ID 가져오기 ID
    "locations/global/securityPolicies/12345" 12345
  • 정책 번호와 연결 이름은 연결의 가져오기 ID를 나타냅니다. 연결 이름은 /association/ 요소 뒤에 표시되는 리소스 ID의 일부입니다.

    연결 이름의 슬래시 문자 (/)를 %2F로 바꿔 terraform import 명령어가 연결 이름을 단일 항목으로 해석할 수 있도록 합니다. 다음 표는 연결의 리소스 ID와 가져오기 ID의 예를 보여줍니다.

    리소스 ID 가져오기 ID
    "locations/global/securityPolicies/12345/association/assoc-name" 12345/assoc-name
    "locations/global/securityPolicies/12345/association/locations/global/securityPolicies/23456-folders/56789" 12345/locations%2Fglobal%2FsecurityPolicies%2F23456-folders%2F56789
  • 정책 번호와 규칙 우선순위 번호는 규칙의 가져오기 ID를 나타냅니다. 다음 표는 규칙의 리소스 ID와 가져오기 ID의 예를 보여줍니다.

    리소스 ID 가져오기 ID
    "locations/global/securityPolicies/12345/priority/1000" 12345/1000

firewallPolicies 리소스를 가져오려면 업데이트된 리소스 인스턴스 이름이 필요합니다. 이전할 리소스 식별 섹션에서 식별한 모든 리소스에 대해 접두사 google_compute_organization_security_policygoogle_compute_firewall_policy로 바꿔 리소스 인스턴스 이름을 생성합니다. 다음 목록은 업데이트된 리소스 인스턴스 이름의 예를 보여줍니다.

google_compute_firewall_policy.policy
google_compute_firewall_policy_association.association["folders/45678"]
google_compute_firewall_policy_rule.rule["allow-inbound-ssh"]
google_compute_firewall_policy_rule.rule["deny-all-egress"]

리소스 인스턴스 이름을 연결된 가져오기 ID와 결합하여 terraform import 명령어를 가져옵니다. 다음 목록은 terraform import 명령어의 예를 보여줍니다.

terraform import 'google_compute_firewall_policy.policy' '12345'
terraform import 'google_compute_firewall_policy_association.association["folders/23456"]' '12345/locations%2Fglobal%2FsecurityPolicies%2F23456-folders%2F56789'
terraform import 'google_compute_firewall_policy_rule.rule["allow-inbound-ssh"]' '12345/1000'
terraform import 'google_compute_firewall_policy_rule.rule["deny-all-egress"]' '12345/65535'

나중에 참조할 수 있도록 이러한 가져오기 명령어를 저장합니다.

Terraform 상태 백업

마이그레이션 프로세스를 진행하기 전에 Terraform 상태의 백업을 만드는 것이 좋습니다. 다음 Terraform 명령어를 사용하여 terraform.tfstate.backup 파일에 백업을 만듭니다.

terraform state pull > terraform.tfstate.backup

의도하지 않은 방식으로 Terraform 상태를 변경한 경우 백업 파일 terraform.tfstate.backup를 사용하여 다음 명령어를 통해 원래 Terraform 상태를 복원할 수 있습니다.

terraform state push terraform.tfstate.backup

리소스 organizationSecurityPolicies개 이전

이 섹션에서는 Terraform 구성을 organizationSecurityPolicies 메서드에서 firewallPolicies 메서드로 이전하는 절차를 설명합니다.

Terraform 상태에서 기존 리소스 삭제

마이그레이션할 리소스 식별 섹션에 있는 organizationSecurityPolicies 리소스를 Terraform 상태에서 삭제하려면 다음 Terraform 명령어를 실행합니다.

terraform state list | grep ^google_compute_organization_security_policy | while read -r resource; do
  terraform state rm "$resource"
done

Terraform 구성 업데이트

Terraform 구성 파일을 업데이트하려면 이전할 리소스 식별 섹션에서 찾은 리소스의 정의를 찾습니다. 다음 명령어를 사용하여 정의를 찾습니다.

grep -r google_compute_organization_security_policy .

예를 들어 Terraform 구성 파일은 다음과 같은 방식으로 google_compute_organization_security_policy.policy 정책을 정의합니다.

resource "google_compute_organization_security_policy" "policy" {
  …
  }

다음 표를 사용하여 조직 보안 정책 리소스의 정의를 수정하여 새 계층적 방화벽 정책 리소스를 만듭니다.

기존 Terraform 리소스 새 Terraform 리소스
리소스 이름 google_compute_organization_security_policy google_compute_firewall_policy
정책의 필드 이름 display_name short_name

다음 표를 사용하여 조직 보안 정책 연결 리소스의 정의를 수정하여 새 계층적 방화벽 정책 연결 리소스를 만듭니다.

기존 Terraform 리소스 새 Terraform 리소스
리소스 이름 google_compute_organization_security_policy_association google_compute_firewall_policy_association
연결의 필드 이름 policy_id firewall_policy
연결의 필드 이름 attachment_id attachment_target

다음 표를 사용하여 조직 보안 정책 규칙 리소스의 정의를 수정하여 새 계층적 방화벽 정책 규칙 리소스를 만듭니다.

기존 Terraform 리소스 새 Terraform 리소스
리소스 이름 google_compute_organization_security_policy_rule google_compute_firewall_policy_rule
규칙의 필드 이름 policy_id (보안 정책 ID) firewall_policy
규칙에서 삭제된 필드의 이름 versioned_expr — (필드가 존재하지 않음)
match 객체 정의: config 세트를 삭제하고 layer4_configlayer4_configs으로 변경
match {
  config {
    src_ip_ranges = SRC_IP_RANGES
    dest_ip_ranges = DEST_IP_RANGES
    layer4_config {
      ip_protocol = IP_PROTOCOL
      ports = [PORT1, PORT2]
    }
    layer4_config {
      ip_protocol = IP_PROTOCOL
    }
  }
}
  
match {
  src_ip_ranges = SRC_IP_RANGES
  dest_ip_ranges = DEST_IP_RANGES
  layer4_configs {
    ip_protocol = IP_PROTOCOL
    ports = [PORT1, PORT2]
  }
  layer4_configs {
    ip_protocol = IP_PROTOCOL
  }
}
  
규칙의 필드 이름 layer4_config layer4_configs

다음 Terraform 명령어를 사용하여 수정된 Terraform 구성이 유효한지 확인할 수 있습니다.

terraform validate

Terraform 상태로 리소스 가져오기

firewallPolicies 리소스를 Terraform 구성 파일로 가져오려면 자동 스크립트를 사용하여 가져오기 명령어 준비 또는 가져오기 명령어 수동으로 준비 섹션에서 생성한 Terraform 가져오기 명령어를 실행합니다.

firewallPolicies 리소스를 가져온 후 Terraform은 firewallPolicies 메서드를 사용하여 리소스에 액세스합니다.

Terraform 구성 확인 및 불일치 수정

다음 Terraform 명령어를 실행하여 작업을 확인합니다.

terraform plan

이전으로 인해 기본 Google Cloud 리소스가 변경되지 않으므로 Terraform에서 생성하는 계획에는 작업이 포함되지 않아야 합니다.

예를 들어 terraform plan 명령어를 실행하여 얻은 다음 출력에서 Terraform 작업은 리소스 google_compute_firewall_policy_associationname을 업데이트해야 함을 나타냅니다.

Terraform will perform the following actions:

 # google_compute_firewall_policy_association.association["folders/23456"] must be replaced
-/+ resource "google_compute_firewall_policy_association" "association" {
    ~ firewall_policy   = "12345" -> "locations/global/firewallPolicies/12345"
    ~ id                = "locations/global/firewallPolicies/12345/associations/locations%2Fglobal%2FsecurityPolicies%2F12345-folders%2F23456" -> (known after apply)
    ~ name              = "locations/global/securityPolicies/12345-folders/23456" -> "locations/global/firewallPolicies/12345-folders/23456" # forces replacement
    + short_name        = (known after apply)
      # (1 unchanged attribute hidden)
  }

이 경우 name 속성이 이미 설치된 이름과 일치하도록 Terraform 구성 파일을 확인하고 업데이트해야 합니다.

다음과 같이 구성에서 name 필드를 대체하여 리소스 google_compute_firewall_policy_association의 예상 name를 원래 값 locations/global/securityPolicies/12345-folders/23456로 변경하도록 Terraform을 구성할 수 있습니다.

name = "${replace(local.policy_id, "firewallPolicies", "securityPolicies")}-${each.value}"

위의 변경사항에서는 replace 함수를 사용하여 local.policy_id 값을 firewallPolicies 대신 securityPolicies로 업데이트합니다. 이제 Terraform은 name 속성에 locations/global/securityPolicies/12345-folders/23456를 예상하므로 terraform plan를 실행해도 더 이상 name 속성과 관련된 Terraform 작업이 표시되지 않습니다.

terraform plan 명령어에 변경사항이나 Terraform 작업이 표시되지 않으면 이전이 완료된 것입니다.

다음 단계