자동화된 네트워크 배포: Terraform으로 GCP와 AWS 사이에서 VPN 빌드

이 가이드에서는 HashiCorp의 Terraform을 사용하여 Google Cloud Platform(GCP)과 Amazon Web Services(AWS) 간에 가상 사설망(VPN)을 사용해 안전한 비공개 사이트 간 연결을 만드는 방법을 보여 줍니다. 다중 클라우드로 구성된 배포입니다.

이 가이드는 일반적인 네트워킹 리소스 패턴의 자동 배포를 설명하는 3부로 구성된 시리즈 중 세 번째 파트입니다. 가이드에서는 자동화된 네트워크 배포: 개요 가이드에 설명된 인증 및 프로젝트 구성을 사용합니다.

이 가이드에서는 GCP 및 AWS의 커스텀 가상 사설 클라우드(VPC) 네트워크에 가상 머신(VM) 인스턴스를 배포합니다. 그런 다음 지원 인프라를 배포해 GCP와 AWS VPC 네트워크 간의 인터넷 프로토콜 보안(IPsec) 터널 2개로 VPN 연결을 구성합니다. 환경 및 터널 배포는 보통 4분 안에 완료됩니다.

이 가이드가 자동화된 네트워크 배포: 시작 가이드에서 확장된 내용이기는 하지만 리소스가 GCP 외부의 제공업체에 배포되기 때문에 배포 관리자 구성은 포함되지 않습니다. GCP를 포함해 다중 공용 클라우드 제공업체를 사용하여 리소스를 배포하기 위해 이 가이드에서는 대신 Terraform 구성 파일을 사용합니다. 다중 클라우드 배포는 배포 관리자의 대상 범위를 벗어납니다.

비용

이 가이드에서는 다음과 같은 청구 가능한 GCP 및 AWS의 구성요소를 사용합니다.

  • Compute Engine 인스턴스 및 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스
  • 더 높은 네트워크 처리량을 지원하기 위한 다중 vCPU 인스턴스
  • 영구 디스크 및 블록 저장소
  • 네트워킹 송신
  • VPN 터널

VM 인스턴스의 발신 또는 송신 트래픽에는 최대 네트워크 송신 처리량 한도가 적용됩니다. 이 가이드에서는 여러 vCPU 머신 유형을 사용하여 네트워크 송신 트래픽을 위한 여유 공간을 허용합니다.

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

시작하기 전에

  1. 이름이 gcp-automated-networks인 GCP 프로젝트를 선택합니다.

    프로젝트 페이지로 이동

  2. Cloud Shell 인스턴스를 시작합니다. Cloud Shell에서 이 가이드의 모든 터미널 명령어를 실행합니다.

    Cloud Shell 열기

배포 아키텍처

이 가이드에서는 다음 배포 환경을 구축합니다.

배포 환경

이 가이드에서는 다음을 안내합니다.

GCP의 경우 경로를 사용하여 등가 다중 경로(ECMP) 라우팅을 지원하는 반면, AWS에서는 중복과 가용성을 위해 활성 및 대기 등 터널 2개를 사용하여 VPN 게이트웨이를 지원합니다.

라우팅

가이드 구성에서는 Cloud Router를 사용해 동적 라우팅을 보여 줍니다. Cloud Router에서는 Border Gateway Protocol(BGP)을 사용하여 VPC 네트워크 경로 업데이트를 AWS의 환경과 교환합니다. Cloud Router를 통한 동적 라우팅을 위해서는 IPsec 터널마다 별도의 Cloud Router가 필요합니다. 또는 정적 경로를 사용해 설정을 구성할 수 있습니다. Cloud VPN Interop 가이드에서는 이 2가지 구성을 모두 다룹니다.

GCP 작업 환경 준비

이 섹션에서는 다음 작업을 수행합니다.

  • 가이드 코드를 복제합니다.
  • GCP 지역 및 영역을 확인합니다.

가이드 코드 복제

  1. GitHub에서 가이드 코드를 복제합니다.

    git clone https://github.com/GoogleCloudPlatform/autonetdeploy-multicloudvpn.git
  2. 가이드 디렉토리로 이동합니다.

    cd autonetdeploy-multicloudvpn
    

GCP 지역 및 영역 확인

