如何使用 Terraform 为 Elastic Beanstalk 中的 EC2 实例设置 EBS 根卷以持久保存
Posted
技术标签:
【中文标题】如何使用 Terraform 为 Elastic Beanstalk 中的 EC2 实例设置 EBS 根卷以持久保存【英文标题】:How to set EBS root volume to persist for an EC2 instance within Elastic Beanstalk using Terraform 【发布时间】:2020-11-11 01:46:21 【问题描述】:我编写了 Terraform 来管理我的 AWS Elastic Beanstalk 环境和应用程序,使用我所在地区的默认 docker 解决方案堆栈。
通过自动缩放创建的 EC2 实例具有标准/默认 EBS 根卷,该卷在“DeleteOnTermination”设置中设置为“true”值——这意味着当实例被替换或销毁时,该卷(以及所有数据)也被销毁。
我想将其更改为 false 并保持音量。
由于某种原因,我找不到有效的 Terraform 文档来说明如何更改此设置以使根卷持续存在。我能找到的最接近的是自动缩放启动配置,可以提供“root_block_device”映射来更新它。不幸的是,从文档中不清楚如何准确地使用它。如果我创建一个启动配置资源,我如何在我的 beanstalk 定义中使用它。我认为我在正确的轨道上,但需要一些指导。
我是否创建自动缩放资源,然后在我的 beanstalk 定义中引用它?或者我是否在我的 beanstalk 定义中添加了一个特定的设置,里面有这个映射?感谢您提供的任何帮助或示例。
【问题讨论】:
【参考方案1】:这可以通过Resources在EB级别完成。
具体来说,您必须修改 EB 用来启动您的实例的 AWSEBAutoScalingLaunchConfiguration
的设置。
以下是此类配置文件的示例:
.ebextensions/40_ebs_delete_on_termination.config
Resources:
AWSEBAutoScalingLaunchConfiguration:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
DeleteOnTermination: false
然后要验证设置,您可以使用 AWS CLI:
aws ec2 describe-volumes --volume-ids <id-of-your-eb-instance-volume>
或者干脆终止环境并在 EC2 控制台中检查卷。
【讨论】:
谢谢。如果可能的话,我正在寻找一种基于 terraform 的方式来指定它。但如果那不存在,我将不得不使用其他一些机制,比如 ebextensions。 @ScottShipp 我不知道以其他方式这样做。 EB 正在为您的环境构建 CLoudFormation 模板。 EB 将查看您的.ebextentions
并相应地修改模板。 Terraform 不参与模板的构建。【参考方案2】:
您可以在 aws_instance 资源中使用 ebs_block_device 块。这将在实例终止时默认删除 ebs 卷。
https://www.terraform.io/docs/providers/aws/r/instance.html#block-devices
您必须使用上面的而不是 aws_volume_attachment 资源。
delete_on_termination - (可选)卷是否应该 在实例终止时销毁(默认值:true)。
【讨论】:
我不清楚如何将 aws_instance 资源连接到 aws_elastic_beanstalk_environment 资源?现在我没有直接定义与自动缩放、启动配置或 EC2 实例有关的任何内容。我正在将 aws:autoscaling:launchconfiguration 中的一些设置传递给我的资源,仅此而已。以上是关于如何使用 Terraform 为 Elastic Beanstalk 中的 EC2 实例设置 EBS 根卷以持久保存的主要内容,如果未能解决你的问题,请参考以下文章
使用 terraform 为 Elastic Beanstalk 启用托管更新
使用 Terraform 关闭/打开 Elastic Beanstalk 负载均衡器?
无法使用 Terraform 在自定义 VPC 中创建 Elastic Beanstalk 应用程序