新卒入社4ヶ月でAWS 認定ソリューションアーキテクトに合格した話
mmmuser
デロイト トーマツ ウェブサービス株式会社(DWS)公式ブログ
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
でコンテナの設定ができて、こちらにあるプロパティを定義することができます。今回はサンプルなのでimage
をbusybox
としていますが、実際は、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
- MANAGED
かUNMANAGED
を選択でき、MANAGED
の場合はcompute_resources
に詳細を設定できます。compute_resources.type
- 今回はバッチ処理ということで、SPOTインスタンスを使用しています。compute_resources.bid_percentage
- 入札価格を指定でき、例えば20
なら、オンデマンドの20%
以下の価格のときのみに入札してくれます。compute_resources.max_vcpus
- 最大CPUcompute_resources.min_vcpus
- 最小CPUcompute_resources.desired_vcpus
- コンピューティング環境が増加する際に増やしたいCPUの数です。注意点として、コンピューティング環境をサブネットに入れる場合、サブネット側で、map_public_ip_on_launch
をtrue
にすることを忘れないようにしましょう。インスタンスにパブリック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などで、ジョブキューとジョブ定義を指定してやれば、定期実行もすぐに行うことができます。コードで書くことによって、次回以降の手間も減らすことができてよいですね。参考になれば幸いです。