Compute Engine 인스턴스, VPN 게이트웨이, Cloud Router를 비롯해 이 가이드에 나오는 특정 클라우드 리소스를 사용하려면 원하는 배치 지역이나 영역 또는 둘 다 명시적으로 선언해야 합니다. 자세한 내용은 GCP의 지역 및 영역을 참조하세요.

이 가이드에서는 각 제공업체에 하나의 지역만 있으면 됩니다. 두 클라우드 간에 연결을 최적화하려면 서로 가까운 지역을 선택하세요. 다음 표에는 가이드 파일 terraform/gcp_variables.tfterraform/aws_variables.tf에서 설정된 값이 나와 있습니다.

필드 이름 GCP 값 AWS 값
Region Name us-west1 US West (us-west-2)
Location The Dalles, Oregon, USA Oregon

AWS 사용 준비

이 섹션에서는 AWS 지역을 확인합니다. AWS 지역에 대한 자세한 내용은 AWS의 지역 및 가용성 영역을 참조하세요.

  1. AWS 관리 콘솔에 로그인하고 VPC 대시보드로 이동합니다. 풀다운 메뉴를 사용하여 오리건 지역을 선택합니다.

  2. EC2 대시보드VPC 대시보드에서 이 가이드에서 사용되는 리소스를 검토합니다.

Terraform 준비

이 섹션에서는 Terraform 실행 파일을 다운로드합니다.

  • Cloud Shell에서 다음 스크립트를 실행합니다.

    ./get_terraform.sh
    

    이 스크립트에서 Terraform 도구의 실행 가능한 바이너리를 ~/terraform 디렉토리에 다운로드하고 압축을 해제합니다. 스크립트 출력에 PATH를 업데이트하기 위한 내보내기 명령어가 표시됩니다. PATH를 업데이트한 후에 Terraform이 작동하는지 확인합니다.

    terraform --help
    

    출력 결과는 다음과 같습니다.

    Usage: terraform [--version] [--help] [command] [args]
    ...
    

도움이 필요하면 Terraform 다운로드Terraform 설치 주제를 참조하세요.

GCP and AWS 액세스 사용자 인증 정보 만들기

개요 가이드에서 사용자 인증 정보를 만들었습니다. 하지만 Terraform에 사용자 인증 정보를 등록해야 합니다.

  1. Terraform에 GCP 사용자 인증 정보를 등록합니다.

    ./gcp_set_credentials.sh exists
    

    출력 결과는 다음과 같습니다.

    Updated gcp_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    
  2. Terraform에 AWS 사용자 인증 정보를 등록합니다.

    ./aws_set_credentials.sh exists
    

    출력 결과는 다음과 같습니다.

    Updated aws_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    

프로젝트 설정

GCP에서는 자동화 도구에서 GCP 프로젝트를 사용하도록 지정하는 여러 가지 방법을 제공합니다. 편의를 위해, 환경에서 프로젝트 ID를 가져오는 대신 템플릿 파일의 문자열 변수에서 프로젝트가 확실하게 구분됩니다.

  1. 프로젝트 ID를 설정합니다.

    gcloud config set project [YOUR-PROJECT-ID]

    출력 결과는 다음과 같습니다.

    Updated property [core/project].
    
  2. 제공된 스크립트를 사용하여 Terraform의 구성 파일에서 프로젝트 값을 업데이트합니다.

    ./gcp_set_project.sh
    

    출력 결과는 다음과 같습니다.

    Updated gcp_project_id in /home/[USER]/autonetdeploy-gcpawsvpn/terraform/terraform.tfvars.
    
  3. 업데이트된 파일 terraform/terraform.tfvars를 검토하여 project-id가 삽입되었는지 확인합니다.

  4. 일회용 terraform init 명령어를 실행하여 이 배포에 대한 Terraform 공급자를 설치합니다.

    pushd ./terraform && terraform init && popd > /dev/null
    
  5. Terraform plan 명령어를 실행하여 사용자 인증 정보를 확인합니다.

    pushd ./terraform && terraform plan && popd > /dev/null
    

    빨간색 오류 텍스트가 표시되지 않으면 인증이 제대로 작동하고 있는 것입니다.

    출력 결과는 다음과 같습니다.

    Refreshing Terraform state in-memory prior to plan...
    ...
     +google_compute_instance.gcp-vm
    ...
    Plan: 34 to add, 0 to change, 0 to destroy.
    

