æ¢åã® CloudFormation ãã³ãã¬ãŒãã Terraform ã«çœ®ãæããŠã¿ã
çŸåšãéçšã§äœ¿çšããŠããã¡ããã£ãšãã CloudFormation ãã³ãã¬ãŒããããã®ã§ãããTerraform ã«çœ®ãæãããšã©ããªæãã«ãªãã詊ããŠã¿ãŸããã
以äžãçŸåšäœ¿ã£ãŠãã CloudFormation ã®ãã³ãã¬ãŒãã§ãã
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "ImageId" : { "Type" : "String", "MinLength" : "12", "MaxLength" : "12", "AllowedPattern" : "ami-[a-zA-Z0-9]*" }, "InstanceType" : { "Default" : "t2.micro", "Type" : "String", "AllowedValues" : [ "t2.micro", "t2.small", "t2.medium", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "g2.2xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "hs1.8xlarge" ] }, "KeyName" : { "Type" : "String", "MinLength" : "1", "MaxLength" : "64" }, "SecurityGroup" : { "Type" : "String", "MinLength" : "1", "MaxLength" : "64" }, "LoadBalancer" : { "Type" : "String", "MinLength" : "1", "MaxLength" : "64" }, "Desired" : { "Default" : "1", "Type" : "Number", "MinValue" : "1" }, "Min" : { "Default" : "1", "Type" : "Number", "MinValue" : "1" }, "Max" : { "Default" : "1", "Type" : "Number", "MinValue" : "1" } }, "Resources" : { "LaunchConfiguration" : { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Properties" : { "ImageId" : { "Ref" : "ImageId" }, "InstanceType" : { "Ref" : "InstanceType" }, "InstanceMonitoring" : "true", "KeyName" : { "Ref" : "KeyName" }, "SecurityGroups" : [ { "Ref" : "SecurityGroup" } ] } }, "AutoScalingGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "Cooldown" : "300", "DesiredCapacity" : { "Ref" : "Desired" }, "HealthCheckGracePeriod" : "300", "LaunchConfigurationName" : { "Ref" : "LaunchConfiguration" }, "LoadBalancerNames" : [ { "Ref" : "LoadBalancer" } ], "MaxSize" : { "Ref" : "Max" }, "MinSize" : { "Ref" : "Min" } } }, "IncreaseGroupSize" : { "Type" : "AWS::AutoScaling::ScalingPolicy", "Properties" : { "AdjustmentType" : "ChangeInCapacity", "AutoScalingGroupName" : { "Ref" : "AutoScalingGroup" }, "Cooldown" : "60", "ScalingAdjustment" : "1" } }, "DecreaseGroupSize" : { "Type" : "AWS::AutoScaling::ScalingPolicy", "Properties" : { "AdjustmentType" : "ChangeInCapacity", "AutoScalingGroupName" : { "Ref" : "AutoScalingGroup" }, "Cooldown" : "60", "ScalingAdjustment" : "-1" } }, "CPUAlarmHigh" : { "Type" : "AWS::CloudWatch::Alarm", "Properties" : { "AlarmActions" : [ { "Ref" : "IncreaseGroupSize" } ], "ComparisonOperator" : "GreaterThanThreshold", "Dimensions" : [ { "Name" : "AutoScalingGroupName", "Value" : { "Ref" : "AutoScalingGroup" } } ], "EvaluationPeriods" : "1", "MetricName" : "CPUUtilization", "Namespace" : "AWS/EC2", "Period" : "60", "Statistic" : "Average", "Threshold" : "70" } }, "CPUAlarmLow" : { "Type" : "AWS::CloudWatch::Alarm", "Properties" : { "AlarmActions" : [ { "Ref" : "DecreaseGroupSize" } ], "ComparisonOperator" : "LessThanThreshold", "Dimensions" : [ { "Name" : "AutoScalingGroupName", "Value" : { "Ref" : "AutoScalingGroup" } } ], "EvaluationPeriods" : "2", "MetricName" : "CPUUtilization", "Namespace" : "AWS/EC2", "Period" : "300", "Statistic" : "Average", "Threshold" : "20" } } } }
Launch Configuration ãš Auto Scaling Group ãäœæãã€ã€ãããã«ä»éãã CloudWatch ã® Alarm ãš Scaling Policy ããã£ã€ããŠããã ãã®ã·ã³ãã«ãªãã®ã§ãã
ãã©ã¡ãŒã¿ãšããŠã¯ãLaunch Configuration ã®ããŒã¹ã«ãªã AMI ã® ID ãã€ã³ã¹ã¿ã³ã¹ã¿ã€ããAuto Scaling Group ã®ããŒã¹ã«ãªã ELB åãªã©ããããŸãã
ããã Terraform ã®èšå®ãã¡ã€ã«ã«ãããšä»¥äžã®ããã«ãªããŸãã
variable "aws_access_key" {} variable "aws_secret_key" {} variable "aws_region" { default = "ap-northeast-1" } variable "launch_configuration_name" {} variable "image_id" {} variable "instance_type" { default = "t2.micro" } variable "key_name" {} variable "security_group" {} variable "auto_scaling_group_name" {} variable "load_balancer" {} variable "desired" {} variable "min" {} variable "max" {} provider "aws" { access_key = ${var.aws_access_key} secret_key = ${var.aws_secret_key} region = ${var.aws_region} } resource "aws_launch_configuration" "default" { name = ${var.launch_configuration_name} image_id = ${var.image_id} instance_type = ${var.instance_type} key_name = ${var.key_name} security_groups = [${var.security_group}] } resource "aws_autoscaling_group" "default" { name = ${var.auto_scaling_group_name} availability_zones = ["ap-northeast-1a", "ap-northeast-1c"] health_check_grace_period = 300 load_balancers = [${var.load_balancer}] desired_capacity = ${var.desired} max_size = ${var.max} min_size = ${var.min} launch_configuration = ${aws_launch_configuration.default.name} }
çããªã£ãïŒïŒ
ãšæããããTerraform ã«ã¯ Scaling Policy ãš CloudWatch ã® Alarm ãäœæããããã®ãªãœãŒã¹ããŸã çšæãããŠããªãããã§ãããã®éšåã¯èšè¿°ããŠããŸããã
ãŸããCloudFormation ã«ã¯äŸ¿å©ãªé¢æ°ãããã€ãçšæãããŠããŠãäžã®ãã³ãã¬ãŒãã§ã¯ Fn::GetAZs ãšããã颿°ã䜿ã£ãŠãªãŒãžã§ã³å ã§æå¹ãª AZ ããªã¹ãã¢ããããŠããŸããããTerraform ã§ã¯æ®å¿µãªãããã¿æã¡ã§ãã
å®è¡
å®è¡ããŠã¿ãŸãã
$ terraform apply -var-file=./terraform.tfvars
倿°ãã¡ã€ã«ã¯ terraform.tfvars ãšãããã¡ã€ã«ã«ä»¥äžã®ããã«èšè¿°ããŠããŸãã
aws_access_key = "XXXXXXXXXXXXXXXXXXXXX" aws_secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" launch_configuration_name = "my-conf" image_id = "ami-XXXXXXXX" instance_type = "t2.micro" key_name = "sei" security_group = "my-sg" auto_scaling_group_name = "my-group" load_balancer = "my-lb" desired = 2 min = 1 max = 2
ãŸã IAM ã®ãµããŒãã¯ãªãããã§ãProvider ã« aws ãæå®ããå Žåã¯ãã¢ã¯ã»ã¹ããŒãšã·ãŒã¯ã¬ããããŒã®æå®ãå¿ é ã«ãªããŸãã
å®è¡çµæã¯ä»¥äžã®ããã«ãªããŸããã
aws_launch_configuration.default: Creating... image_id: "" => "ami-XXXXXXXX" instance_type: "" => "t2.micro" key_name: "" => "sei" name: "" => "my-conf" security_groups.#: "" => "1" security_groups.0: "" => "my-sg" aws_launch_configuration.default: Creation complete aws_autoscaling_group.default: Creating... availability_zones.#: "" => "2" availability_zones.0: "" => "ap-northeast-1a" availability_zones.1: "" => "ap-northeast-1c" desired_capacity: "" => "2" health_check_grace_period: "" => "300" launch_configuration: "" => "my-conf" load_balancers.#: "" => "1" load_balancers.0: "" => "my-lb" max_size: "" => "2" min_size: "" => "1" name: "" => "my-group" aws_autoscaling_group.default: Creation complete Apply complete! Resources: 2 added, 0 changed, 0 destroyed. The state of your infrastructure has been saved to the path below. This state is required to modify and destroy your infrastructure, so keep it safe. To inspect the complete state use the `terraform show` command. State path: terraform.tfstate
äžæããã£ãããã§ãã
ãŸãã« Infrastructure as CodeïŒãšããæãã
åé€
åé€ã¯ä»¥äžã®ããã«ããŸãã
$ terraform plan -destroy -out=./terraform.tfplan -var-file=./terraform.tfvars $ terraform apply ./terraform.tfplan aws_autoscaling_group.default: Destroying... aws_autoscaling_group.default: Error: ResourceInUse: You cannot delete an AutoScalingGroup while there are instances or pending Spot instance request(s) still in the group. Error applying plan: 1 error(s) occurred: * ResourceInUse: You cannot delete an AutoScalingGroup while there are instances or pending Spot instance request(s) still in the group. Terraform does not automatically rollback in the face of errors. Instead, your Terraform state file has been partially updated with any resources that successfully completed. Please address the error above and apply again to incrementally change your infrastructure.
ããããAutoScaling å ã«ã€ã³ã¹ã¿ã³ã¹ãæ®ã£ãŠããããåé€ã§ããªããïŒãšããæšã®ã¡ãã»ãŒãžãåºãŠå€±æããŠããŸããŸãã
ãªã...
æ²ãããã©æåã§ã³ã³ãœãŒã«ããæ¶ããŸããã
è£è¶³
0.1.0 ã§ã¯ aws_autoscaling_group ãªãœãŒã¹ã« ELB ãæå®ãããã©ã¡ãŒã¿ã¯çšæãããŠããŸããããGithub äžã®éçºçã§ã¯ã»ãŒå®è£ ãããŠããããã«èŠããã®ã§ãã¡ããã£ãšãœãŒã¹ãããã£ãŠäœ¿ã£ãŠã¿ããäžæããããŸããã
è¿ããã¡ã«æå¹ã«ãªããšå¬ããã§ããã
















