Multy เป็นเครื่องมือโอเพนซอร์ซที่ทำให้โครงสร้างพื้นฐานของคุณพกพาได้โดยใช้ API แบบคลาวด์ คุณเขียนการกำหนดค่าแบบคลาวด์-ไม่เชื่อเรื่องพระเจ้าหนึ่งครั้งและหลายแบบปรับใช้กับคลาวด์ที่คุณเลือก
ด้วย Multy คุณไม่จำเป็นต้องกังวลว่าทรัพยากรจะมีพฤติกรรมแตกต่างกันอย่างไรในผู้ให้บริการคลาวด์ที่แตกต่างกัน เราสรุปความแตกต่างของแต่ละคลาวด์เพื่อให้การเคลื่อนย้ายโครงสร้างพื้นฐานของคุณระหว่างเมฆทำโดยเพียงแค่เปลี่ยนพารามิเตอร์ cloud
ลองปรับใช้เครื่องเสมือนจริงอย่างง่าย ๆ ลงใน AWS และ Azure โดยใช้ผู้ให้บริการ Multy Terraform
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 "
} ด้วยการใช้ 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
สำหรับคู่มือรายละเอียดเพิ่มเติมดูที่คู่มือการเริ่มต้นอย่างเป็นทางการของเรา
เรารักผู้มีส่วนร่วม! หากคุณสนใจที่จะมีส่วนร่วมให้ดูที่คู่มือการสนับสนุนของเรา
เข้าร่วมช่อง Discord ของเราเพื่อเข้าร่วมการสนทนาสดหรือขอการสนับสนุน
ภาพรวม repo: overview.md
ผู้ให้บริการ Terraform 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