はじめに
データアナリティクス事業本部のkobayashiです。
最近ワークフロー管理ツールであるApache Airflowをよく扱っています。そこでAWS上のAirflowのマネージドなサービスであるAmazon Managed Workflows for Apache Airflow (MWAA) を使ってみたかったのですが何か簡単に環境を構築できる方法はないかと探してみたところTerraformで簡単に構築できたのでまとめます。
Amazon Managed Workflows for Apache Airflow (MWAA) とは - Amazon Managed Workflows for Apache Airflow
Terraformで簡単にMWAAを構築してみる
当初は簡単にMWAAを構築してAirflowを操作することがの目的でしたのでMWAAの構築に関しては簡単に済ませたかったのですが、 MWAAのリソースを構築する際にはいくつかのネットワーク関係のリソースを事前に準備する必要があるので躊躇していました。そんな中色々情報を探しているとTerraform ResigtryにMWAA構築用のモジュールがあったのでこちらを利用します。
idealo/mwaa/aws | Terraform Registry
今回はこちらを使ってMWAAを構築します。
TerraformモジュールのClone
でははじめにidealo/mwaa/aws | Terraform Registry のソースコードをCloneします。
git clone https://github.com/idealo/terraform-aws-mwaa.git
次に以下のようなディレクトリ構造で構築に必要な最低限の設定をmain.tfに記述します。
.
├── main.tf
└── terraform-aws-mwaa
├── LICENSE
├── README.md
├── iam.tf
├── main.tf
├── outputs.tf
├── variables.tf
├── versions.tf
└── vpc.tf
main.tf
main.tf
module "airflow" {
source = "./terraform-aws-mwaa"
# version = "2.2.0"
account_id = "{AWSアカウントID}"
environment_name = "SampleMWAA"
internet_gateway_id = "{IGWのID}"
private_subnet_cidrs = ["10.1.11.0/24", "10.1.12.0/24"] # depending on your vpc ip range
public_subnet_cidrs = ["10.1.13.0/24", "10.1.14.0/24"] # depending on your vpc ip range
region = "ap-northeast-1"
source_bucket_arn = "arn:aws:s3:::sample-mwaa-bucket"
vpc_id = "{VPCのID}"
airflow_version = "2.2.2"
}
パラメータはこちら を参考に設定します。
airflow_versionはデフォルト設定だと2.0.2
ですが、現在は2.2.2
が使えるのでairflow_version
で2.2.2
を設定します。
モジュールの一部修正
設定が終わったらリソースを作成します。
$ terraform init
$ terraform plan
$ terraform apply
ここでterraform apply
を実行するとエラーが出ます。原因は今回MWAAを構築しているリージョンがap-northeast-1
のためモジュール内でsubnetを作成しているresource内の以下のコードが問題となります。
terraform-aws-mwaa/vpc.tf
resource "aws_subnet" "public" {
count = var.create_networking_config ? length(var.public_subnet_cidrs) : 0
cidr_block = var.public_subnet_cidrs[count.index]
vpc_id = var.vpc_id
map_public_ip_on_launch = true
availability_zone = count.index % 2 == 0 ? "${var.region}a" : "${var.region}b"
tags = merge({
Name = "mwaa-${var.environment_name}-public-subnet-${count.index}"
}, var.tags)
}
resource "aws_subnet" "private" {
count = var.create_networking_config ? length(var.private_subnet_cidrs) : 0
cidr_block = var.private_subnet_cidrs[count.index]
vpc_id = var.vpc_id
map_public_ip_on_launch = false
availability_zone = count.index % 2 == 0 ? "${var.region}a" : "${var.region}b"
tags = merge({
Name = "mwaa-${var.environment_name}-private-subnet-${count.index}"
},
subnetを作成する際のAZ設定でcloneしてきたソースでは{リージョン名}a
と{リージョン名}b
にsubnetを作成しています。ap-northeast-1にはap-northeast-1b
のAZがないのでこれを以下のように修正する必要があります。
terraform-aws-mwaa/vpc.tf
resource "aws_subnet" "public" {
...
availability_zone = count.index % 2 == 0 ? "${var.region}a" : "${var.region}c"
...
}
resource "aws_subnet" "private" {
...
availability_zone = count.index % 2 == 0 ? "${var.region}a" : "${var.region}c"
...
},
これで再度terraform apply
を実行すれば30分程度で見事MWAAのリソースが構築されます。
まとめ
Amazon Managed Workflows for Apache Airflow (MWAA)をTerraform Resistryの公開モジュールを使って構築しました。一部ソースの修正が必要ですがほかは詰まることなく構築を行えました。Terraformモジュールなので設定のカスタマイズや展開性、他のAWSのサービスとの連携など簡単に行えるのでおすすめです。
最後まで読んで頂いてありがとうございました。