Terraform 구성 파일 검사

Terraform에서 배포 구성은 파일 디렉토리에 의해 정의됩니다. JSON 파일을 활용할 수도 있지만, 읽거나 유지관리가 쉬운 Terraform 구성 파일(.tf 파일) 구문을 사용하는 것이 더 좋습니다. 이 가이드는 리소스를 명확하게 정리하는 방법을 보여주는 파일 모음을 제공합니다. 이 파일 모음은 실제 작동하는 배포이며 실행을 위해 편집할 필요가 없습니다.

파일 이름 목적
main.tf 제공업체를 정의하고 이 구성에 배포할 클라우드를 지정합니다. 또한 사용자 인증 정보, 프로젝트 이름, 선택한 지역을 읽습니다.
gcp_variables.tf, aws_variables.tf 배포를 매개변수화하고 맞춤설정하는 데 사용되는 변수를 선언합니다(예: gcp_regiongcp_instance_type).
gcp_compute.tf, aws_compute.tf 배포에 사용되는 컴퓨팅 리소스를 정의합니다(예: google_compute_instance).
vm_userdata.sh VM 인스턴스를 시작할 때 실행할 스크립트를 지정합니다. iperf3 테스트 도구와 일부 래퍼 스크립트를 자동으로 설정합니다.
gcp_networking.tf, aws_networking.tf google_compute_network, google_compute_subnetwork, google_compute_address, google_compute_vpn_gateway, google_compute_vpn_tunnel을 포함하는 네트워킹 리소스를 정의합니다.
gcp_security.tf, aws_security.tf GCP 또는 AWS 환경에서 google_compute_firewall 규칙 및 aws_security_group 리소스를 비롯해 테스트 트래픽을 허용하기 위한 리소스를 정의합니다.
gcp_outputs.tf, aws_outputs.tf 배포 완료 시 출력될 변수를 정의합니다(예: 배포된 VM 인스턴스의 external_ipinternal_ip).
terraform.tfstate [OUTPUT]. 클라우드 확인 후 클라이언트 측 리소스 상태를 저장하기 위해 Terraform에 사용되는 파일을 지정합니다. 자세한 내용은 Terraform을 사용하여 GCP 프로젝트 관리를 참조하세요.
run_graph.sh Terraform에서 리소스 종속 항목을 보여 주는 PNG 파일을 생성하기 위한 셸 스크립트. 이 스크립트의 출력은 images/gcpawsvpn_plan_graph.png에서 볼 수 있습니다.

이 가이드에서는 스크립트를 사용하여 terraform.tfvars 파일을 만듭니다. 이 파일에는 credentialsgcp_project_id의 사용자별 설정이 포함됩니다.

VPC 네트워크, VM 인스턴스, VPN 게이트웨이, IPsec 터널 배포

여러 클라우드 간에 연결을 구성하는 작업은 복잡합니다. 두 환경에서 많은 리소스를 배포할 수 있지만 IPsec 터널을 빌드할 때는 상호 종속성을 신중하게 정렬해야 합니다. 이러한 이유로 코드에서 안정적인 배포 구성을 설정하면 배포 지식의 범위를 넓히는 데 도움이 됩니다. 다음 그림에서는 여러 제공업체에서 이러한 배포 구성을 만드는 데 필요한 단계를 간략하게 보여 줍니다.

배포 단계

Terraform을 사용하여 배포

Terraform에서는 terraform.tfstate 파일을 사용해 리소스 상태를 캡처합니다. 읽을 수 있는 형식으로 현재 리소스 상태를 보려면 terraform show를 실행하면 됩니다.

