Launch a VM using Terraform - hqzhang/cloudtestbed GitHub Wiki
- login AWS account (setup an AWS account if not)
https://aws.amazon.com/console/
create user perssion, otherwise request refuse with 403
1) create group attached permission for users.( Maybe)
2) create role attached permission for launch ec2(Maybe)
3) create policy attached permission for users (Maybe)
4) create users attached group/policy
5) create aws_access_key_id and aws_secret_access_key
cat <<EOF > ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYY
EOF
- Install AWS CLI
pip install awscli --upgrade --user
0) list all regions/instances
aws ec2 describe-instances
aws ec2 describe-images
aws ec2 describe-regions --output table
aws ec2 describe-key-pairs
"KeyName": ["aws01","HQwestkey"]
aws ec2 describe-security-groups
aws iam list-instance-profiles
aws iam list-roles
1)aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
2) launch instance
aws ec2 run-instances --image-id ami-d2c924b2
--vpc-id vpc-5699f030
--security-group-ids sg-c05795bd
--count 1
--instance-type m3.medium
--key-name key-mantl --query 'Instances[0].InstanceId'
- Install Terraform:
1. download zip file
wget -LO https://releases.hashicorp.com/terraform/0.10.5/terraform_0.10.5_linux_amd64.zip?_ga=2.150504254.982879745.1505693103-1654937707.1505693103
2. unzip and install
cp terraform /usr/local/bin
in Mac brew install terraform
3)create a terrafile: aws.tf
variable "amis" {
default = {
us-east-1 = "ami-6d1c2007"
us-west-2 = "ami-d2c924b2"
us-west-1 = "ami-af4333cf"
eu-central-1 = "ami-9bf712f4"
eu-west-1 = "ami-7abd0209"
ap-southeast-1 = "ami-f068a193"
ap-southeast-2 = "ami-fedafc9d"
ap-northeast-1 = "ami-eec1c380"
sa-east-1 = "ami-26b93b4a"
}
}
variable "availability_zones" {
default = "a,b,c"
}
variable "control_count" { default = 1 }
variable "datacenter" {default = "aws-us-west-2"}
variable "edge_count" { default = 2 }
variable "region" {default = "us-west-2"}
variable "short_name" {default = "mantl"}
variable "long_name" {default = "mantl"}
variable "ssh_username" {default = "centos"}
variable "worker_count" { default = 4 }
variable "kubeworker_count" { default = 2 }
variable "dns_subdomain" { default = ".dev" }
variable "dns_domain" { default = "hongqi.com." }
variable "dns_zone_id" { default = "Z15OHQVEEQ76RR" }
variable "control_type" { default = "m3.medium" }
variable "edge_type" { default = "m3.medium" }
variable "worker_type" { default = "m3.large" }
variable "kubeworker_type" { default = "m3.large" }
variable "role" { default = "control"}
variable "count_format" {default = "%02d"}
variable "ebs_volume_size" {default = "20"} # size is in gigabytes
variable "ebs_volume_type" {default = "gp2"}
provider "aws" {
region = "${var.region}"
}
module "vpc" {
source ="./terraform/aws/vpc"
availability_zones = "${var.availability_zones}"
short_name = "${var.short_name}"
long_name = "${var.long_name}"
region = "${var.region}"
}
module "ssh-key" {
source ="./terraform/aws/ssh"
short_name = "${var.short_name}"
}
module "security-groups" {
source = "./terraform/aws/security_groups"
short_name = "${var.short_name}"
vpc_id = "${module.vpc.vpc_id}"
}
module "iam-profiles" {
source = "./terraform/aws/iam"
short_name = "${var.short_name}"
}
resource "aws_instance" "control_node" {
ami = "${lookup(var.amis, var.region)}"
instance_type = "${var.control_type}"
count = 1
vpc_security_group_ids = [ "${split(",", "${module.vpc.default_security_group},${module.security-groups.ui_security_group},${module.security-groups.control_security_group}")}"]
key_name = "${module.ssh-key.ssh_key_name}"
associate_public_ip_address = true
subnet_id = "${element(split(",", "${module.vpc.subnet_ids}"), count.index)}"
iam_instance_profile = "${module.iam-profiles.control_iam_instance_profile}"
root_block_device {
delete_on_termination = true
volume_size = "${var.ebs_volume_size}"
volume_type = "${var.ebs_volume_type}"
}
tags {
Name = "${var.short_name}-${var.role}-${format(var.count_format, count.index+1)}"
sshUser = "${var.ssh_username}"
role = "control"
dc = "${var.datacenter}"
KubernetesCluster = "${var.short_name}"
}
}
module "route53" {
source = "./terraform/aws/route53/dns"
control_count = "${var.control_count}"
control_ips = "${aws_instance.control_node.public_ip}"
domain = "${var.dns_domain}"
edge_count = "${var.edge_count}"
hosted_zone_id = "${var.dns_zone_id}"
short_name = "${var.short_name}"
subdomain = "${var.dns_subdomain}"
worker_count = "${var.worker_count}"
kubeworker_count = "${var.kubeworker_count}"
}
- launch VM in AWS
terraform get
terraform plan
terraform apply
- clean up vms
terraform destroy
Deploy a single server Deploy a single web server Deploy a cluster of web servers Deploy a load balancer