Skip to content

Commit 2e937f8

Browse files
committed
(infra): Refactor the Terraform to a module
The module will deploy everything each Lambda needs - queue, log group, permissions etc. When I deploy more Lambdas I'll just need to call the module again pointing to the relevant file etc.
1 parent 244f04e commit 2e937f8

File tree

11 files changed

+100
-56
lines changed

11 files changed

+100
-56
lines changed

TODO.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
## Infrastucture
1111

1212
- Deploy the other lambdas
13-
- Refactor queue / logs / lambda into a module?
1413

1514
## Benchmark
1615

infra/cloudwatch.tf

Lines changed: 0 additions & 5 deletions
This file was deleted.

infra/lambda.tf

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,9 @@
1-
resource "aws_lambda_function" "lambda_benchmark_typescript_lambda" {
2-
function_name = "lambda_benchmark_typescript_lambda"
3-
filename = "../lambda/typescript/dist/index.zip"
4-
role = aws_iam_role.lambda_benchmark_lambda_role.arn
5-
handler = "index.handler"
6-
source_code_hash = filebase64sha256("../lambda/typescript/dist/index.zip")
7-
runtime = "nodejs20.x"
8-
architectures = ["arm64"]
9-
timeout = 5
10-
tags = var.default_tags
1+
module "typescript_lambda" {
2+
source = "./modules/lambda"
113

12-
environment {
13-
variables = {
14-
TABLE_NAME = var.dynamodb_table_name,
15-
}
16-
}
17-
18-
depends_on = [
19-
aws_iam_role_policy_attachment.lambda_benchmark_allow_logging,
20-
aws_cloudwatch_log_group.lambda_benchmark_typescript_logs,
21-
]
22-
}
23-
24-
resource "aws_lambda_event_source_mapping" "lambda_benchmark_typescript_lambda" {
25-
event_source_arn = aws_sqs_queue.typescript_lambda_queue.arn
26-
function_name = aws_lambda_function.lambda_benchmark_typescript_lambda.arn
4+
source_file = "../lambda/typescript/dist/index.zip"
5+
language_name = "typescript"
6+
runtime = "nodejs20.x"
7+
handler = "index.handler"
8+
dynamodb_table_name = var.dynamodb_table_name
279
}

infra/modules/lambda/cloudwatch.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
resource "aws_cloudwatch_log_group" "log_group" {
2+
name = "/aws/lambda/lambda_benchmark_${var.language_name}_lambda"
3+
retention_in_days = 3
4+
tags = var.default_tags
5+
}

infra/iam.tf renamed to infra/modules/lambda/iam.tf

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ data "aws_iam_policy_document" "assume_role" {
1111
}
1212
}
1313

14-
resource "aws_iam_role" "lambda_benchmark_lambda_role" {
15-
name = "lambda_benchmark_lambda_role"
14+
resource "aws_iam_role" "base_lambda_role" {
15+
name = "lambda_benchmark_base_${var.language_name}_role"
1616
assume_role_policy = data.aws_iam_policy_document.assume_role.json
1717
tags = var.default_tags
1818
}
@@ -31,17 +31,17 @@ data "aws_iam_policy_document" "lambda_logging" {
3131
}
3232
}
3333

