Amazon web services 地形分离并重新连接ebs卷
我正在使用Terraform来加速EC2。创建EC2后,我将一些数据写入/myapp。每次EC2被销毁并重新创建时,如何分离/myapp并重新连接它?我做了一些研究,发现以下代码可能是选项:Amazon web services 地形分离并重新连接ebs卷,amazon-web-services,amazon-ec2,terraform,Amazon Web Services,Amazon Ec2,Terraform,我正在使用Terraform来加速EC2。创建EC2后,我将一些数据写入/myapp。每次EC2被销毁并重新创建时,如何分离/myapp并重新连接它?我做了一些研究,发现以下代码可能是选项: resource "aws_instance" "my_ec2" { ami = "${var.ami_id}" instance_type = "${var.instance_type}" count = "${var.node_count}" subn
resource "aws_instance" "my_ec2" {
ami = "${var.ami_id}"
instance_type = "${var.instance_type}"
count = "${var.node_count}"
subnet_id = "${var.subnet_id}"
key_name = "${var.key_pair}"
root_block_device = {
volume_type = "gp2"
volume_size = 20
delete_on_termination = false
}
vpc_security_group_ids = ["${var.security_group_ids}"]
}
resource "aws_ebs_volume" "my_vol" {
size = 120
count = "${var.node_count}"
type = "gp2"
}
resource "aws_volume_attachment" "my_vol_att" {
device_name = "/dev/xvdf"
volume_id = "${element(aws_ebs_volume.my_vol.*.id, count.index)}"
instance_id = "${element(aws_instance.my_ec2.*.id, count.index)}"
count = "${var.node_count}"
}
我的问题是:
如果我的ec2被破坏:
对不起,我的问题听起来可能很傻,因为我对Terraform和AWS都很陌生。我相信当用户数据发生变化时,就会发生这种情况。例如,您想说在ebs卷上安装jenkins,该卷是持久的
resource "aws_ebs_volume" "jenkins-data" {
availability_zone = local.jenkins-az-location
size = 20
type = "gp2"
tags = {
Name = "jenkins-data"
}
}
resource "aws_volume_attachment" "jenkins-data-attachment" {
device_name = var.INSTANCE_DEVICE_NAME
volume_id = aws_ebs_volume.jenkins-data.id
instance_id = aws_instance.jenkins-instance.id
skip_destroy = true
}
然后是您的用户的数据
#!/bin/bash
# volume setup
vgchange -ay
DEVICE_FS=`blkid -o value -s TYPE ${DEVICE}`
if [ "`echo -n $DEVICE_FS`" == "" ] ; then
# wait for the device to be attached
DEVICENAME=`echo "${DEVICE}" | awk -F '/' '{print $3}'`
DEVICEEXISTS=''
while [[ -z $DEVICEEXISTS ]]; do
echo "checking $DEVICENAME"
DEVICEEXISTS=`lsblk |grep "$DEVICENAME" |wc -l`
if [[ $DEVICEEXISTS != "1" ]]; then
sleep 15
fi
done
pvcreate ${DEVICE}
vgcreate data ${DEVICE}
lvcreate --name volume1 -l 100%FREE data
mkfs.ext4 /dev/data/volume1
fi
mkdir -p /var/lib/jenkins
echo '/dev/data/volume1 /var/lib/jenkins ext4 defaults 0 0' >> /etc/fstab
mount /var/lib/jenkins
现在,不管出于什么原因,您都希望更改用户数据,然后再次运行terraform,它将破坏该实例,并构建另一个实例和驱动器
老实说,我从来没有研究过这个问题,每次我需要做一些侵入性手术时,我只是拍一个卷的快照,如果卷被破坏了,我会从快照中重新创建它,然后将更改推回到地形状态文件中,这可能是一件痛苦的事情,但在我的情况下,Jenkins通常不会完全消失
一旦我得到了进一步的修改,我可能会对此进行更新,但目前我确信TF中有一个选项不通过api或其他方式销毁资产。如果我正确理解了您的问题,您希望能够独立于EBS卷销毁EC2实例 这是可能的,但需要通过
数据
资源进行一些动态解析
我在这里要做的是创建一个Terraform模块,它封装了您上面编写的代码,但用如下数据源替换了aws\u ebs\u volume
资源:
my_模块/main.tf
main.tf
注意:我在这里使用的数据源试图通过Name
标记匹配卷,您在代码中没有设置该标记,但在示例中设置了该标记
这样构建代码将允许您手动创建卷,或者通过调用此卷的更高级别的terraform代码创建卷。只要您的状态文件是独立的,您就可以独立地销毁实例和卷。请澄清您所说的销毁是什么意思。你打算用TF命令摧毁整个TF计划吗?您是否打算使用TF命令销毁单个my_ec2资源?您是否打算以其他方式(如AWS控制台或CLI)销毁my_ec2?
resource "aws_instance" "my_ec2" {
ami = "${var.ami_id}"
instance_type = "${var.instance_type}"
count = "${var.node_count}"
subnet_id = "${var.subnet_id}"
key_name = "${var.key_pair}"
root_block_device = {
volume_type = "gp2"
volume_size = 20
delete_on_termination = false
}
vpc_security_group_ids = ["${var.security_group_ids}"]
}
data "aws_ebs_volume" "my_vol" {
most_recent = true
filter {
name = "volume-type"
values = ["gp2"]
}
filter {
name = "tag:Name"
values = [var.volume_name]
}
}
resource "aws_volume_attachment" "my_vol_att" {
device_name = "/dev/xvdf"
volume_id = "${element(aws_ebs_volume.my_vol.*.id, count.index)}"
instance_id = "${element(aws_instance.my_ec2.*.id, count.index)}"
count = "${var.node_count}"
}
variable "volume_name"{
type = string
default = "my_volume"
}
module {
source = "./my-module"
volume_name = "MyManuallyCreatedVolume
}