You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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计算环境的实例上:

  1. 先创建EFS文件系统及对应子网的挂载目标
  2. 在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"
  }
}
  1. 在作业定义中把EFS卷挂载到容器指定路径

这种方案适合跨实例共享数据的场景,但单作业50GB需求下,EBS是更高效且低成本的选择。

内容的提问来源于stack exchange,提问作者Yafaa Ben Tili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:45:35