使用Terraform重复基础架构创建

时间:2018-10-22 23:22:05

标签: terraform terraform-provider-aws

我正在探索Terraform作为管理可重复使用的AWS EC2实例组的工具。我对基础结构工具并不十分熟悉,并且在此用例中寻求有关操作的建议。

  1. 我想重复创建多个EC2实例-假设我第一次调用terraform apply时,我的基础架构需要3个实例。一段时间后,我想创建100个实例-也许不破坏我之前创建的3个实例。如何在Terraform中执行此操作?我应该做吗? 如果我不应该使用Terraform重复配置,那么有什么好的工具可以做到这一点?

  2. 可以使用哪些工具在创建的Terraform基础结构上远程执行bash或Python脚本?我知道Terraform具有remote-exec,但是我需要在这些实例上运行的命令花费很长的时间(3-5小时),因此我宁愿没有处于初始化状态的资源,因为我无法监视它们。

2 个答案:

答案 0 :(得分:0)

带有预装软件的自定义AMI将帮助您减少启动时间。 Hashicorp Packer https://www.packer.io/intro/是创建AMI的好工具。

  1. 使用Terraform创建一个ec2-instance。
  2. 用户数据脚本或运行remote-exec来运行安装所需软件包/软件的脚本。
  3. 从上述ec2-instance创建一个AMI。
  4. 使用新创建的AMI启动所需数量的ec2实例。

Ansible还提供了非常好的功能,可以将基础设施作为代码进行管理。

答案 1 :(得分:-1)

这是terraform的非常多的用例,如果您将通过terraform来做,那会很好。

您可以按照以下代码使用,以便随意旋转实例,更改count的值后必须再次应用。它不会影响任何当前正在运行的实例并与您的值匹配。

resource "aws_instance" "web" {
  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"
  count = 3
  availability_zone = "${element(var.az, count.index)}"

  tags {
    Name = "${count.index}"
  }
}

此外,如果您想在实例启动时执行某些命令。您可以使用用户数据脚本来做到这一点。

resource "aws_instance" "..." {
  user_data = "${file("../../tmp/aws/userdata.sh")}"
  ...
}

对于可重复性,可以使用terraform模块。例如:如果您想将代码用于多个基础设施,请说dev,staging,production。对于模块,您不必一次又一次编写相同的代码来启动ec2实例。您可以为不同的基础结构传递不同的变量。

示例:

module "dev" {
  source = "./modules/dev"
  count  = 2
  region = "us-east-1"
}

module "production" {
  source = "./modules/production"
  count  = 5
  region = "us-east-1"
}

参考:https://www.terraform.io/docs/modules/usage.html

如果您不必删除旧实例并减小正在运行的实例的数量。但这并不是地形会引起注意的。 在创建自动扩展策略时必须提及该策略。

下面列出了许多终止策略。

Amazon EC2 Auto Scaling支持以下自定义终止策略:

OldestInstance. Terminate the oldest instance in the group. This option is useful when you're upgrading the instances in the Auto Scaling group to a new EC2 instance type. You can gradually replace instances of the old type with instances of the new type.

NewestInstance. Terminate the newest instance in the group. This policy is useful when you're testing a new launch configuration but don't want to keep it in production.

OldestLaunchConfiguration. Terminate instances that have the oldest launch configuration. This policy is useful when you're updating a group and phasing out the instances from a previous configuration.

ClosestToNextInstanceHour. Terminate instances that are closest to the next billing hour. This policy helps you maximize the use of your instances and manage your Amazon EC2 usage costs.

Default. Terminate instances according to the default termination policy. This policy is useful when you have more than one scaling policy for the group.

您可以参考下面的链接以获取更多信息。

  

参考:   https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance-termination.html