如何使用Terraform格式化和装载短暂的磁盘?

时间:2017-06-28 10:38:41

标签: amazon-web-services amazon-ec2 terraform ec2-ami

我正在编写Packer和Terraform代码以在aws上创建一个不可变的infra。但是,在磁盘上安装ext4并安装它似乎并不简单。

步骤看似简单:

  • 在t2.micro上创建包含所有软件的包装器的ami,首先在测试时使用,然后在生产时使用。
  • 从这个具有300GB临时磁盘的ami启动一个r3.4xlarge实例。将此磁盘格式化为ext4,将其挂载并将/ var / lib / docker重定向到新文件系统,以提高性能。
  • 完成应用程序启动的其余部分。

首先:

最佳做法是使用您将使用的相同实例类型创建ami,或者使用一个' generic'从那张图片并启动多重实例类型? 什么哲学是最好的?

  • packer(软件版本) - > terraform(实例+挂载磁盘) - >部署?
  • packer(软件版本) - > packer(instancetype specific mounts) - > terraform(实例) - >部署?
  • packer(软件版本,特定于实例的安装) - > terraform - >部署?

后者开始变得越来越好,但每个实例类型需要一个ami。

到目前为止我尝试过:

根据this answer,最好使用user_data工作方式而不是供应方式。所以我走了那条路。

This answer看起来很有希望但是已经老了它不再适用了。我可以更新它,但可能有一种不同的,更好的方式。

This answer似乎也很有希望,但却抱怨$ {DEVICE}。我想知道该变量来自哪里,因为template_file中没有指定vars。如果我将自己的DEVICE变量设置为xvdb然后运行,但不会产生结果,因为xvdb在lsblk中可见但在blkid中不可见。

这是我的代码。 format_disks.sh文件与the one mentioned above相同。非常感谢任何帮助。

# Create a new instance of the latest Ubuntu 16.04 on an
# t2.micro node with an AWS Tag naming it "test1"
provider "aws" {
  region = "us-east-1"
}

data "template_file" "format-disks" {
  template = "${file("format_disk.sh")}"

  vars {
    DEVICE = "xvdb"
  }
}

resource "aws_instance" "test1" {
  ami           = "ami-98181234"
  instance_type = "r3.4xlarge"
  key_name = "keypair-1"               # This needs to be changed so multiple users can use this
  subnet_id = "subnet-a0aeb123"            # maps to the vpc for the us production
  associate_public_ip_address = "true"
  vpc_security_group_ids = ["sg-f3e91234"] #backendservers
  user_data = "${data.template_file.format-disks.rendered}"
  tags {
    Name = "test1"
  }
  ephemeral_block_device {
    device_name = "xvdb"
    virtual_name = "ephemeral0"
  }
}

1 个答案:

答案 0 :(得分:0)

让我对这个话题发表看法。

我认为cloud-init是AWS的关键,因为您可以动态创建所需的机器。 首先,尝试更改一些全局脚本,这些脚本将在计算机启动时使用。然后,您应该将该脚本添加为用户数据,我建议您同时使用ec2自动缩放功能,因此,如果更改cloud-init脚本,则可以终止实例,另一个实例将自动创建。

我的结构目录。

.
|____main.tf
|____templates
| |____cloud-init.tpl

main.tf

provider "aws" {
  region = "us-east-1"
}

data "template_file" "cloud_init" {
  template = file("${path.module}/templates/cloud-init.tpl")
}

data "aws_ami" "linux_ami" {
  most_recent = "true"
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-2.0.????????.?-x86_64-gp2"]
  }
}

resource "aws_instance" "test1" {
  ami                         = data.aws_ami.linux_ami.image_id
  instance_type               = "r3.4xlarge"
  key_name                    = "keypair-1"       
  subnet_id                   = "subnet-xxxxxx"
  associate_public_ip_address = true
  vpc_security_group_ids      = ["sg-xxxxxxx"] 
  user_data                   = data.template_file.cloud_init.rendered
  root_block_device {
      delete_on_termination = true
      encrypted             = true
      volume_size           = 10
      volume_type           = "gp2"
  }

  ebs_block_device {
      device_name = "ebs-block-device-name"
      delete_on_termination = true
      encrypted             = true
      volume_size           = 10
      volume_type           = "gp2"
  }

  network_interface {
      device_index          = 0
      network_interface_id  = var.network_interface_id
      delete_on_termination = true
  }

  tags = {
    Name = "test1"
    costCenter = "xxxxx"
    owner = "xxxxx"
  }
}

templates / cloud-init.tpl

#!/bin/bash -x 

yum update -y
yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent

pip install aws-ssm-tunnel-agent

echo "[INFO] SSM agent has been installed!"
# More scripts here.

您要附加临时磁盘吗?您是否尝试过将root_block_device的{​​{1}}值添加为delete_on_termination?这样,销毁aws ec2实例资源后,磁盘将被删除。这是节省AWS成本的好方法,但要小心,如果存储的数据不重要或已备份,请使用它。

如果需要在此实例上附加外部ebs磁盘,则可以使用AWS API,并确保将计算机与可以使用的磁盘放在同一true中。

让我知道您是否需要一些bash脚本,但这很简单。