Launch a VM using Terraform - hqzhang/cloudtestbed GitHub Wiki

  1. 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
  1. 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'
  1. 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}"
}
  1. launch VM in AWS
  terraform get 
  terraform plan
  terraform apply
  1. clean up vms
terraform destroy

Deploy a single server Deploy a single web server Deploy a cluster of web servers Deploy a load balancer

⚠️ **GitHub.com Fallback** ⚠️