如何使用 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 应用程序

在 terraform 中分离 Elastic IP

Terraform 中的 Elastic Beanstalk 应用程序版本

Terraform elasticbeanstalk部署