iamzjk
11/7/2019 - 4:12 PM

Terraform Elastic Beanstalk

Terraform Commands

terraform init
terraform refresh
terraform plan
terraform apply

# MORE COMMANDS
terraform validate
terraform fmt

Directory Structure

scripts/
├── application
│   ├── create_application.tf
│   ├── terraform.tfstate (auto-generated)
│   └── terraform.tfstate.backup (auto-generated)
└── environment
    ├── prd
    │   ├── create_environment.tf
    │   ├── terraform.tfstate (auto-generated)
    │   └── terraform.tfstate.backup (auto-generated)
    └── uat
        ├── create_environment.tf
        ├── terraform.tfstate (auto-generated)
        └── terraform.tfstate.backup (auto-generated)

References

# Configure the AWS Provider
provider "aws" {
  region = "us-east-1"
}

resource "aws_elastic_beanstalk_application" "app" {
  name        = "app"
  description = "app"
}

resource "aws_elastic_beanstalk_environment" "app-test" {
  name                = "app-test"
  application         = "${aws_elastic_beanstalk_application.app.name}"
  description         = "app test"
  solution_stack_name = "64bit Amazon Linux 2018.03 v2.9.3 running Python 3.6"
  cname_prefix        = "app-test"
  tags = {
    Name = "app-test"
  }
  setting {
    namespace = "aws:ec2:vpc"
    name      = "VPCId"
    value     = "vpc-xxx"
  }
  setting {
    namespace = "aws:ec2:vpc"
    name      = "AssociatePublicIpAddress"
    value     = "true"
  }
  setting {
    namespace = "aws:ec2:vpc"
    name      = "Subnets"
    value     = "subnet-xxx"
  }
  setting {
    namespace = "aws:ec2:vpc"
    name      = "ELBSubnets"
    value     = "subnet-xxx"
  }
  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name      = "IamInstanceProfile"
    value     = "aws-elasticbeanstalk-ec2-role"
  }
  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name      = "InstanceType"
    value     = "t2.micro"
  }
  setting {
    namespace = "aws:autoscaling:asg"
    name      = "Availability Zones"
    value     = "Any"
  }
  setting {
    namespace = "aws:autoscaling:asg"
    name      = "MinSize"
    value     = "1"
  }
  setting {
    namespace = "aws:autoscaling:asg"
    name      = "MaxSize"
    value     = "2"
  }
  setting {
    namespace = "aws:elasticbeanstalk:environment"
    name      = "ServiceRole"
    value     = "aws-elasticbeanstalk-service-role"
  }
  setting {
    namespace = "aws:elasticbeanstalk:healthreporting:system"
    name      = "SystemType"
    value     = "enhanced"
  }
  setting {
    namespace = "aws:autoscaling:updatepolicy:rollingupdate"
    name      = "RollingUpdateEnabled"
    value     = "true"
  }
  setting {
    namespace = "aws:autoscaling:updatepolicy:rollingupdate"
    name      = "RollingUpdateType"
    value     = "Immutable"
  }
  setting {
    namespace = "aws:autoscaling:updatepolicy:rollingupdate"
    name      = "MinInstancesInService"
    value     = "1"
  }
  setting {
    namespace = "aws:autoscaling:updatepolicy:rollingupdate"
    name      = "MaxBatchSize"
    value     = "1"
  }
  # HTTPS
  setting {
    namespace = "aws:elb:listener:443"
    name      = "InstancePort"
    value     = "80"
  }
  setting {
    namespace = "aws:elb:listener:443"
    name      = "InstanceProtocol"
    value     = "HTTP"
  }
  setting {
    namespace = "aws:elb:listener:443"
    name      = "ListenerEnabled"
    value     = "true"
  }
  setting {
    namespace = "aws:elb:listener:443"
    name      = "ListenerProtocol"
    value     = "HTTPS"
  }
  setting {
    namespace = "aws:elb:listener:443"
    name      = "SSLCertificateId"
    value     = "xxxx"
  }
  # STATIC FILE PATH
  setting {
    namespace = "aws:elasticbeanstalk:container:python"
    name      = "StaticFiles"
    value     = "/static/=app/static/"
  }
  # ENV variables
  setting {
    namespace = "aws:elasticbeanstalk:application:environment"
    name      = "stage"
    value     = "test"
  }
}