如何在Terraform中为EC2类型AWS Batch作业添加50GB存储
为AWS Batch EC2类型作业添加存储空间的实现方案
一、Terraform中直接配置EBS存储(最常用方案)
1. 附加独立EBS卷
要给Batch的EC2实例添加50GB存储,直接修改aws_batch_compute_environment的计算资源配置,加入EBS卷定义:
resource "aws_batch_compute_environment" "pipeline" { compute_environment_name = "${var.product}-${var.application}-pipeline-batch-compute-environment-${var.env}" compute_resources { instance_role = aws_iam_instance_profile.pipeline_batch.arn instance_type = var.pipeline_instance_type max_vcpus = var.pipeline_max_vcpus min_vcpus = 0 security_group_ids = [ aws_security_group.pipeline_batch.id ] subnets = var.subnets type = "EC2" # 配置50GB的附加EBS卷 ebs_configuration { ebs_block_device { volume_size = 50 # 存储容量,单位GB volume_type = "gp3" # 推荐用gp3,性价比最优;也可选gp2、io1等类型 delete_on_termination = true # 实例终止时自动删除卷,避免残留费用 } } } service_role = aws_iam_role.pipeline_batch_service_role.arn type = "MANAGED" tags = { environment = var.env } }
附加卷需要挂载到容器内才能被作业使用,修改aws_batch_job_definition的容器配置:
{ "image": "${aws_ecr_repository.pipeline.repository_url}:latest", "command": [ "--s3_bucket", "${var.input_bucket}", "--s3_upload_bucket", "${var.upload_bucket}"], "executionRoleArn": "${aws_iam_role.pipeline_batch_instance_role.arn}", "memory": ${var.pipeline_memory}, "vcpus": ${var.pipeline_vcpus}, "volumes": [ { "host": { "sourcePath": "/dev/xvdh" # 附加卷的默认设备路径,部分实例可能是/dev/sdh }, "name": "data-volume" } ], "mountPoints": [ { "sourceVolume": "data-volume", "containerPath": "/downloads", # 容器内的挂载路径,对应作业下载数据的目录 "readOnly": false } ] }
2. 直接扩大实例根卷
如果作业不需要独立存储卷,只想扩容EC2实例的根卷到50GB,只需在ebs_configuration里设置根卷大小:
ebs_configuration { root_volume_size = 50 # 将根卷直接扩容到50GB }
这种方式无需额外挂载配置,容器默认使用根卷空间,适合作业直接在根目录下存储数据的场景。
二、其他可选存储方案
1. 利用EC2实例本地存储
部分EC2实例(如C5d、M5d系列)自带临时本地存储,无需额外付费,适合临时存放处理数据的场景。修改作业定义的容器配置,把本地存储挂载到容器内:
{ "image": "${aws_ecr_repository.pipeline.repository_url}:latest", "command": [ "--s3_bucket", "${var.input_bucket}", "--s3_upload_bucket", "${var.upload_bucket}"], "executionRoleArn": "${aws_iam_role.pipeline_batch_instance_role.arn}", "memory": ${var.pipeline_memory}, "vcpus": ${var.pipeline_vcpus}, "volumes": [ { "host": { "sourcePath": "/dev/nvme0n1" # 实例存储的设备路径,不同实例类型可能不同,需提前确认 }, "name": "instance-storage" } ], "mountPoints": [ { "sourceVolume": "instance-storage", "containerPath": "/data", "readOnly": false } ] }
注意:实例存储是临时存储,实例终止或重启后数据会永久丢失,仅适合临时处理数据的场景。
2. 挂载EFS文件系统
如果需要多作业共享数据,或者需要数据持久化,可以将EFS文件系统挂载到Batch计算环境的实例上:
- 先创建EFS文件系统及对应子网的挂载目标
- 在
aws_batch_compute_environment的计算资源中添加EFS配置:
ebs_configuration { efs_volume_configuration { file_system_id = aws_efs_file_system.batch_storage.id root_directory = "/batch-data" transit_encryption = "ENABLED" } }
- 在作业定义中把EFS卷挂载到容器指定路径
这种方案适合跨实例共享数据的场景,但单作业50GB需求下,EBS是更高效且低成本的选择。
内容的提问来源于stack exchange,提问作者Yafaa Ben Tili
相关产品推荐
相关产品推荐

