Terraform 및 Multy를 사용하여 모든 클라우드에 간단한 휴대용 웹 앱 배포
소개
이 자습서에서는 프런트엔드 코드가 실행될 데이터베이스와 가상 머신으로 구성된 원하는 클라우드에 간단한 웹 앱을 배포합니다.
구성이 재사용 가능하고 일관되도록 Terraform 에 작성합니다.
일반적으로 Terraform 구성은 클라우드에 따라 다르며 클라우드를 변경하려면 완전히 다시 작성해야 합니다. 이 경우 클라우드 간에 동일한 구성을 재사용할 수 있도록 Multy 을 사용합니다.
이 자습서를 수행하는 데 Terraform 및 Multy에 대한 심층 지식이 필요하지 않습니다. 이러한 도구에 대해 자세히 알아보려면 Multy documentation 및 Terraform documentation을 확인하십시오.
건축물
이 웹 앱에는 다음 구성 요소가 포함됩니다.
Terraform 초기화
먼저 Terraform을 초기화합니다.
여기에서 Multy 공급자를 설정하고 필요한 자격 증명을 전달합니다.
Multy API 키가 필요합니다. https://multy.dev/#beta에서 무료로 얻을 수 있습니다.
또한 다른 클라우드 및 위치에 웹 앱을 쉽게 재배포할 수 있도록 하는 2개의 변수(
cloud
및 location
)를 선언합니다. 아직 없는 경우 일부 클라우드 자격 증명을 생성해야 합니다. 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
폴더로 초기화합니다.네트워킹 구성
클라우드 외부에서 웹앱에 액세스할 수 있으려면 적절한 경로 테이블이 있는 가상 네트워크를 만들어야 합니다.
우리는 다음이 필요합니다:
이것은 각 클라우드마다 상당히 다르지만 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 을 살펴보십시오.
Reference
이 문제에 관하여(Terraform 및 Multy를 사용하여 모든 클라우드에 간단한 휴대용 웹 앱 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/multy/deploying-a-simple-portable-web-app-in-any-cloud-using-terraform-and-multy-20hl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)