Multy는 클라우드 공유 API를 사용하여 인프라를 휴대용으로 만들 수있는 오픈 소스 도구입니다. 클라우드-비기 구조 구성을 한 번 작성하고 Multy는 선택한 구름에 배치합니다.
multy를 사용하면 다른 클라우드 제공 업체에서 자원이 어떻게 다르게 행동하는지 걱정할 필요가 없습니다. cloud 매개 변수를 간단히 변경하여 구름 사이에서 인프라를 이동하는 것이 각 클라우드의 뉘앙스를 추출합니다.
Multy Terraform 제공 업체를 사용하여 간단한 가상 머신을 AWS 및 Azure에 배포 해 보겠습니다.
variable "clouds" {
type = set ( string )
default = [ " aws " , " azure " ]
}
resource "multy_virtual_network" "vn" {
for_each = var . clouds
cloud = each . key
name = " multy_vn "
cidr_block = " 10.0.0.0/16 "
location = " eu_west_1 "
}
resource "multy_subnet" "subnet" {
for_each = var . clouds
name = " multy_subnet "
cidr_block = " 10.0.10.0/24 "
virtual_network_id = multy_virtual_network . vn [ each . key ] . id
}
resource "multy_virtual_machine" "vm" {
for_each = var . clouds
name = " test_vm "
size = " general_micro "
image_reference = {
os = " ubuntu "
version = " 20.04 "
}
subnet_id = multy_subnet . subnet [ each . key ] . id
cloud = each . key
location = " eu_west_1 "
} Multy Cloud-Agnostic API를 사용하면 cloud 매개 변수를 변경하여 리소스를 한 클라우드에서 다른 클라우드로 이동할 수 있습니다.
각 Cloud TerraForm 제공 업체를 사용 하여이 배포를 해야하는 경우 먼저 aws_vpc 및 azurerm_virtual_network 와 같은 리소스가 어떻게 행동하는지 이해해야합니다. 그런 다음 동일한 인프라 구성을 두 번, 하나는 AWS와 다른 하나는 Azure를 정의해야합니다.
// terraform: 190 lines
resource "aws_iam_instance_profile" "multy_vm_ube3b_r10" {
name = " multy_vm_ube3b_r10-vm-role "
role = aws_iam_role . multy_vm_ube3b_r10 . name
provider = " aws.eu-west-1 "
}
resource "aws_iam_role" "multy_vm_ube3b_r10" {
tags = { " Name " = " test_vm " }
name = " multy_vm_ube3b_r10-vm-role "
assume_role_policy = " { " Statement " :[{ " Action " :[ " sts:AssumeRole " ], " Effect " : " Allow " , " Principal " :{ " Service " : " ec2.amazonaws.com " }}], " Version " : " 2012-10-17 " } "
provider = " aws.eu-west-1 "
}
data "aws_ami" "multy_vm_ube3b_r10" {
owners = [ " 099720109477 " ]
most_recent = true
filter {
name = " name "
values = [ " ubuntu*-20.04-amd64-server-* " ]
}
filter {
name = " root-device-type "
values = [ " ebs " ]
}
filter {
name = " virtualization-type "
values = [ " hvm " ]
}
provider = " aws.eu-west-1 "
}
resource "aws_instance" "multy_vm_ube3b_r10" {
tags = { " Name " = " test_vm " }
ami = data . aws_ami . multy_vm_ube3b_r10 . id
instance_type = " t2.micro "
subnet_id = aws_subnet . multy_vn_ube3b_r8-1 . id
iam_instance_profile = aws_iam_instance_profile . multy_vm_ube3b_r10 . id
provider = " aws.eu-west-1 "
}
resource "azurerm_network_interface" "multy_vm_ube3b_r9" {
resource_group_name = azurerm_resource_group . vm-nkum-rg . name
name = " test_vm "
location = " northeurope "
ip_configuration {
name = " internal "
private_ip_address_allocation = " Dynamic "
subnet_id = azurerm_subnet . multy_vn_ube3b_r7 . id
primary = true
}
}
resource "random_password" "multy_vm_ube3b_r9" {
length = 16
special = true
upper = true
lower = true
number = true
}
resource "azurerm_linux_virtual_machine" "multy_vm_ube3b_r9" {
resource_group_name = azurerm_resource_group . vm-nkum-rg . name
name = " test_vm "
location = " northeurope "
size = " Standard_B1s "
network_interface_ids = [ azurerm_network_interface . multy_vm_ube3b_r9 . id ]
os_disk {
caching = " None "
storage_account_type = " Standard_LRS "
}
admin_username = " adminuser "
admin_password = random_password . multy_vm_ube3b_r9 . result
source_image_reference {
publisher = " Canonical "
offer = " 0001-com-ubuntu-server-focal "
sku = " 20_04-lts "
version = " latest "
}
disable_password_authentication = false
identity {
type = " SystemAssigned "
}
computer_name = " testvm "
zone = " 1 "
}
resource "aws_vpc" "multy_vn_ube3b_r4" {
tags = { " Name " = " multy_vn " }
cidr_block = " 10.0.0.0/16 "
enable_dns_hostnames = true
provider = " aws.eu-west-1 "
}
resource "aws_internet_gateway" "multy_vn_ube3b_r4" {
tags = { " Name " = " multy_vn " }
vpc_id = aws_vpc . multy_vn_ube3b_r4 . id
provider = " aws.eu-west-1 "
}
resource "aws_default_security_group" "multy_vn_ube3b_r4" {
tags = { " Name " = " multy_vn " }
vpc_id = aws_vpc . multy_vn_ube3b_r4 . id
ingress {
protocol = " -1 "
from_port = 0
to_port = 0
self = true
}
egress {
protocol = " -1 "
from_port = 0
to_port = 0
self = true
}
provider = " aws.eu-west-1 "
}
resource "aws_vpc" "multy_vn_ube3b_r5" {
tags = { " Name " = " multy_vn " }
cidr_block = " 10.0.0.0/16 "
enable_dns_hostnames = true
provider = " aws.eu-west-1 "
}
resource "aws_internet_gateway" "multy_vn_ube3b_r5" {
tags = { " Name " = " multy_vn " }
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
provider = " aws.eu-west-1 "
}
resource "aws_default_security_group" "multy_vn_ube3b_r5" {
tags = { " Name " = " multy_vn " }
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
ingress {
protocol = " -1 "
from_port = 0
to_port = 0
self = true
}
egress {
protocol = " -1 "
from_port = 0
to_port = 0
self = true
}
provider = " aws.eu-west-1 "
}
resource "azurerm_virtual_network" "multy_vn_ube3b_r6" {
resource_group_name = azurerm_resource_group . vn-nkum-rg . name
name = " multy_vn "
location = " northeurope "
address_space = [ " 10.0.0.0/16 " ]
}
resource "azurerm_route_table" "multy_vn_ube3b_r6" {
resource_group_name = azurerm_resource_group . vn-nkum-rg . name
name = " multy_vn "
location = " northeurope "
route {
name = " local "
address_prefix = " 0.0.0.0/0 "
next_hop_type = " VnetLocal "
}
}
resource "azurerm_subnet" "multy_vn_ube3b_r7" {
resource_group_name = azurerm_resource_group . vn-nkum-rg . name
name = " multy_subnet "
address_prefixes = [ " 10.0.10.0/24 " ]
virtual_network_name = azurerm_virtual_network . multy_vn_ube3b_r6 . name
}
resource "azurerm_subnet_route_table_association" "multy_vn_ube3b_r7" {
subnet_id = azurerm_subnet . multy_vn_ube3b_r7 . id
route_table_id = azurerm_route_table . multy_vn_ube3b_r6 . id
}
resource "aws_subnet" "multy_vn_ube3b_r8-1" {
tags = { " Name " = " multy_subnet-1 " }
cidr_block = " 10.0.10.0/25 "
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
availability_zone = " eu-west-1a "
provider = " aws.eu-west-1 "
}
resource "aws_subnet" "multy_vn_ube3b_r8-2" {
tags = { " Name " = " multy_subnet-2 " }
cidr_block = " 10.0.10.128/26 "
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
availability_zone = " eu-west-1b "
provider = " aws.eu-west-1 "
}
resource "aws_subnet" "multy_vn_ube3b_r8-3" {
tags = { " Name " = " multy_subnet-3 " }
cidr_block = " 10.0.10.192/26 "
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
availability_zone = " eu-west-1c "
provider = " aws.eu-west-1 "
}
resource "azurerm_resource_group" "vm-nkum-rg" {
name = " vm-nkum-rg "
location = " northeurope "
}
resource "azurerm_resource_group" "vn-nkum-rg" {
name = " vn-nkum-rg "
location = " northeurope "
}Multy를 사용하면 한 번 쓰고 어디서나 배포합니다 .
brew tap hashicorp/tap && brew install hashicorp/tap/terraformchoco install terraform sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform
AWS 또는 Azure로 계정을 만들고 환경 변수를 통해 인증 자격 증명을 노출시킵니다.
다음 내용이있는 main.tf 라는 파일과 같은 구성 파일을 작성하십시오.
terraform {
required_providers {
multy = {
source = " multycloud/multy "
}
}
}
provider "multy" {
aws = {} # this will look for aws credentials
}
resource "multy_virtual_network" "vn" {
cloud = " aws "
name = " multy_vn "
cidr_block = " 10.0.0.0/16 "
location = " eu_west_1 "
} terraform init 실행 한 다음 terraform apply
terraform destroy 실행하십시오
보다 자세한 가이드는 공식 Getting Start Guide를 참조하십시오.
우리는 기고자를 사랑합니다! 기고에 관심이 있으시면 기고 가이드를 살펴보십시오.
Discord 채널에 가입하여 라이브 토론에 참여하거나 지원을 요청하십시오.
Repo 개요 : 개요 .md
Terraform Provider Repo : https://github.com/multycloud/terraform-provider-multy
Discord 채널 : https://discord.gg/rgakxy4tcz
로드맵을 살펴보고 최신 기능과 단기 및 장기에 초점을 맞추는 것을 알 수 있습니다. 또한 원하는 특정 기능에 투표하거나 토론에 참여할 수도 있습니다.
Multy는 여러 구름에서 동일한 인프라를 실행하는 것이 얼마나 어려운지를 깨닫고 태어났습니다. AWS 및 Azure와 같은 제공 업체는 동일한 핵심 서비스 세트를 공유하지만 각 서비스 작동 방식의 작은 차이로 인해 인프라가 같은 방식으로 실행되도록 구성하기가 어렵습니다.
이것은 Multy가 다루기를 목표로하는 문제입니다. 클라우드 제공 업체에 관계없이 동일한 동작을 가진 리소스를 배포하기위한 단일 인터페이스를 만들었습니다.
Multy는 무료 및 오픈 소스 도구로 제공되므로 직접 다운로드하여 로컬로 실행할 수 있습니다.
또한 서버를 호스팅하는 관리 솔루션도 제공합니다. Managed Multy는 현재 무료 서비스로 제공됩니다. 당사 웹 사이트를 방문하여 API 키를 요청할 수 있습니다.
Terraform과 그 공급자는 모든 리소스를 클라우드에 배포하는 데 적합하지만 각 공급자를 이해하고 리소스를 정의 할 때 인프라 팀에 모든 부담을줍니다. 그러나 이러한 유연성은 멀티 클라우드와 관련하여 이점으로 보일 수 있습니다. 이것은 배포로 빠르게 움직이고 자하는 팀을 상당히 느리게 만듭니다.
주요 클라우드 제공 업체의 공통 리소스를 추상화함으로써 사용자는 인프라 코드를 다시 작성하지 않고도 AWS 및 Azure에 동일한 리소스를 배포 할 수 있습니다.
전적으로! Multy의 목표는 클라우드 관리 서비스를 활용하고 인프라를 자유롭게 이동할 수 있도록하는 것입니다. 모든 리소스가 지원되는 것은 아니지만 관리 데이터베이스, 객체 저장 및 금고와 같은 가장 인기있는 관리 리소스를 지원하는 것을 목표로합니다.
문제 섹션에서 문제를 만들어 어떤 서비스를 지원하고 싶은지 알려주십시오.
Multy는 로컬 및 무료로 실행할 수있는 오픈 소스 도구입니다. 어느 시점에서 Multy에서 이동하려는 경우 인프라 구성을 Terraform으로 내보내고 독립적으로 사용할 수 있습니다.
이 저장소는 Apache 2.0에서 사용할 수 있습니다.