multycloud / multy Goto Github PK
View Code? Open in Web Editor NEWMulty - Easily deploy multi cloud infrastructure. Write cloud-agnostic config deployed across multiple clouds
Home Page: https://multy.dev
License: Apache License 2.0
Multy - Easily deploy multi cloud infrastructure. Write cloud-agnostic config deployed across multiple clouds
Home Page: https://multy.dev
License: Apache License 2.0
AWS Lambda & Azure Functions
Tasks:
Read attributes from internal terraform state and convert to object as per https://github.com/multycloud/multy/blob/main/resources/types/virtual_network.go#L65
Allow Engine to locally run without third-party dependencies. This makes it easy for testing and getting started.
SQL - store Locks and API keys in-memory
S3 - use local file system
Unify the following types:
Not all types / sizes are available in all regions, so ideally we'd catch that and return an unified error message.
Similar to terraform, we should have a resource that just prints a variable
We'll need to go around terraform for this one
Something like:
message VirtualNetworkArgs {
...
message AwsOverrides {
string vm_size = 1;
string location = 2;
}
message AzureOverrides {
string vm_size = 1;
string location = 2;
}
AwsOverrides aws_overrides = 1;
AzureOverrides azure_overrides = 2;
}
Which will then be used in the translation logic to override cloud-specific values.
Cloud providers allow you to create a snapshot from a VM into a "managed image". You can't export them in general, so we can't support cross cloud.
AWS: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ami_from_instance
Azure: https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/image (vm needs to be "generalized")
Support for cross-cloud object storage is dependent on:
For each resource, return the ids of the deployed resources.
For example, add fields to virtual_network.proto:
message VirtualNetworkResource {
...
message Aws {
string vpc_id = 1;
string internet_gateway_id = 2;
string default_security_group_id = 3;
}
message Azure {
string virtual_network_id = 1;
string route_table_id = 2;
}
}
which will then be shown in the provider.
port
to proto definition in https://github.com/multycloud/multy/blob/main/api/proto/resourcespb/database.protoSame-cloud load balancing is offered by each cloud:
AWS: https://aws.amazon.com/elasticloadbalancing/
Azure: https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-overview
Both AWS and Azure support tagging most resources.
In some cases, we can't handle hardcoded ids because multy resources depend on multiple properties of other resources.
For example, subnets depend on virtual_network.id, virtual_network.name and on the virtual network's associated route_table_id.
Currently, these ids can't be hardcoded and config must look like
multy virtual_network vn {
...
}
multy subnet example {
virtual_network = vn
}
But we want to support hardcoded ids in these cases, which would look something like (schema details TBD)
multy subnet example {
virtual_network {
virtual_network_id = "123"
virtual_network_name = "456"
route_table_id = "789"
}
}
With potentially some of the paramters being optional and the behavior would change depend on that. f.e. if route_table_id is not set, we don't create a default association in azure.
Add CONTRIBUTING.MD with
AWS S3 & Azure Storage Account
Tasks:
The azure subnet is not a zonal service. Resources are deployed into specific AZs unlike AWS.
Possible solutions:
Aws uses a token based system (tf has eks_cluster_auth data source for this) while azure uses a username+password and an asymmetric key authentication system
Add unit tests for resource_metadata:
Add unit tests for grpc:
Add unit tests for deploy:
Create ACL parameter for object storage objects
Allow private and public_read
Allow SSH public key authentication
aws_instance.key_name
azurerm_linux_virtual_machine.admin_ssh_key
Validates if the config is valid without deploying anything / doing any web requests
Research how we want to model data providers and implement them.
Open questions:
Allow for hardcoded ID values in place of resource references. Likely dependent on #2 because multy resource can resolve into multiple cloud resources
multy "subnet" "subnet" {
virtual_network_id = example_vn.id
virtual_network_id = "123"
}
cloud() function will allow dynamic configuration depending on which provider is being used. example below will deploy an aws ec2 instance with t2.micro
and azure vm with Standard_F4s_v2
variable vm_size {
default = cloud({
aws = "t2.micro"
azure = "Standard_F4s_v2"
})
}
multy virtual_machine vm {
size = var.vm_size
...
}
Map machine images across AWS/Azure based on OS & Size
More details in test/e2e/database/database_test.go
AWS RDS & Azure Database for MySQL
Tasks:
Add flags to CLI
version
- display cli version
check
- checks if config is valid
AWS AppConfig & Azure App Configuration
Tasks:
Multy resource data sources
Terraform has count and for_each to handle cases where a user wants to easily replicate resources.
We want to do something similar in multy but since there's not a 1:1 mapping between deployed resources and multy resources, we have to decide if we replicate every single resource or if we can reuse some common ones.
AWS Secrets Manager & Azure Key Vault
Tasks:
Add CLI tests alongside go_test action
Tests:
Map AZ and Regions between AWS & Azure. Use lowest common value and expose them as multy variable
Region | AWS | Azure |
---|---|---|
UK (London) | eu-west-2 | UK South |
Ireland | eu-west-1 | North Europe |
France (Paris) | eu-west-3 | France Central |
Germany (Frankfurt) | eu-central-1 | Germany West Central |
Sweden (Stockholm) | eu-north-1 | Sweden Central |
South Africa | af-south-1 (Cape Town) | South Africa North (Johannesburg) |
AZ | AWS | Azure |
---|---|---|
UK | 3 | 3 |
Ireland | 3 | 3 |
France | 3 | 3 |
Germany | 3 | 3 |
Sweden | 3 | 3 |
South Africa | 3 | 3 |
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.