TerraformでAmazon Managed Workflows for Apache Airflow (MWAA)を簡単に構築してみる

2023.01.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部の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_version2.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のサービスとの連携など簡単に行えるのでおすすめです。

最後まで読んで頂いてありがとうございました。