{"id":13508977,"url":"https://github.com/multycloud/multy","last_synced_at":"2026-01-17T18:27:22.836Z","repository":{"id":37038672,"uuid":"445853339","full_name":"multycloud/multy","owner":"multycloud","description":"Multy - Easily deploy multi cloud infrastructure. Write cloud-agnostic config deployed across multiple clouds","archived":false,"fork":false,"pushed_at":"2023-02-01T14:47:35.000Z","size":87918,"stargazers_count":651,"open_issues_count":30,"forks_count":33,"subscribers_count":14,"default_branch":"main","last_synced_at":"2025-03-30T11:34:07.085Z","etag":null,"topics":["aws","azure","cloud","go","help-wanted","infrastructure-as-code","multi-cloud","terraform"],"latest_commit_sha":null,"homepage":"https://multy.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/multycloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-08T15:17:13.000Z","updated_at":"2025-03-27T21:56:03.000Z","dependencies_parsed_at":"2023-02-17T06:46:00.541Z","dependency_job_id":null,"html_url":"https://github.com/multycloud/multy","commit_stats":null,"previous_names":[],"tags_count":60,"template":false,"template_full_name":null,"purl":"pkg:github/multycloud/multy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/multycloud%2Fmulty","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/multycloud%2Fmulty/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/multycloud%2Fmulty/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/multycloud%2Fmulty/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/multycloud","download_url":"https://codeload.github.com/multycloud/multy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/multycloud%2Fmulty/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28515491,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T17:57:59.192Z","status":"ssl_error","status_checked_at":"2026-01-17T17:57:52.527Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","azure","cloud","go","help-wanted","infrastructure-as-code","multi-cloud","terraform"],"created_at":"2024-08-01T02:01:01.243Z","updated_at":"2026-01-17T18:27:22.797Z","avatar_url":"https://github.com/multycloud.png","language":"Go","readme":"\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://multy.dev?utm_source=github.com\"\u003e\n    \u003cimg src=\"https://multy.dev/logo_dark_mode.svg\" width=\"250\"\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\n\n\u003ch3 align=\"center\"\u003e\nMulty is the easiest way to deploy multi cloud infrastructure\n\u003c/h3\u003e\n\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://multy.dev/images/reusibility.svg\" width=\"500\"\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Terraform](https://img.shields.io/badge/terraform-%235835CC.svg?style=flat-square\u0026logo=terraform\u0026logoColor=white)](https://registry.terraform.io/providers/multycloud/multy/latest/docs)\n[![Discord](https://img.shields.io/badge/Multy-%237289DA.svg?style=flat-square\u0026logo=discord\u0026logoColor=white)](https://discord.gg/rgaKXY4tCZ)\n[![Build Status](https://img.shields.io/github/workflow/status/multycloud/multy/go_test?label=tests\u0026style=flat-square)](https://github.com/multycloud/multy/actions)\n\u003c/div\u003e\n\n# What is Multy?\n\n**Multy** is an open-source tool that makes your infrastructure portable using a cloud-agnostic API.\nYou write your cloud-agnostic configuration once and Multy deploys it to the clouds you choose.\n\nWith Multy, you don't need to worry about how resources behave differently in the different clouds providers.\nWe abstract the nuances of each cloud so that moving your infrastructure between clouds is done by simply changing\nthe `cloud` parameter.\n\n# Example\n\nLet's try to deploy a simple virtual machine into AWS and Azure using\nthe [Multy Terraform Provider](https://github.com/multycloud/terraform-provider-multy)\n\n```hcl\nvariable \"clouds\" {\n  type    = set(string)\n  default = [\"aws\", \"azure\"]\n}\n\nresource \"multy_virtual_network\" \"vn\" {\n  for_each = var.clouds\n  cloud    = each.key\n\n  name       = \"multy_vn\"\n  cidr_block = \"10.0.0.0/16\"\n  location   = \"eu_west_1\"\n}\n\nresource \"multy_subnet\" \"subnet\" {\n  for_each = var.clouds\n\n  name               = \"multy_subnet\"\n  cidr_block         = \"10.0.10.0/24\"\n  virtual_network_id = multy_virtual_network.vn[each.key].id\n}\n\nresource \"multy_virtual_machine\" \"vm\" {\n  for_each = var.clouds\n\n  name = \"test_vm\"\n  size = \"general_micro\"\n  image_reference = {\n    os      = \"ubuntu\"\n    version = \"20.04\"\n  }\n  subnet_id = multy_subnet.subnet[each.key].id\n  cloud     = each.key\n  location  = \"eu_west_1\"\n}\n```\n\nBy using the Multy cloud-agnostic API, we can simply change the `cloud` parameter to move a resource from one cloud to\nanother.\n\nIf we were to deploy this using the respective cloud terraform providers, we would first need to understand how\nresources such as `aws_vpc` and `azurerm_virtual_network` behave and how they differ. Then we would need to define the\nsame infrastructure configuration twice, one for AWS and another for Azure.\n\n\n\u003cdetails\u003e\u003csummary\u003eThis is the equivalent terraform configuration (generated by Multy)\u003c/summary\u003e\n\u003cp\u003e\n\n```hcl\n// terraform: 190 lines\nresource \"aws_iam_instance_profile\" \"multy_vm_ube3b_r10\" {\n  name     = \"multy_vm_ube3b_r10-vm-role\"\n  role     = aws_iam_role.multy_vm_ube3b_r10.name\n  provider = \"aws.eu-west-1\"\n}\nresource \"aws_iam_role\" \"multy_vm_ube3b_r10\" {\n  tags               = { \"Name\" = \"test_vm\" }\n  name               = \"multy_vm_ube3b_r10-vm-role\"\n  assume_role_policy = \"{\\\"Statement\\\":[{\\\"Action\\\":[\\\"sts:AssumeRole\\\"],\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"Service\\\":\\\"ec2.amazonaws.com\\\"}}],\\\"Version\\\":\\\"2012-10-17\\\"}\"\n  provider           = \"aws.eu-west-1\"\n}\ndata \"aws_ami\" \"multy_vm_ube3b_r10\" {\n  owners      = [\"099720109477\"]\n  most_recent = true\n  filter {\n    name   = \"name\"\n    values = [\"ubuntu*-20.04-amd64-server-*\"]\n  }\n  filter {\n    name   = \"root-device-type\"\n    values = [\"ebs\"]\n  }\n  filter {\n    name   = \"virtualization-type\"\n    values = [\"hvm\"]\n  }\n  provider = \"aws.eu-west-1\"\n}\nresource \"aws_instance\" \"multy_vm_ube3b_r10\" {\n  tags                 = { \"Name\" = \"test_vm\" }\n  ami                  = data.aws_ami.multy_vm_ube3b_r10.id\n  instance_type        = \"t2.micro\"\n  subnet_id            = aws_subnet.multy_vn_ube3b_r8-1.id\n  iam_instance_profile = aws_iam_instance_profile.multy_vm_ube3b_r10.id\n  provider             = \"aws.eu-west-1\"\n}\nresource \"azurerm_network_interface\" \"multy_vm_ube3b_r9\" {\n  resource_group_name = azurerm_resource_group.vm-nkum-rg.name\n  name                = \"test_vm\"\n  location            = \"northeurope\"\n  ip_configuration {\n    name                          = \"internal\"\n    private_ip_address_allocation = \"Dynamic\"\n    subnet_id                     = azurerm_subnet.multy_vn_ube3b_r7.id\n    primary                       = true\n  }\n}\nresource \"random_password\" \"multy_vm_ube3b_r9\" {\n  length  = 16\n  special = true\n  upper   = true\n  lower   = true\n  number  = true\n}\nresource \"azurerm_linux_virtual_machine\" \"multy_vm_ube3b_r9\" {\n  resource_group_name   = azurerm_resource_group.vm-nkum-rg.name\n  name                  = \"test_vm\"\n  location              = \"northeurope\"\n  size                  = \"Standard_B1s\"\n  network_interface_ids = [azurerm_network_interface.multy_vm_ube3b_r9.id]\n  os_disk {\n    caching              = \"None\"\n    storage_account_type = \"Standard_LRS\"\n  }\n  admin_username = \"adminuser\"\n  admin_password = random_password.multy_vm_ube3b_r9.result\n  source_image_reference {\n    publisher = \"Canonical\"\n    offer     = \"0001-com-ubuntu-server-focal\"\n    sku       = \"20_04-lts\"\n    version   = \"latest\"\n  }\n  disable_password_authentication = false\n  identity {\n    type = \"SystemAssigned\"\n  }\n  computer_name = \"testvm\"\n  zone          = \"1\"\n}\nresource \"aws_vpc\" \"multy_vn_ube3b_r4\" {\n  tags                 = { \"Name\" = \"multy_vn\" }\n  cidr_block           = \"10.0.0.0/16\"\n  enable_dns_hostnames = true\n  provider             = \"aws.eu-west-1\"\n}\nresource \"aws_internet_gateway\" \"multy_vn_ube3b_r4\" {\n  tags     = { \"Name\" = \"multy_vn\" }\n  vpc_id   = aws_vpc.multy_vn_ube3b_r4.id\n  provider = \"aws.eu-west-1\"\n}\nresource \"aws_default_security_group\" \"multy_vn_ube3b_r4\" {\n  tags   = { \"Name\" = \"multy_vn\" }\n  vpc_id = aws_vpc.multy_vn_ube3b_r4.id\n  ingress {\n    protocol  = \"-1\"\n    from_port = 0\n    to_port   = 0\n    self      = true\n  }\n  egress {\n    protocol  = \"-1\"\n    from_port = 0\n    to_port   = 0\n    self      = true\n  }\n  provider = \"aws.eu-west-1\"\n}\nresource \"aws_vpc\" \"multy_vn_ube3b_r5\" {\n  tags                 = { \"Name\" = \"multy_vn\" }\n  cidr_block           = \"10.0.0.0/16\"\n  enable_dns_hostnames = true\n  provider             = \"aws.eu-west-1\"\n}\nresource \"aws_internet_gateway\" \"multy_vn_ube3b_r5\" {\n  tags     = { \"Name\" = \"multy_vn\" }\n  vpc_id   = aws_vpc.multy_vn_ube3b_r5.id\n  provider = \"aws.eu-west-1\"\n}\nresource \"aws_default_security_group\" \"multy_vn_ube3b_r5\" {\n  tags   = { \"Name\" = \"multy_vn\" }\n  vpc_id = aws_vpc.multy_vn_ube3b_r5.id\n  ingress {\n    protocol  = \"-1\"\n    from_port = 0\n    to_port   = 0\n    self      = true\n  }\n  egress {\n    protocol  = \"-1\"\n    from_port = 0\n    to_port   = 0\n    self      = true\n  }\n  provider = \"aws.eu-west-1\"\n}\nresource \"azurerm_virtual_network\" \"multy_vn_ube3b_r6\" {\n  resource_group_name = azurerm_resource_group.vn-nkum-rg.name\n  name                = \"multy_vn\"\n  location            = \"northeurope\"\n  address_space       = [\"10.0.0.0/16\"]\n}\nresource \"azurerm_route_table\" \"multy_vn_ube3b_r6\" {\n  resource_group_name = azurerm_resource_group.vn-nkum-rg.name\n  name                = \"multy_vn\"\n  location            = \"northeurope\"\n  route {\n    name           = \"local\"\n    address_prefix = \"0.0.0.0/0\"\n    next_hop_type  = \"VnetLocal\"\n  }\n}\nresource \"azurerm_subnet\" \"multy_vn_ube3b_r7\" {\n  resource_group_name  = azurerm_resource_group.vn-nkum-rg.name\n  name                 = \"multy_subnet\"\n  address_prefixes     = [\"10.0.10.0/24\"]\n  virtual_network_name = azurerm_virtual_network.multy_vn_ube3b_r6.name\n}\nresource \"azurerm_subnet_route_table_association\" \"multy_vn_ube3b_r7\" {\n  subnet_id      = azurerm_subnet.multy_vn_ube3b_r7.id\n  route_table_id = azurerm_route_table.multy_vn_ube3b_r6.id\n}\nresource \"aws_subnet\" \"multy_vn_ube3b_r8-1\" {\n  tags              = { \"Name\" = \"multy_subnet-1\" }\n  cidr_block        = \"10.0.10.0/25\"\n  vpc_id            = aws_vpc.multy_vn_ube3b_r5.id\n  availability_zone = \"eu-west-1a\"\n  provider          = \"aws.eu-west-1\"\n}\nresource \"aws_subnet\" \"multy_vn_ube3b_r8-2\" {\n  tags              = { \"Name\" = \"multy_subnet-2\" }\n  cidr_block        = \"10.0.10.128/26\"\n  vpc_id            = aws_vpc.multy_vn_ube3b_r5.id\n  availability_zone = \"eu-west-1b\"\n  provider          = \"aws.eu-west-1\"\n}\nresource \"aws_subnet\" \"multy_vn_ube3b_r8-3\" {\n  tags              = { \"Name\" = \"multy_subnet-3\" }\n  cidr_block        = \"10.0.10.192/26\"\n  vpc_id            = aws_vpc.multy_vn_ube3b_r5.id\n  availability_zone = \"eu-west-1c\"\n  provider          = \"aws.eu-west-1\"\n}\nresource \"azurerm_resource_group\" \"vm-nkum-rg\" {\n  name     = \"vm-nkum-rg\"\n  location = \"northeurope\"\n}\nresource \"azurerm_resource_group\" \"vn-nkum-rg\" {\n  name     = \"vn-nkum-rg\"\n  location = \"northeurope\"\n}\n```\n\n\u003c/p\u003e\n\u003c/details\u003e\n\nWith Multy, **you write once, and deploy anywhere**.\n\n## Getting started\n\n1. Install Terraform - [see guide](https://learn.hashicorp.com/tutorials/terraform/install-cli#install-terraform), e.g.:\n\n- Brew (Homebrew/Mac OS): `brew tap hashicorp/tap \u0026\u0026 brew install hashicorp/tap/terraform`\n- Choco (Chocolatey/Windows): `choco install terraform`\n- Debian (Ubuntu/Linux):\n  ```\n  sudo apt-get update \u0026\u0026 sudo apt-get install -y gnupg software-properties-common curl\n  curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -\n  sudo apt-add-repository \"deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main\"\n  sudo apt-get update \u0026\u0026 sudo apt-get install terraform\n  ```\n\n2. Create an account with AWS or Azure and expose\n   its [authentication credentials via environment variables](https://docs.multy.dev/getting-started#3-generate-access-keys)\n\n3. Write your configuration file, for example a file named `main.tf` with the following content:\n\n    ```hcl\n    terraform {\n      required_providers {\n        multy = {\n          source = \"multycloud/multy\"\n        }\n      }\n    }\n    \n    provider \"multy\" {\n      aws = {} # this will look for aws credentials\n    }\n    resource \"multy_virtual_network\" \"vn\" {\n      cloud = \"aws\"\n    \n      name       = \"multy_vn\"\n      cidr_block = \"10.0.0.0/16\"\n      location   = \"eu_west_1\"\n    }\n    ```\n\n4. Run `terraform init` and then `terraform apply`\n5. Run `terraform destroy`\n\nFor a more detailed guide, see our official [getting started guide](https://docs.multy.dev/getting-started).\n\n## Contributing\n\nWe love contributors! If you're interested in contributing, take a look at our [Contributing guide](./CONTRIBUTING.md)\n. \u003cbr\u003e\nJoin our [discord](https://discord.gg/rgaKXY4tCZ) channel to participate in live discussions or ask for support.\n\nRepo overview: [OVERVIEW.md](./.github/overview.md)\n\nTerraform Provider\nRepo: [https://github.com/multycloud/terraform-provider-multy](https://github.com/multycloud/terraform-provider-multy?ref=multy-gh-repo)\n\nDiscord Channel: [https://discord.gg/rgaKXY4tCZ](https://discord.gg/rgaKXY4tCZ)\n\n## Roadmap\n\nHave a look at our [roadmap](https://github.com/orgs/multycloud/projects/4) to know the latest features released and\nwhat we're focusing on short and long term.\nYou can also vote for a specific feature you want or participate in\nthe [discussions](https://github.com/multycloud/multy/discussions).\n\n## FAQ\n\n### Why build with Multy?\n\nMulty was born after realising how difficult it is to run the same infrastructure across multiple clouds. While\nproviders such as AWS and Azure share the same set of core services, the small differences in how each service works\nmake it difficult to configure your infrastructure to run in the same way.\n\nThis is the problem that Multy aims to tackle. We created a single interface to deploy resources that have the same\nbehaviour regardless of the cloud provider.\n\n### Can I use Multy for free?\n\nMulty is available as a free and open-source tool, so you can download it directly and run it locally.\n\nWe also offer a managed solution that hosts the server for you. Managed Multy is currently offered as a free service.\nYou can request an API key by visiting our [website](https://multy.dev).\n\n### Why not use the cloud specific Terraform providers?\n\nWhile Terraform and its providers are great for deploying any resource into any cloud, it puts all the burden on the\ninfrastructure teams when it comes to understanding each provider and defining the resources. This flexibility can be\nseen as an advantage, however, when it comes to multi-cloud, this considerably slows down teams that are looking to move\nfast with deployments.\n\nBy abstracting the common resources across major cloud providers, users are able to deploy the same resources on AWS and\nAzure without re-writing any infrastructure code.\n\n### I want to use cloud managed resources (i.e. Amazon S3 / Azure Key Vault), is Multy for me?\n\nAbsolutely! The goal with Multy is to allow you to leverage cloud managed services and remain free to move your\ninfrastructure.\nNot every resource will be supported, but we aim to support the most popular managed resources such as managed\ndatabases, object storage and vault.\n\nLet us know what services you would like to be supported by creating an Issue on\nthe [Issues section](https://github.com/multycloud/multy/issues).\n\n### Why should I be locked in to Multy?\n\nMulty is an open-source tool that can be run locally and free. If at some point you want to move off Multy, you can\nexport your infrastructure configuration as Terraform and use it independently.\n\n## License\n\nThis repository is available under [Apache 2.0](./LICENSE).\n","funding_links":[],"categories":["Go","cloud"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmultycloud%2Fmulty","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmultycloud%2Fmulty","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmultycloud%2Fmulty/lists"}