Skip to content

Commit a690ac0

Browse files
authored
Merge pull request #8 from braintrustdata/mdeeks/kms
Add support for KMS keys
2 parents f04315e + 784cf6a commit a690ac0

21 files changed

+152
-16
lines changed

main.tf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
module "kms" {
2+
source = "./modules/kms"
3+
count = var.kms_key_arn == null ? 1 : 0
4+
5+
deployment_name = var.deployment_name
6+
}
7+
8+
locals {
9+
kms_key_arn = var.kms_key_arn != null ? var.kms_key_arn : module.kms[0].key_arn
10+
}
11+
112
module "main_vpc" {
213
source = "./modules/vpc"
314

@@ -49,6 +60,8 @@ module "database" {
4960

5061
postgres_storage_iops = var.postgres_storage_iops
5162
postgres_storage_throughput = var.postgres_storage_throughput
63+
64+
kms_key_arn = local.kms_key_arn
5265
}
5366

5467
module "redis" {
@@ -106,4 +119,5 @@ module "services" {
106119
module.quarantine_vpc[0].private_subnet_3_id
107120
] : []
108121

122+
kms_key_arn = local.kms_key_arn
109123
}

modules/database/main.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ resource "aws_db_instance" "main" {
3636

3737
performance_insights_enabled = true
3838
performance_insights_retention_period = 7
39+
40+
kms_key_id = var.kms_key_arn
3941
}
4042

4143
resource "aws_db_parameter_group" "main" {
@@ -117,4 +119,5 @@ resource "aws_secretsmanager_secret_version" "database_secret" {
117119
resource "aws_secretsmanager_secret" "database_secret" {
118120
name_prefix = "${var.deployment_name}/DatabaseSecret-"
119121
description = "Username/password for the main Braintrust RDS database"
122+
kms_key_id = var.kms_key_arn
120123
}

modules/database/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,9 @@ variable "database_security_group_ids" {
4949
description = "Security Group IDs for the RDS instance."
5050
type = list(string)
5151
}
52+
53+
variable "kms_key_arn" {
54+
description = "KMS key ARN to use for encrypting resources. If not provided, the default AWS managed key is used. DO NOT change this after deployment. If you do, it will attempt to destroy your DB."
55+
type = string
56+
default = null
57+
}

modules/database/versions.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
terraform {
2-
required_version = ">= 1.0.0"
2+
required_version = ">= 1.9.0"
33
required_providers {
44
aws = {
55
source = "hashicorp/aws"
66
version = "~> 5.0"
77
}
88
}
9-
}
9+
}

modules/elasticache/versions.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
terraform {
2-
required_version = ">= 1.0.0"
2+
required_version = ">= 1.9.0"
33
required_providers {
44
aws = {
55
source = "hashicorp/aws"
66
version = "~> 5.0"
77
}
88
}
9-
}
9+
}

modules/kms/main.tf

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
resource "aws_kms_key" "braintrust" {
2+
description = "KMS key for encrypting resources in the Braintrust data plane"
3+
key_usage = "ENCRYPT_DECRYPT"
4+
deletion_window_in_days = 7
5+
enable_key_rotation = true
6+
7+
policy = jsonencode({
8+
Version = "2012-10-17"
9+
Statement = [
10+
{
11+
Sid = "Enable IAM User Permissions"
12+
Effect = "Allow"
13+
Principal = {
14+
AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
15+
}
16+
Action = "kms:*"
17+
Resource = "*"
18+
}
19+
]
20+
})
21+
22+
tags = {
23+
Name = "${var.deployment_name}-main"
24+
Environment = var.deployment_name
25+
}
26+
}
27+
28+
resource "aws_kms_alias" "braintrust" {
29+
name = "alias/braintrust/${var.deployment_name}"
30+
target_key_id = aws_kms_key.braintrust.key_id
31+
}
32+
33+
data "aws_caller_identity" "current" {}

modules/kms/outputs.tf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
output "key_arn" {
2+
description = "The ARN of the KMS key"
3+
value = aws_kms_key.braintrust.arn
4+
}
5+
6+
output "key_alias" {
7+
description = "The alias of the KMS key"
8+
value = aws_kms_alias.braintrust.name
9+
}

modules/kms/variables.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
variable "deployment_name" {
2+
description = "Name of the deployment, used for resource naming"
3+
type = string
4+
}

modules/kms/versions.tf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
terraform {
2+
required_version = ">= 1.9.0"
3+
required_providers {
4+
aws = {
5+
source = "hashicorp/aws"
6+
version = "~> 5.0"
7+
}
8+
}
9+
}

modules/services/lambda-aiproxy.tf

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
locals {
2+
ai_proxy_function_name = "${var.deployment_name}-AIProxy"
3+
}
14
resource "aws_lambda_function" "ai_proxy" {
2-
function_name = "${var.deployment_name}-AIProxy"
5+
function_name = local.ai_proxy_function_name
36
s3_bucket = local.lambda_s3_bucket
47
s3_key = local.lambda_versions["AIProxy"]
58
role = aws_iam_role.api_handler_role.arn
@@ -8,6 +11,12 @@ resource "aws_lambda_function" "ai_proxy" {
811
memory_size = 1024
912
timeout = 900
1013
publish = true
14+
kms_key_arn = var.kms_key_arn
15+
16+
logging_config {
17+
log_format = "Text"
18+
log_group = "/braintrust/${var.deployment_name}/${local.ai_proxy_function_name}"
19+
}
1120

1221
ephemeral_storage {
1322
size = 1024

0 commit comments

Comments
 (0)