AWS BatchをTerraformでつくる

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

用語

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

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

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

ジョブ定義

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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ロールの詳細はドキュメントを参照ください)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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状態で止まってしまいます

ジョブキュー

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

1
2
3
4
5
6
7
8
9
10
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などで、ジョブキューとジョブ定義を指定してやれば、定期実行もすぐに行うことができます。コードで書くことによって、次回以降の手間も減らすことができてよいですね。参考になれば幸いです。

このエントリーをはてなブックマークに追加