Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 地形分离并重新连接ebs卷_Amazon Web Services_Amazon Ec2_Terraform - Fatal编程技术网

Amazon web services 地形分离并重新连接ebs卷

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

我正在使用Terraform来加速EC2。创建EC2后,我将一些数据写入/myapp。每次EC2被销毁并重新创建时,如何分离/myapp并重新连接它?我做了一些研究,发现以下代码可能是选项:

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被破坏:

  • ec2不见了
  • 我的书不见了
  • 我的电话号码是多少?如果是,我在哪里可以看到它
  • 当我再次运行Terraform代码以在ec2被破坏后重新创建它时:

  • 它会创建新的my_vol id吗
  • 你会怎么样
  • 我的电话号码
  • 我的电话号码是多少?连接到设备上的指针或m_vol的副本,除非手动删除,否则不会被销毁


    对不起,我的问题听起来可能很傻,因为我对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
    }