34-
resource "aws_iam_policy" "lambda_benchmark_allow_logging" {
35-
name = "lambda_benchmark_allow_logging"
34+
resource "aws_iam_policy" "allow_logging" {
35+
name = "lambda_benchmark_${var.language_name}_allow_logging"
3636
path = "/"
37-
description = "Allow lambdas in the lambda_benchmark app to log to Cloudwatch"
37+
description = "Allow the ${var.language_name} lambda in the lambda_benchmark app to log to Cloudwatch"
3838
policy = data.aws_iam_policy_document.lambda_logging.json
3939
tags = var.default_tags
4040
}
4141

42-
resource "aws_iam_role_policy_attachment" "lambda_benchmark_allow_logging" {
43-
role = aws_iam_role.lambda_benchmark_lambda_role.name
44-
policy_arn = aws_iam_policy.lambda_benchmark_allow_logging.arn
42+
resource "aws_iam_role_policy_attachment" "allow_logging" {
43+
role = aws_iam_role.base_lambda_role.name
44+
policy_arn = aws_iam_policy.allow_logging.arn
4545
}
4646

4747
data "aws_iam_policy_document" "dynamodb_access" {
@@ -52,29 +52,29 @@ data "aws_iam_policy_document" "dynamodb_access" {
5252
"dynamodb:PutItem",
5353
]
5454

55-
resources = [aws_dynamodb_table.table.arn]
55+
resources = ["arn:aws:dynamodb:*:*:table/${var.dynamodb_table_name}"]
5656
}
5757
}
5858

5959

60-
resource "aws_iam_policy" "lambda_benchmark_dynamodb_table_access" {
61-
name = "lambda_benchmark_dynamodb_table_access"
60+
resource "aws_iam_policy" "dynamodb_access" {
61+
name = "lambda_benchmark_${var.language_name}_dynamodb_access"
6262
path = "/"
63-
description = "IAM policy to allow lambdas in the lambda_benchmark app to write to DynamoDB"
63+
description = "IAM policy to allow the ${var.language_name} lambda in the lambda_benchmark app to write to DynamoDB"
6464
policy = data.aws_iam_policy_document.dynamodb_access.json
6565
tags = var.default_tags
6666
}
6767

68-
resource "aws_iam_role_policy_attachment" "dynamodb_table_access" {
69-
role = aws_iam_role.lambda_benchmark_lambda_role.name
70-
policy_arn = aws_iam_policy.lambda_benchmark_dynamodb_table_access.arn
68+
resource "aws_iam_role_policy_attachment" "dynamodb_access" {
69+
role = aws_iam_role.base_lambda_role.name
70+
policy_arn = aws_iam_policy.dynamodb_access.arn
7171
}
7272

7373
data "aws_iam_policy_document" "sqs_access" {
7474
statement {
7575
sid = "AllowSQSPermissions"
7676
effect = "Allow"
77-
resources = [aws_sqs_queue.typescript_lambda_queue.arn]
77+
resources = [aws_sqs_queue.queue.arn]
7878

7979
actions = [
8080
"sqs:ChangeMessageVisibility",
@@ -86,15 +86,15 @@ data "aws_iam_policy_document" "sqs_access" {
8686

8787
}
8888

89-
resource "aws_iam_policy" "lambda_benchmark_sqs_access" {
90-
name = "lambda_benchmark_sqs_access"
89+
resource "aws_iam_policy" "sqs_access" {
90+
name = "lambda_benchmark_${var.language_name}_sqs_access"
9191
path = "/"
92-
description = "IAM policy to allow lambdas in the lambda_benchmark app to read from SQS"
92+
description = "IAM policy to allow the ${var.language_name} lambda in the lambda_benchmark app to read from SQS"
9393
policy = data.aws_iam_policy_document.sqs_access.json
9494
tags = var.default_tags
9595
}
9696

9797
resource "aws_iam_role_policy_attachment" "sqs_access" {
98-
role = aws_iam_role.lambda_benchmark_lambda_role.name
99-
policy_arn = aws_iam_policy.lambda_benchmark_sqs_access.arn
98+
role = aws_iam_role.base_lambda_role.name
99+
policy_arn = aws_iam_policy.sqs_access.arn
100100
}

infra/modules/lambda/lambda.tf

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
resource "aws_lambda_function" "lambda" {
2+
function_name = "lambda_benchmark_${var.language_name}_lambda"
3+
filename = var.source_file
4+
role = aws_iam_role.base_lambda_role.arn
5+
handler = var.handler
6+
source_code_hash = filebase64sha256(var.source_file)
7+
runtime = var.runtime
8+
architectures = ["arm64"]
9+
timeout = 5
10+
tags = var.default_tags
11+
12+
environment {
13+
variables = {
14+
TABLE_NAME = var.dynamodb_table_name,
15+
}
16+
}
17+
18+
depends_on = [
19+
aws_iam_role_policy_attachment.allow_logging,
20+
aws_cloudwatch_log_group.log_group,
21+
]
22+
}
23+
24+
resource "aws_lambda_event_source_mapping" "mapping" {
25+
event_source_arn = aws_sqs_queue.queue.arn
26+
function_name = aws_lambda_function.lambda.arn
27+
}

infra/modules/lambda/main.tf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
terraform {
2+
required_providers {
3+
aws = {
4+
source = "opentofu/aws"
5+
version = "5.69.0"
6+
}
7+
}
8+
}

infra/modules/lambda/outputs.tf

Whitespace-only changes.

infra/modules/lambda/sqs.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
resource "aws_sqs_queue" "queue" {
2+
name_prefix = "benchmark_lambda_${var.language_name}_queue"
3+
tags = var.default_tags
4+
}

infra/modules/lambda/variables.tf

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
variable "language_name" {
2+
type = string
3+
}
4+
5+
variable "source_file" {
6+
type = string
7+
}
8+
9+
variable "handler" {
10+
type = string
11+
}
12+
13+
variable "runtime" {
14+
type = string
15+
}
16+
17+
variable "dynamodb_table_name" {
18+
type = string
19+
}
20+
21+
variable "default_tags" {
22+
description = "Tags to apply to AWS resources"
23+
default = {
24+
Environment = "Dev"
25+
Application = "Lambda benchmark prototype"
26+
}
27+
}
28+

0 commit comments

Comments
 (0)