Terraform 및 Multy를 사용하여 모든 클라우드에 간단한 휴대용 웹 앱 배포

소개



이 자습서에서는 프런트엔드 코드가 실행될 데이터베이스와 가상 머신으로 구성된 원하는 클라우드에 간단한 웹 앱을 배포합니다.
구성이 재사용 가능하고 일관되도록 Terraform 에 작성합니다.

일반적으로 Terraform 구성은 클라우드에 따라 다르며 클라우드를 변경하려면 완전히 다시 작성해야 합니다. 이 경우 클라우드 간에 동일한 구성을 재사용할 수 있도록 Multy 을 사용합니다.

이 자습서를 수행하는 데 Terraform 및 Multy에 대한 심층 지식이 필요하지 않습니다. 이러한 도구에 대해 자세히 알아보려면 Multy documentationTerraform documentation을 확인하십시오.

건축물



이 웹 앱에는 다음 구성 요소가 포함됩니다.
  • 네트워킹 - 적절한 보안 그룹을 사용하여 인터넷에서 액세스할 수 있는 가상 네트워크
  • 데이터베이스 - 데이터가 저장될 관리되는 MySQL 데이터베이스
  • 가상 머신 - 데이터베이스에서 데이터를 저장하고 검색하는 간단한 메모 앱을 제공하도록 구성된 서버


  • Terraform 초기화



    먼저 Terraform을 초기화합니다.
    여기에서 Multy 공급자를 설정하고 필요한 자격 증명을 전달합니다.
    Multy API 키가 필요합니다. https://multy.dev/#beta에서 무료로 얻을 수 있습니다.

    또한 다른 클라우드 및 위치에 웹 앱을 쉽게 재배포할 수 있도록 하는 2개의 변수( cloudlocation )를 선언합니다. 아직 없는 경우 일부 클라우드 자격 증명을 생성해야 합니다. Getting Started 가이드를 확인하세요.

    공급자를 설정하려면 다음 콘텐츠가 포함된 providers.tf 파일을 엽니다.

    terraform {
      required_providers {
        multy = {
          source = "multycloud/multy"
        }
      }
    }
    provider "multy" {
      api_key = "xxx"
      aws     = {}
    }
    variable "cloud" {
      type    = string
      default = "aws"
    }
    variable "location" {
      type    = string
      default = "eu_west_1"
    }
    


    그런 다음 동일한 폴더에서 다음 명령을 실행합니다.

    terraform init
    


    이 명령은 Multy provider을 다운로드하고 Terraform에 필요한 모든 것을 .terraform 폴더로 초기화합니다.

    네트워킹 구성



    클라우드 외부에서 웹앱에 액세스할 수 있으려면 적절한 경로 테이블이 있는 가상 네트워크를 만들어야 합니다.

    우리는 다음이 필요합니다:
  • 가상 네트워크 및 서브넷
  • 포트 22(SSH 액세스용) 및 포트 4000(웹 사이트 액세스 가능)과 코드 및 Linux 패키지 다운로드를 위한 HTTP 및 HTTPS 액세스를 여는 보안 그룹
  • 모든 트래픽을 인터넷으로 라우팅하는 경로 테이블

  • 이것은 각 클라우드마다 상당히 다르지만 Multy를 사용하면 클라우드에 구애받지 않는 방식으로 설명할 수 있습니다.

    resource "multy_virtual_network" "vn" {
      cloud      = var.cloud
      location   = var.location
      name       = "multy-vm"
      cidr_block = "10.0.0.0/16"
    }
    resource "multy_subnet" "subnet" {
      name               = "multy-subnet"
      cidr_block         = "10.0.10.0/24"
      virtual_network_id = multy_virtual_network.vn.id
    }
    resource "multy_network_security_group" "nsg" {
      cloud              = var.cloud
      location           = var.location
    
      name               = "multy_nsg"
      virtual_network_id = multy_virtual_network.vn.id
      rule {
        protocol   = "tcp"
        priority   = 133
        from_port  = 443
        to_port    = 443
        cidr_block = "0.0.0.0/0"
        direction  = "egress"
      }
      rule {
        protocol   = "tcp"
        priority   = 131
        from_port  = 80
        to_port    = 80
        cidr_block = "0.0.0.0/0"
        direction  = "egress"
      }
      rule {
        protocol   = "tcp"
        priority   = 132
        from_port  = 4000
        to_port    = 4000
        cidr_block = "0.0.0.0/0"
        direction  = "ingress"
      }
      rule {
        protocol   = "tcp"
        priority   = 130
        from_port  = 22
        to_port    = 22
        cidr_block = "0.0.0.0/0"
        direction  = "ingress"
      }
    }
    resource "multy_route_table" "rt" {
      name               = "multy-rt"
      virtual_network_id = multy_virtual_network.vn.id
      route {
        cidr_block  = "0.0.0.0/0"
        destination = "internet"
      }
    }
    resource "multy_route_table_association" "rta" {
      route_table_id = multy_route_table.rt.id
      subnet_id      = multy_subnet.subnet.id
    }
    


    데이터베이스 구성



    다음으로 데이터베이스를 구성해야 합니다. 우리는 가상 네트워크를 배치한 동일한 위치에 임의의 암호가 있는 작은 MySQL 데이터베이스를 원합니다.

    resource "random_password" "password" {
      length = 16
      override_special = "!#"
      special = true
    }
    resource "multy_database" "db" {
      cloud          = var.cloud
      location       = var.location
    
      storage_gb     = 10
      name           = "multydb"
      engine         = "mysql"
      engine_version = "5.7"
      username       = "multyadmin"
      password       = random_password.password.result
      size           = "micro"
      subnet_id      = multy_subnet.subnet.id
      depends_on = [multy_route_table_association.rta]
    }
    


    가상 머신 구성



    마지막으로 서버를 구성해야 합니다. 이 데모에서는 사용할 수 있는 가장 작은 서버를 사용합니다. 이를 초기화하기 위해 가상 머신이 처음 부팅될 때 cloud-init에서 실행되는 스크립트인 사용자 데이터를 사용합니다.

    resource "multy_virtual_machine" "vm" {
      cloud          = var.cloud
      location       = var.location
    
      name               = "web_app_vm"
      size               = "general_micro"
      image_reference    = {
        os      = "ubuntu"
        version = "18.04"
      }
      subnet_id          = multy_subnet.subnet.id
      generate_public_ip = true
      user_data_base64   = base64encode(local.init_script)
      # uncomment this line to allow ssh access
      # public_ssh_key = file("~/.ssh/id_rsa.pub")
    
      network_security_group_ids = [multy_network_security_group.nsg.id]
    }
    locals {
      init_script = <<EOT
    #!/bin/bash -xe
    sudo apt-get update -y && sudo apt-get -y install git npm mysql-client curl jq
    curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
    sudo apt-get install -y nodejs
    sudo chmod a+rwx .
    # putting secrets into user data is not best practice, you can use multy_vault instead
    export DATABASE_HOST=${multy_database.db.hostname}
    export DATABASE_USER=${multy_database.db.connection_username}
    export DATABASE_PASSWORD='${multy_database.db.password}'
    git clone https://github.com/FaztTech/nodejs-mysql-links.git
    cd nodejs-mysql-links
    mysql -h $DATABASE_HOST -P 3306 -u $DATABASE_USER --password=$DATABASE_PASSWORD -e 'source database/db.sql' || true
    npm i && npm run build && npm start
    EOT
    }
    output "endpoint" {
      value = "http://${multy_virtual_machine.vm.public_ip}:4000"
    }
    


    배포 중



    모두 작성했으면 Terraform을 사용하여 리소스를 배포할 수 있습니다. 원하는 클라우드location를 사용하여 다음 명령을 실행합니다.

    terraform apply -var="cloud=aws" -var="location=eu_west_1"
    


    몇 분 후에 예제 앱에 액세스할 수 있는 엔드포인트가 표시되어야 합니다!

    요약



    Terraform은 모든 클라우드에 대해 단일 통합 언어(HCL)를 사용하여 배포를 반복 가능하게 만드는 매우 강력한 도구입니다. 그러나 클라우드는 서로 상당히 다릅니다. 즉, Terraform 파일은 클라우드마다 매우 다르게 보입니다. 이 튜토리얼에서는 단일cloud 매개변수만 변경하여 Multy를 활용하여 여러 클라우드 공급자 간에 배포를 이식할 수 있도록 하는 방법에 대한 예를 살펴보았습니다. 다른 예를 더 살펴보려면 Multy examples 을 살펴보십시오.

    좋은 웹페이지 즐겨찾기