Terraform이 제공업체에서 올바르게 인증을 받기 위해서는 먼저 개요 가이드를 완료해야 합니다. 다음 단계에서는 Terraform을 이미 구성했다고 가정합니다.

  1. Cloud Shell에서 terraform 디렉토리로 이동합니다.

    pushd terraform
    
  2. Terraform validate 명령어를 사용하여 구성 파일의 구문 유효성을 검사합니다. 이 유효성 검사는 후속 단계에서 planapply 명령어의 일부로 수행되는 과정보다는 간단합니다. validate 명령어는 제공업체로 인증하지 않습니다.

    terraform validate
    

    오류 메시지가 표시되지 않으면 파일 구문 및 기본 시맨틱스의 초기 유효성 검사가 완료된 것입니다. 오류 메시지가 표시되면 검증이 실패한 것입니다.

  3. Terraform plan 명령어를 사용하여 클라우드에서 리소스를 인스턴스화하지 않고 배포를 검토합니다. plan 명령어에서는 구성에서 지정된 모든 제공업체가 성공적으로 인증되어야 합니다.

    terraform plan
    

    plan 명령어는 추가, 제거 또는 업데이트할 리소스의 출력 목록을 반환합니다. plan 출력의 마지막 줄은 추가, 변경 또는 삭제될 리소스 수를 보여줍니다.

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 34 to add, 0 to change, 0 to destroy.
    
  4. 필요에 따라 Terraform graph 명령어를 사용하여 리소스 종속 항목을 시각화합니다. 종속 항목 그래프는 배포된 리소스를 분석하는 데 유용합니다. images/gcpawsvpn_plan_graph.png.에서 이전에 준비한 출력 파일 버전을 볼 수 있습니다.

    run_graph.sh 스크립트에서 다음과 비슷한 ./gcpawsvpn_plan_graph.png라는 PNG 파일을 만듭니다.

    plan_graph 파일

    run_graph.sh 스크립트는 graphviz 패키지를 사용합니다. graphviz가 설치되어 있지 않으면 dot: command not found 메시지가 나타납니다. Cloud Shell에서 다음 명령어를 사용하여 graphviz를 설치할 수 있습니다.

    sudo apt-get install graphviz
    
  5. Terraform apply 명령어를 사용하여 배포를 만듭니다.

    terraform apply
    

    apply 명령어는 클라우드의 지원 리소스를 사용하여 배포를 만듭니다. apply는 약 4분 동안에 GCP 및 AWS VPC 네트워크, VM 인스턴스, VPN 게이트웨이, IPsec 터널을 포함하여 리소스를 30개 이상 만듭니다. apply 명령어 출력에는 배포된 리소스 및 구성에서 정의된 출력 변수의 세부정보가 포함됩니다.

    data.google_compute_zones.available: Refreshing state...
    ...
    Apply complete! Resources: 34 added, 0 changed, 0 destroyed.
    ...
    Outputs:
    
    aws_instance_external_ip = [AWS_EXTERNAL_IP]
    aws_instance_internal_ip = 172.16.0.100
    gcp_instance_external_ip = [GCP_EXTERNAL_IP]
    gcp_instance_internal_ip = 10.240.0.100
    
  6. 구성의 예상 최종 상태를 업데이트해야 하는 경우, .tf 파일을 편집합니다. gcp_security.tf를 편집하여 google_compute_firewall gcp_allow-ssh 규칙에 포트 23을 추가합니다.

    ports = ["22", "23"]
    

    Terraform은 편집 내용을 분석하고 배포 상태를 일치시키려면 업데이트해야 하는 최소 변경 사항을 식별합니다.

    terraform apply
    

    Terraform에서 업데이트된 구성으로 gcp-network-gcp-allow-ssh를 수정합니다.

  7. 배포는 워크플로를 지원하기 위해 출력 변수를 방출할 수 있습니다. 이 가이드에서 VM 인스턴스의 할당된 내부 및 외부 IP 주소는 gcp_outputs.tfaws_outputs.tf 파일에 의해 출력 변수로 식별되었습니다. apply 단계가 완료되면 주소는 자동으로 인쇄됩니다. 워크플로의 후반에 출력 변수 값을 다시 표시하려면 output 명령어를 사용합니다.

    terraform output
    

    이 구성이 정의하는 출력 변수에는 VM 인스턴스의 내부 및 외부 IP 주소가 포함됩니다. 네트워크 유효성 검사를 위해 ssh 명령어를 사용하려면 VM 인스턴스에 연결할 외부 IP 주소가 필요합니다.

    aws_instance_external_ip = [AWS_EXTERNAL_IP]
    aws_instance_internal_ip = 172.16.0.100
    gcp_instance_external_ip = [GCP_EXTERNAL_IP]
    gcp_instance_internal_ip = 10.240.0.100
  8. Terraform show 명령어를 사용하여 배포된 리소스를 검사하고 현재 상태를 확인합니다.

    terraform show
    

    출력 결과는 다음과 같습니다.

    ...
    google_compute_instance.gcp-vm:
    ...
    Outputs:
    ...
    
  9. gcloud compute instances list 또는 Cloud Console을 사용하여 VM 인스턴스 패널에서 인스턴스를 검토합니다.

    gcloud compute instances list

    출력 결과는 다음과 같습니다.

    NAME             ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP    EXTERNAL_IP    STATUS
    gcp-vm-us-west1  us-west1-a  n1-highmem-8               10.240.0.100   [EXTERNAL IP]  RUNNING
    
  10. ssh 명령어로 연결하여 GCP VM 인스턴스가 작동하는지 확인합니다.

    ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
  11. ssh 세션에서 pingcurl 명령어를 실행합니다.

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  12. GCP VM 인스턴스에서 간단한 네트워크 성능 확인을 실행합니다. 사전 설치된 스크립트를 사용하여 외부 및 내부 네트워크 인터페이스 각각에서 테스트를 실행합니다.

    1. 외부 IP:

      /tmp/run_iperf_to_ext.sh
      

      이 스크립트는 네트워크 성능에 대한 요약 데이터를 생성하는 30초 성능 테스트를 실행합니다.

      출력 결과는 다음과 같습니다.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. VPN(내부 IP):

      /tmp/run_iperf_to_int.sh
      

      이 스크립트는 네트워크 성능에 대한 요약 데이터를 생성하는 30초 성능 테스트를 실행합니다.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  13. GCP VM 인스턴스에서 확인이 완료되면 다음 명령어를 입력합니다.

    exit
    
  14. AWS VM 인스턴스가 작동하고 있는지 확인하려면 ssh 명령어를 사용하여 연결합니다.

    ssh -i ~/.ssh/vm-ssh-key ubuntu@[AWS_EXTERNAL_IP]
  15. ssh 세션에서 pingcurl 명령어를 실행합니다.

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  16. AWS VM 인스턴스에서 간단한 네트워크 성능 확인을 실행합니다. 사전 설치된 스크립트를 사용하여 외부 및 내부 네트워크 인터페이스 각각에서 테스트를 실행합니다.

    1. 외부 IP:

      /tmp/run_iperf_to_ext.sh
      

      이 스크립트는 30초 성능 테스트를 실행해 네트워크 성능에 대한 요약 데이터를 생성합니다.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. VPN(내부 IP):

      /tmp/run_iperf_to_int.sh
      

      이 스크립트는 30초 성능 테스트를 실행해 네트워크 성능에 대한 요약 데이터를 생성합니다.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  17. AWS VM 인스턴스에서 확인이 완료되면 다음 명령어를 입력합니다.

    exit
    

