terraform config for MWAA
https://github.com/hashicorp/terraform-provider-aws/releases/tag/v3.36.0
terraform plan -var-file=vars.tfvars
terraform apply -var-file=vars.tfvars
terraform config for MWAA
https://github.com/hashicorp/terraform-provider-aws/releases/tag/v3.36.0
terraform plan -var-file=vars.tfvars
terraform apply -var-file=vars.tfvars
# s3 bucker for mwaa dags | |
resource "aws_s3_bucket" "mwaa-scripts" { | |
bucket = "${var.project_prefix}-mwaa-scripts-${var.env}" | |
acl = "private" | |
} | |
resource "aws_s3_bucket_public_access_block" "mwaa-scripts-access-block" { | |
bucket = aws_s3_bucket.mwaa-scripts.id | |
block_public_acls = true | |
block_public_policy = true | |
ignore_public_acls = true | |
restrict_public_buckets = true | |
} | |
# vpc for mwaa | |
resource "aws_vpc" "mwaa-vpc" { | |
cidr_block = var.vpc_cidr | |
tags = { | |
Name = var.mwaa_env_name | |
} | |
} | |
# vpc subnet for mwaa | |
resource "aws_subnet" "mwaa-private-1" { | |
vpc_id = aws_vpc.mwaa-vpc.id | |
cidr_block = var.private_subnet1_cidr | |
availability_zone = var.region_az1 | |
tags = { | |
Name = "${var.mwaa_env_name} Private Subnet 1" | |
} | |
} | |
resource "aws_subnet" "mwaa-private-2" { | |
vpc_id = aws_vpc.mwaa-vpc.id | |
cidr_block = var.private_subnet2_cidr | |
availability_zone = var.region_az2 | |
tags = { | |
Name = "${var.mwaa_env_name} Private Subnet 2" | |
} | |
} | |
resource "aws_subnet" "mwaa-public-1" { | |
vpc_id = aws_vpc.mwaa-vpc.id | |
cidr_block = var.public_subnet1_cidr | |
availability_zone = var.region_az1 | |
map_public_ip_on_launch = true | |
tags = { | |
Name = "${var.mwaa_env_name} Public Subnet 1" | |
} | |
} | |
resource "aws_subnet" "mwaa-public-2" { | |
vpc_id = aws_vpc.mwaa-vpc.id | |
cidr_block = var.public_subnet2_cidr | |
availability_zone = var.region_az2 | |
map_public_ip_on_launch = true | |
tags = { | |
Name = "${var.mwaa_env_name} Public Subnet 2" | |
} | |
} | |
# internet gateway for mwaa subnet | |
resource "aws_internet_gateway" "mwaa-inetgw" { | |
vpc_id = aws_vpc.mwaa-vpc.id | |
tags = { | |
Name = var.mwaa_env_name | |
} | |
} | |
# nat gateway for mwaa private subnet | |
resource "aws_eip" "mwaa-nat1" { | |
vpc = true | |
tags = { | |
Name = "${var.mwaa_env_name} NAT Gateway 1" | |
} | |
} | |
resource "aws_eip" "mwaa-nat2" { | |
vpc = true | |
tags = { | |
Name = "${var.mwaa_env_name} NAT Gateway 2" | |
} | |
} | |
resource "aws_nat_gateway" "mwaa-nat-gw1" { | |
allocation_id = aws_eip.mwaa-nat1.id | |
subnet_id = aws_subnet.mwaa-public-1.id | |
depends_on = [aws_internet_gateway.mwaa-inetgw] | |
tags = { | |
Name = "${var.mwaa_env_name} NAT Gateway 1" | |
} | |
} | |
resource "aws_nat_gateway" "mwaa-nat-gw2" { | |
allocation_id = aws_eip.mwaa-nat2.id | |
subnet_id = aws_subnet.mwaa-public-2.id | |
depends_on = [aws_internet_gateway.mwaa-inetgw] | |
tags = { | |
Name = "${var.mwaa_env_name} NAT Gateway 2" | |
} | |
} | |
# route table for mwaa public subnet | |
resource "aws_route_table" "mwaa-public-route" { | |
vpc_id = aws_vpc.mwaa-vpc.id | |
route { | |
cidr_block = "0.0.0.0/0" | |
gateway_id = aws_internet_gateway.mwaa-inetgw.id | |
} | |
tags = { | |
Name = "${var.mwaa_env_name} Public Routes" | |
} | |
} | |
resource "aws_route_table_association" "mwaa-public-route-inetgw1" { | |
subnet_id = aws_subnet.mwaa-public-1.id | |
route_table_id = aws_route_table.mwaa-public-route.id | |
} | |
resource "aws_route_table_association" "mwaa-public-route-inetgw2" { | |
subnet_id = aws_subnet.mwaa-public-2.id | |
route_table_id = aws_route_table.mwaa-public-route.id | |
} | |
# route table for mwaa private subnet | |
resource "aws_route_table" "mwaa-private-route1" { | |
vpc_id = aws_vpc.mwaa-vpc.id | |
route { | |
cidr_block = "0.0.0.0/0" | |
nat_gateway_id = aws_nat_gateway.mwaa-nat-gw1.id | |
} | |
tags = { | |
Name = "${var.mwaa_env_name} Private Routes 1" | |
} | |
} | |
resource "aws_route_table_association" "private-route1-assoc" { | |
subnet_id = aws_subnet.mwaa-private-1.id | |
route_table_id = aws_route_table.mwaa-private-route1.id | |
} | |
resource "aws_route_table" "mwaa-private-route2" { | |
vpc_id = aws_vpc.mwaa-vpc.id | |
route { | |
cidr_block = "0.0.0.0/0" | |
nat_gateway_id = aws_nat_gateway.mwaa-nat-gw2.id | |
} | |
tags = { | |
Name = "${var.mwaa_env_name} Private Routes 2" | |
} | |
} | |
resource "aws_route_table_association" "private-route2-assoc" { | |
subnet_id = aws_subnet.mwaa-private-2.id | |
route_table_id = aws_route_table.mwaa-private-route2.id | |
} | |
# iam role for mwaa | |
resource "aws_iam_role" "mwaa-execution" { | |
name = "AmazonMWAA-${var.mwaa_env_name}" | |
assume_role_policy = <<EOF | |
{ | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Action": "sts:AssumeRole", | |
"Principal": { | |
"Service": [ | |
"airflow.amazonaws.com", | |
"airflow-env.amazonaws.com" | |
] | |
}, | |
"Effect": "Allow", | |
"Sid": "" | |
} | |
] | |
} | |
EOF | |
} | |
resource "aws_iam_role_policy" "mwaa-exec-policy" { | |
name = "MWAA-Execution-Policy-${var.mwaa_env_name}" | |
role = aws_iam_role.mwaa-execution.id | |
policy = <<EOF | |
{ | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Effect": "Allow", | |
"Action": "airflow:PublishMetrics", | |
"Resource": "arn:aws:airflow:${var.region}:${var.account_id}:environment/${var.mwaa_env_name}" | |
}, | |
{ | |
"Effect": "Deny", | |
"Action": [ | |
"s3:ListAllMyBuckets" | |
], | |
"Resource": [ | |
"${aws_s3_bucket.mwaa-scripts.arn}", | |
"${aws_s3_bucket.mwaa-scripts.arn}/*" | |
] | |
}, | |
{ | |
"Effect": "Allow", | |
"Action": [ | |
"s3:GetObject*", | |
"s3:GetBucket*", | |
"s3:List*" | |
], | |
"Resource": [ | |
"${aws_s3_bucket.mwaa-scripts.arn}", | |
"${aws_s3_bucket.mwaa-scripts.arn}/*" | |
] | |
}, | |
{ | |
"Effect": "Allow", | |
"Action": [ | |
"logs:CreateLogStream", | |
"logs:CreateLogGroup", | |
"logs:PutLogEvents", | |
"logs:GetLogEvents", | |
"logs:GetLogRecord", | |
"logs:GetLogGroupFields", | |
"logs:GetQueryResults" | |
], | |
"Resource": [ | |
"arn:aws:logs:${var.region}:${var.account_id}:log-group:airflow-${var.mwaa_env_name}-*" | |
] | |
}, | |
{ | |
"Effect": "Allow", | |
"Action": [ | |
"logs:DescribeLogGroups" | |
], | |
"Resource": [ | |
"*" | |
] | |
}, | |
{ | |
"Effect": "Allow", | |
"Action": "cloudwatch:PutMetricData", | |
"Resource": "*" | |
}, | |
{ | |
"Effect": "Allow", | |
"Action": [ | |
"sqs:ChangeMessageVisibility", | |
"sqs:DeleteMessage", | |
"sqs:GetQueueAttributes", | |
"sqs:GetQueueUrl", | |
"sqs:ReceiveMessage", | |
"sqs:SendMessage" | |
], | |
"Resource": "arn:aws:sqs:${var.region}:*:airflow-celery-*" | |
}, | |
{ | |
"Effect": "Allow", | |
"Action": [ | |
"kms:Decrypt", | |
"kms:DescribeKey", | |
"kms:GenerateDataKey*", | |
"kms:Encrypt" | |
], | |
"NotResource": "arn:aws:kms:*:${var.account_id}:key/*", | |
"Condition": { | |
"StringLike": { | |
"kms:ViaService": [ | |
"sqs.${var.region}.amazonaws.com" | |
] | |
} | |
} | |
} | |
] | |
} | |
EOF | |
} | |
# security group for mwaa | |
resource "aws_security_group" "mwaa-execution" { | |
name = "airflow-security-group" | |
description = "Security Group for ${var.mwaa_env_name}" | |
vpc_id = aws_vpc.mwaa-vpc.id | |
ingress { | |
from_port = 0 | |
to_port = 0 | |
protocol = -1 | |
self = true | |
} | |
egress { | |
from_port = 0 | |
to_port = 0 | |
protocol = -1 | |
cidr_blocks = ["0.0.0.0/0"] | |
} | |
} | |
# MWAA Environment | |
resource "aws_mwaa_environment" "mwaa-env" { | |
source_bucket_arn = aws_s3_bucket.mwaa-scripts.arn | |
dag_s3_path = "dags" | |
execution_role_arn = aws_iam_role.mwaa-execution.arn | |
name = var.mwaa_env_name | |
max_workers = 2 | |
webserver_access_mode = "PUBLIC_ONLY" | |
network_configuration { | |
security_group_ids = [aws_security_group.mwaa-execution.id] | |
subnet_ids = [aws_subnet.mwaa-private-1.id, aws_subnet.mwaa-private-2.id] | |
} | |
logging_configuration { | |
task_logs { | |
enabled = true | |
log_level = "INFO" | |
} | |
webserver_logs { | |
enabled = true | |
log_level = "INFO" | |
} | |
scheduler_logs { | |
enabled = true | |
log_level = "INFO" | |
} | |
worker_logs { | |
enabled = true | |
log_level = "INFO" | |
} | |
dag_processing_logs { | |
enabled = true | |
log_level = "INFO" | |
} | |
} | |
} |
terraform { | |
required_providers { | |
aws = { | |
version = ">= 3.36.0" | |
} | |
} | |
} | |
provider "aws" { | |
profile = "default" | |
region = "ap-northeast-1" | |
} |
variable "project_prefix" { | |
type = string | |
} | |
variable "env" { | |
type = string | |
} | |
variable "account_id" { | |
type = string | |
} | |
variable "region" { | |
type = string | |
default = "ap-northeast-1" | |
} | |
variable "region_az1" { | |
type = string | |
default = "ap-northeast-1a" | |
} | |
variable "region_az2" { | |
type = string | |
default = "ap-northeast-1c" | |
} | |
variable "vpc_cidr" { | |
type = string | |
default = "10.192.0.0/16" | |
} | |
variable "public_subnet1_cidr" { | |
type = string | |
default = "10.192.10.0/24" | |
} | |
variable "public_subnet2_cidr" { | |
type = string | |
default = "10.192.11.0/24" | |
} | |
variable "private_subnet1_cidr" { | |
type = string | |
default = "10.192.20.0/24" | |
} | |
variable "private_subnet2_cidr" { | |
type = string | |
default = "10.192.21.0/24" | |
} | |
variable "mwaa_env_name" { | |
type = string | |
} |
project_prefix = "mwaawork" | |
env = "dev" | |
account_id = "xxxxxxxxxx" # your aws account id | |
region = "ap-northeast-1" | |
region_az1 = "ap-northeast-1a" | |
region_az2 = "ap-northeast-1c" | |
vpc_cidr = "10.192.0.0/16" | |
public_subnet1_cidr = "10.192.10.0/24" | |
public_subnet2_cidr = "10.192.11.0/24" | |
private_subnet1_cidr = "10.192.20.0/24" | |
private_subnet2_cidr = "10.192.21.0/24" | |
mwaa_env_name = "MWAAWorkingEnv" |