「AWS無料相談会」をオンラインで開催中

AWS BatchをTerraformでつくる

  • 2019.01.30
  • AWS

AWS Batch使うことでバッチ処の環境を簡単につくることができます。今回は、Terraformを使いながらAWS Batchの基本的な環境を作っていきたいと思います。

用語

AWS Batchのコンポーネントには下記の3つがあります。

名前 目的
ジョブ AWS Batchの作業単位。
ジョブキュー ジョブを登録するキュー。コンピューティング環境を紐付ける。
ジョブ定義 使用するDockerイメージ、コマンドを定義できる。
コンピューティング環境 ジョブの実行環境。

それぞれ詳しく見てゆきます。

ジョブ定義

まずはジョブ定義をつくっていきます。Terraformのコードは以下のようになります。

resource "aws_batch_job_definition" "default" {
    name = "${var.name}"
    type = "container"
    container_properties = <<CONTAINER_PROPERTIES
{
    "command": ["ls", "-la"],
    "image": "busybox",
    "memory": 1024,
    "vcpus": 1,
    "volumes": [
      {
        "host": {
          "sourcePath": "/tmp"
        },
        "name": "tmp"
      }
    ],
    "environment": [
        {"name": "VARNAME", "value": "VARVAL"}
    ],
    "mountPoints": [
        {
          "sourceVolume": "tmp",
          "containerPath": "/tmp",
          "readOnly": false
        }
    ],
    "ulimits": [
      {
        "hardLimit": 1024,
        "name": "nofile",
        "softLimit": 1024
      }
    ]
}
CONTAINER_PROPERTIES
}

container_propertiesでコンテナの設定ができて、こちらにあるプロパティを定義することができます。今回はサンプルなのでimagebusyboxとしていますが、実際は、ECSに登録したアプリケーションのDockerイメージなどを指定、commandで実行コマンドを指定できます。

コンピューティング環境

次にコンピューティング環境を作成し、ジョブの実行環境(EC2)の設定をします。

Terraformのコードは以下のようになります(各IAMロールの詳細はドキュメントを参照ください)。

resource "aws_batch_compute_environment" "default" {
  compute_environment_name = "${var.name}"
  compute_resources {
    instance_role = "${aws_iam_instance_profile.default.arn}"
    instance_type = [
      "m3.medium",
    ]
    desired_vcpus = 1
    max_vcpus = 1
    min_vcpus = 0
    security_group_ids = [
      "${var.sg_ids}"
    ]
    subnets = [
      "${var.subnet_id}"
    ]
    bid_percentage = 50
    spot_iam_fleet_role = "${aws_iam_role.ec2_spot_fleet_role.arn}"
    type = "SPOT"
  }
  service_role = "${aws_iam_role.aws_batch_service_role.arn}"
  type = "MANAGED"
  depends_on = ["aws_iam_role_policy_attachment.aws_batch_service_role"]
}
  • type - MANAGEDUNMANAGEDを選択でき、MANAGEDの場合はcompute_resourcesに詳細を設定できます。
  • compute_resources.type - 今回はバッチ処理ということで、SPOTインスタンスを使用しています。
  • compute_resources.bid_percentage - 入札価格を指定でき、例えば20なら、オンデマンドの20%以下の価格のときのみに入札してくれます。
  • compute_resources.max_vcpus - 最大CPU
  • compute_resources.min_vcpus - 最小CPU
  • compute_resources.desired_vcpus - コンピューティング環境が増加する際に増やしたいCPUの数です。

注意点として、コンピューティング環境をサブネットに入れる場合、サブネット側で、map_public_ip_on_launchtrueにすることを忘れないようにしましょう。インスタンスにパブリックIPがないと、ジョブがRUNNABLE状態で止まってしまいます

ジョブキュー

最後にジョブキューをつくります。

resource "aws_batch_job_queue" "default" {
  name = "${var.name}"
  state = "ENABLED"
  priority = 1
  compute_environments = ["${aws_batch_compute_environment.default.arn}"]

  lifecycle {
    create_before_destroy = true
  }
}

ジョブキューではコンピューティング環境を紐付けるだけなので簡単です。

まとめ

これでterraform applyすれば、AWS Batchの環境は一通りできます。あとはCloudWatch Eventsなどで、ジョブキューとジョブ定義を指定してやれば、定期実行もすぐに行うことができます。コードで書くことによって、次回以降の手間も減らすことができてよいですね。参考になれば幸いです。