VPN을 사용하여 GCP 및 AWS 간에 안전한 비공개 사이트 간 연결을 성공적으로 배포했습니다.

삭제

배포된 리소스를 삭제하세요. destroy 배포 명령어를 실행할 때까지 VM 인스턴스 비용은 계속 청구됩니다.

  1. 선택 가능한 plan -destroy 명령어를 실행하여 destroy의 영향을 받는 리소스를 검토합니다.

    terraform plan -destroy
    

    출력 결과는 다음과 같습니다.

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 0 to add, 0 to change, 34 to destroy.
    
  2. destroy 명령어는 리소스를 영구 삭제하므로 yes를 입력하여 삭제할 것임을 확인해야 합니다. destroy 명령어는 일반적으로 약 100초 이내에 완료됩니다.

    terraform destroy
    

    출력 결과는 다음과 같습니다.

    Do you really want to destroy?
      Terraform will delete all your managed infrastructure.
      There is no undo. Only 'yes' will be accepted to confirm.
        Enter a value: yes
    

    yes를 입력하여 만든 리소스의 폐기를 확인합니다.

    Destroy complete! Resources: 34 destroyed.
    
  3. show 명령어를 실행하여 리소스 상태를 표시합니다.

    terraform show
    

    모든 리소스를 폐기했으므로, show 명령어는 라인을 출력하지 않습니다. 이는 배포된 채로 남은 리소스가 없음을 의미합니다.

  4. 마지막으로 디렉토리를 복원합니다.

    popd > /dev/null
    

지금까지 GCP 및 AWS에서 인스턴스 간에 안전한 비공개 사이트 간 연결을 성공적으로 배포하고 삭제했습니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...