Terraform AWS:无法将先前创建的 root_block_device 与使用 aws_launch_configuration 启动的 AWS EC2 实例重用
Posted
技术标签:
【中文标题】Terraform AWS:无法将先前创建的 root_block_device 与使用 aws_launch_configuration 启动的 AWS EC2 实例重用【英文标题】:Terraform AWS : Couldn't reuse previously created root_block_device with AWS EC2 instance launched with aws_launch_configuration 【发布时间】:2020-11-22 03:14:05 【问题描述】:我已经使用 terraform 将 ELK 堆栈部署到 AWS ECS。几周前一切都运行良好,但 2 天前我不得不重新启动实例。
遗憾的是,新实例不依赖现有卷来挂载根块设备。所以我的所有 elasticsearch 数据不再可用于我的 Kibana 实例。
数据还在,上一卷,目前未使用。
所以我尝试了很多方法来将此卷附加到“dev/xvda”,但没有示例:
使用 ebs_block_device 而不是 root_block_device 使用 当实例已经运行时交换“dev/xvda”我正在使用带有 aws_launch_configuration 的 aws_autoscaling_group。
resource "aws_launch_configuration" "XXX"
name = "XXX"
image_id = data.aws_ami.latest_ecs.id
instance_type = var.INSTANCE_TYPE
security_groups = [var.SECURITY_GROUP_ID]
associate_public_ip_address = true
iam_instance_profile = "XXXXXX"
spot_price = "0.04"
lifecycle
create_before_destroy = true
user_data = templatefile("$path.module/ecs_agent_conf_options.tmpl",
cluster_name = aws_ecs_cluster.XXX.name
)
//The volume i want to reuse was created with this configuration. I though it would
//be enough to reuse the same volume. It doesn't.
root_block_device
delete_on_termination = false
volume_size = 50
volume_type = "gp2"
resource "aws_autoscaling_group" "YYY"
name = "YYY"
min_size = var.MIN_INSTANCES
max_size = var.MAX_INSTANCES
desired_capacity = var.DESIRED_CAPACITY
health_check_type = "EC2"
availability_zones = ["eu-west-3b"]
launch_configuration = aws_launch_configuration.XXX.name
vpc_zone_identifier = [
var.SUBNET_1_ID,
var.SUBNET_2_ID]
我是否错过了一些显而易见的事情?
【问题讨论】:
【参考方案1】:遗憾的是,您不能将卷作为根卷附加到实例。
您需要做的是根据您的音量创建一个自定义 AMI。这涉及创建卷的快照,然后构建 AMI:
Creating a Linux AMI from a snapshot在 terraform 中,有专门用于此目的的 aws_ami。
以下 terraform 脚本在三个步骤中举例说明了该过程:
-
创建给定卷的快照
从快照创建 AMI
从 AMI 创建实例
provider "aws"
# your data
resource "aws_ebs_snapshot" "snapshot"
volume_id = "vol-0ff4363a40eb3357c" # <-- your EBS volume ID
resource "aws_ami" "my"
name = "my-custom-ami"
virtualization_type = "hvm"
root_device_name = "/dev/xvda"
ebs_block_device
device_name = "/dev/xvda"
snapshot_id = aws_ebs_snapshot.snapshot.id
volume_type = "gp2"
resource "aws_instance" "web"
ami = aws_ami.my.id
instance_type = "t2.micro"
# key_name = "<your-key-name>"
tags =
Name = "InstanceFromCustomAMI"
【讨论】:
以上是关于Terraform AWS:无法将先前创建的 root_block_device 与使用 aws_launch_configuration 启动的 AWS EC2 实例重用的主要内容,如果未能解决你的问题,请参考以下文章
为啥我使用 terraform 资源 aws_route53_record 创建的 Route53 记录无法公开解析?
Terraform 0.11:无法将动态安全组添加到 aws 实例
Terraform 无法将创建的集成附加到 API 网关的路由中
用于 ECS 任务/容器的 Terraform AWS CloudWatch 日志组