Skip to content
1 change: 1 addition & 0 deletions examples/braintrust-data-plane-sandbox/variables.tf
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
variable "brainstore_license_key" {
description = "The license key for the Brainstore instance. You can get this from the Braintrust UI in Settings > Data Plane."
type = string
sensitive = true
validation {
condition = var.brainstore_license_key != null && var.brainstore_license_key != ""
error_message = "The brainstore_license_key must be set."
Expand Down
1 change: 1 addition & 0 deletions examples/braintrust-data-plane/variables.tf
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
variable "brainstore_license_key" {
description = "The license key for the Brainstore instance. You can get this from the Braintrust UI in Settings > Data Plane."
type = string
sensitive = true
validation {
condition = var.brainstore_license_key != null && var.brainstore_license_key != ""
error_message = "The brainstore_license_key must be set."
Expand Down
157 changes: 88 additions & 69 deletions main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,27 @@ locals {
local.main_vpc_private_subnet_3_id
]

create_ecs_api = !var.use_deployment_mode_external_eks
enable_ecs_api = local.create_ecs_api && var.enable_ecs_api
create_ai_gateway = var.create_ai_gateway
enable_ai_gateway = local.create_ai_gateway && var.enable_ai_gateway
enable_internal_observability = trimspace(nonsensitive(var.internal_observability_api_key)) != ""
create_internal_observability_secret = local.enable_internal_observability && (local.create_ecs_api || local.create_ai_gateway)
create_ecs_api = !var.use_deployment_mode_external_eks
enable_ecs_api = local.create_ecs_api && var.enable_ecs_api
create_ai_gateway = var.create_ai_gateway
enable_ai_gateway = local.create_ai_gateway && var.enable_ai_gateway
create_brainstore_ec2 = var.enable_brainstore && !var.use_deployment_mode_external_eks

enable_internal_observability = trimspace(nonsensitive(var.internal_observability_api_key)) != ""
# Secret is shared by API ECS, gateway ECS, and Brainstore EC2 (Datadog agent).
create_internal_observability_secret = local.enable_internal_observability && (
local.create_ecs_api || local.create_ai_gateway || local.create_brainstore_ec2
)
brainstore_license_key_provided = trimspace(nonsensitive(coalesce(var.brainstore_license_key, ""))) != ""
# Stored in Secrets Manager so Brainstore user_data / gateway task defs never embed the key.
create_brainstore_license_secret = local.brainstore_license_key_provided && (
local.create_brainstore_ec2 || local.create_ai_gateway
)
brainstore_license_key_secret_arn = local.create_brainstore_license_secret ? aws_secretsmanager_secret.brainstore_license_key[0].arn : ""
brainstore_license_key_secret_version = local.create_brainstore_license_secret ? aws_secretsmanager_secret_version.brainstore_license_key[0].version_id : ""
internal_observability_api_key_secret_arn = local.create_internal_observability_secret ? aws_secretsmanager_secret.internal_observability_api_key[0].arn : ""
internal_observability_api_key_secret_version = local.create_internal_observability_secret ? aws_secretsmanager_secret_version.internal_observability_api_key[0].version_id : ""

ai_proxy_url_ssm_parameter_name = "/braintrust/${var.deployment_name}/ai-proxy-url"
api_ecs_url_ssm_parameter_name = "/braintrust/${var.deployment_name}/ecs-api-url"
brainstore_ai_proxy_url_ssm_parameter_name = local.enable_ecs_api ? local.api_ecs_url_ssm_parameter_name : local.ai_proxy_url_ssm_parameter_name
Expand Down Expand Up @@ -351,34 +366,34 @@ module "gateway_ecs" {
"public.ecr.aws/braintrust/gateway:%s",
var.ai_gateway_version_override != null ? var.ai_gateway_version_override : jsondecode(file("${path.module}/modules/gateway-ecs/VERSIONS.json"))["gateway"]
)
cpu = var.ai_gateway_cpu
memory = var.ai_gateway_memory
cpu_architecture = var.ai_gateway_cpu_architecture
min_capacity = var.ai_gateway_min_capacity
max_capacity = var.ai_gateway_max_capacity
target_cpu_utilization = var.ai_gateway_target_cpu_utilization
target_memory_utilization = var.ai_gateway_target_memory_utilization
log_retention_days = var.ai_gateway_log_retention_days
permissions_boundary_arn = var.permissions_boundary_arn
use_redis_replication_group = var.use_redis_replication_group
redis_host = module.redis.redis_endpoint
redis_port = module.redis.redis_port
redis_security_group_id = module.redis.redis_security_group_id
target_group_arn = module.gateway_alb[0].gateway_target_group_arn
alb_security_group_id = module.gateway_alb[0].gateway_alb_security_group_id
gateway_http_listener_arn = module.gateway_alb[0].gateway_http_listener_arn
extra_env_vars = var.ai_gateway_extra_env_vars
custom_tags = local.all_custom_tags
brainstore_license_key = var.brainstore_license_key
enable_execute_command = var.ai_gateway_enable_execute_command
braintrust_app_url = var.ai_gateway_braintrust_app_url
braintrust_api_url = var.use_deployment_mode_external_eks ? var.braintrust_api_url : module.ingress[0].api_url
unsafe_url_request_mode = var.unsafe_url_request_mode
url_security_dns_servers = var.url_security_dns_servers
url_security_allow_cidrs = var.url_security_allow_cidrs
cpu = var.ai_gateway_cpu
memory = var.ai_gateway_memory
cpu_architecture = var.ai_gateway_cpu_architecture
min_capacity = var.ai_gateway_min_capacity
max_capacity = var.ai_gateway_max_capacity
target_cpu_utilization = var.ai_gateway_target_cpu_utilization
target_memory_utilization = var.ai_gateway_target_memory_utilization
log_retention_days = var.ai_gateway_log_retention_days
permissions_boundary_arn = var.permissions_boundary_arn
use_redis_replication_group = var.use_redis_replication_group
redis_host = module.redis.redis_endpoint
redis_port = module.redis.redis_port
redis_security_group_id = module.redis.redis_security_group_id
target_group_arn = module.gateway_alb[0].gateway_target_group_arn
alb_security_group_id = module.gateway_alb[0].gateway_alb_security_group_id
gateway_http_listener_arn = module.gateway_alb[0].gateway_http_listener_arn
extra_env_vars = var.ai_gateway_extra_env_vars
custom_tags = local.all_custom_tags
brainstore_license_key_secret_arn = local.brainstore_license_key_secret_arn
enable_execute_command = var.ai_gateway_enable_execute_command
braintrust_app_url = var.ai_gateway_braintrust_app_url
braintrust_api_url = var.use_deployment_mode_external_eks ? var.braintrust_api_url : module.ingress[0].api_url
unsafe_url_request_mode = var.unsafe_url_request_mode
url_security_dns_servers = var.url_security_dns_servers
url_security_allow_cidrs = var.url_security_allow_cidrs

# Observability
internal_observability_api_key_secret_arn = local.create_internal_observability_secret ? aws_secretsmanager_secret.internal_observability_api_key[0].arn : ""
internal_observability_api_key_secret_arn = local.internal_observability_api_key_secret_arn
internal_observability_enabled = local.create_internal_observability_secret
internal_observability_env_name = var.internal_observability_env_name
internal_observability_region = var.internal_observability_region
Expand All @@ -394,7 +409,7 @@ module "api_ecs" {

# Telemetry
monitoring_telemetry = var.monitoring_telemetry
internal_observability_api_key_secret_arn = local.create_internal_observability_secret ? aws_secretsmanager_secret.internal_observability_api_key[0].arn : ""
internal_observability_api_key_secret_arn = local.internal_observability_api_key_secret_arn
internal_observability_env_name = var.internal_observability_env_name
internal_observability_region = var.internal_observability_region
internal_observability_trace_disabled_plugins = var.internal_observability_trace_disabled_plugins
Expand Down Expand Up @@ -528,6 +543,8 @@ module "services_common" {
vpc_id = local.main_vpc_id
kms_key_arn = local.kms_key_arn
database_secret_arn = module.database.postgres_database_secret_arn
brainstore_license_key_secret_arn = local.brainstore_license_key_secret_arn
internal_observability_api_key_secret_arn = local.internal_observability_api_key_secret_arn
brainstore_s3_bucket_arn = module.storage.brainstore_bucket_arn
code_bundle_s3_bucket_arn = module.storage.code_bundle_bucket_arn
lambda_responses_s3_bucket_arn = module.storage.lambda_responses_bucket_arn
Expand All @@ -550,42 +567,44 @@ module "services_common" {

module "brainstore" {
source = "./modules/brainstore-ec2"
count = var.enable_brainstore && !var.use_deployment_mode_external_eks ? 1 : 0

deployment_name = var.deployment_name
instance_count = var.brainstore_instance_count
instance_type = var.brainstore_instance_type
instance_key_pair_name = var.brainstore_instance_key_pair_name
port = var.brainstore_port
license_key = var.brainstore_license_key
version_override = var.brainstore_version_override
skip_pg_for_brainstore_objects = var.skip_pg_for_brainstore_objects
brainstore_enable_export = var.brainstore_enable_export
extra_env_vars = var.brainstore_extra_env_vars
extra_env_vars_writer = var.brainstore_extra_env_vars_writer
writer_instance_count = var.brainstore_writer_instance_count
writer_instance_type = var.brainstore_writer_instance_type
fast_reader_instance_count = var.brainstore_fast_reader_instance_count
fast_reader_instance_type = var.brainstore_fast_reader_instance_type
extra_env_vars_fast_reader = var.brainstore_extra_env_vars_fast_reader
cache_file_size_fast_reader = var.brainstore_cache_file_size_fast_reader
ai_proxy_url_ssm_parameter = local.brainstore_ai_proxy_url_ssm_parameter
monitoring_telemetry = var.monitoring_telemetry
database_host = module.database.postgres_database_address
database_port = module.database.postgres_database_port
database_secret_arn = module.database.postgres_database_secret_arn
use_redis_replication_group = var.use_redis_replication_group
redis_host = module.redis.redis_endpoint
redis_port = module.redis.redis_port
service_token_secret_arn = module.services_common.function_tools_secret_arn
brainstore_s3_bucket_arn = module.storage.brainstore_bucket_arn
lambda_responses_s3_bucket_arn = module.storage.lambda_responses_bucket_arn
code_bundle_s3_bucket_arn = module.storage.code_bundle_bucket_arn
internal_observability_api_key = var.internal_observability_api_key
internal_observability_env_name = var.internal_observability_env_name
internal_observability_region = var.internal_observability_region
brainstore_instance_security_group_id = module.services_common.brainstore_instance_security_group_id
vpc_id = local.main_vpc_id
count = local.create_brainstore_ec2 ? 1 : 0

deployment_name = var.deployment_name
instance_count = var.brainstore_instance_count
instance_type = var.brainstore_instance_type
instance_key_pair_name = var.brainstore_instance_key_pair_name
port = var.brainstore_port
license_key_secret_arn = local.brainstore_license_key_secret_arn
license_key_secret_version = local.brainstore_license_key_secret_version
version_override = var.brainstore_version_override
skip_pg_for_brainstore_objects = var.skip_pg_for_brainstore_objects
brainstore_enable_export = var.brainstore_enable_export
extra_env_vars = var.brainstore_extra_env_vars
extra_env_vars_writer = var.brainstore_extra_env_vars_writer
writer_instance_count = var.brainstore_writer_instance_count
writer_instance_type = var.brainstore_writer_instance_type
fast_reader_instance_count = var.brainstore_fast_reader_instance_count
fast_reader_instance_type = var.brainstore_fast_reader_instance_type
extra_env_vars_fast_reader = var.brainstore_extra_env_vars_fast_reader
cache_file_size_fast_reader = var.brainstore_cache_file_size_fast_reader
ai_proxy_url_ssm_parameter = local.brainstore_ai_proxy_url_ssm_parameter
monitoring_telemetry = var.monitoring_telemetry
database_host = module.database.postgres_database_address
database_port = module.database.postgres_database_port
database_secret_arn = module.database.postgres_database_secret_arn
use_redis_replication_group = var.use_redis_replication_group
redis_host = module.redis.redis_endpoint
redis_port = module.redis.redis_port
service_token_secret_arn = module.services_common.function_tools_secret_arn
brainstore_s3_bucket_arn = module.storage.brainstore_bucket_arn
lambda_responses_s3_bucket_arn = module.storage.lambda_responses_bucket_arn
code_bundle_s3_bucket_arn = module.storage.code_bundle_bucket_arn
internal_observability_api_key_secret_arn = local.internal_observability_api_key_secret_arn
internal_observability_api_key_secret_version = local.internal_observability_api_key_secret_version
internal_observability_env_name = var.internal_observability_env_name
internal_observability_region = var.internal_observability_region
brainstore_instance_security_group_id = module.services_common.brainstore_instance_security_group_id
vpc_id = local.main_vpc_id
authorized_security_groups = merge(
merge(
{
Expand Down
60 changes: 31 additions & 29 deletions modules/brainstore-ec2/main-fast-reader.tf
Original file line number Diff line number Diff line change
Expand Up @@ -36,35 +36,37 @@ resource "aws_launch_template" "brainstore_fast_reader" {
}

user_data = base64gzip(templatefile("${path.module}/templates/user_data.sh.tpl", {
aws_region = data.aws_region.current.region
deployment_name = var.deployment_name
database_secret_arn = var.database_secret_arn
database_host = var.database_host
database_port = var.database_port
redis_scheme = var.use_redis_replication_group ? "rediss" : "redis"
redis_host = var.redis_host
redis_port = var.redis_port
brainstore_port = var.port
brainstore_s3_bucket = local.brainstore_s3_bucket_id
lambda_responses_bucket_id = local.lambda_responses_bucket_id
code_bundle_bucket_id = local.code_bundle_bucket_id
brainstore_locks_s3_path = trimprefix(var.locks_s3_path, "/")
brainstore_license_key = var.license_key
brainstore_version_override = var.version_override == null ? "" : var.version_override
brainstore_release_version = local.brainstore_release_version
monitoring_telemetry = var.monitoring_telemetry
is_dedicated_reader_node = "true"
is_dedicated_writer_node = "false"
extra_env_vars = var.extra_env_vars_fast_reader
internal_observability_api_key = var.internal_observability_api_key
internal_observability_env_name = var.internal_observability_env_name
internal_observability_region = var.internal_observability_region
service_token_secret_arn = var.service_token_secret_arn
custom_post_install_script = var.custom_post_install_script
brainstore_cache_file_size = local.brainstore_fast_reader_cache_file_size
skip_pg_for_brainstore_objects = var.skip_pg_for_brainstore_objects
brainstore_enable_export = var.brainstore_enable_export
ai_proxy_url_ssm_parameter = var.ai_proxy_url_ssm_parameter
aws_region = data.aws_region.current.region
deployment_name = var.deployment_name
database_secret_arn = var.database_secret_arn
database_host = var.database_host
database_port = var.database_port
redis_scheme = var.use_redis_replication_group ? "rediss" : "redis"
redis_host = var.redis_host
redis_port = var.redis_port
brainstore_port = var.port
brainstore_s3_bucket = local.brainstore_s3_bucket_id
lambda_responses_bucket_id = local.lambda_responses_bucket_id
code_bundle_bucket_id = local.code_bundle_bucket_id
brainstore_locks_s3_path = trimprefix(var.locks_s3_path, "/")
license_key_secret_arn = var.license_key_secret_arn
license_key_secret_version = var.license_key_secret_version
brainstore_version_override = var.version_override == null ? "" : var.version_override
brainstore_release_version = local.brainstore_release_version
monitoring_telemetry = var.monitoring_telemetry
is_dedicated_reader_node = "true"
is_dedicated_writer_node = "false"
extra_env_vars = var.extra_env_vars_fast_reader
internal_observability_api_key_secret_arn = var.internal_observability_api_key_secret_arn
internal_observability_api_key_secret_version = var.internal_observability_api_key_secret_version
internal_observability_env_name = var.internal_observability_env_name
internal_observability_region = var.internal_observability_region
service_token_secret_arn = var.service_token_secret_arn
custom_post_install_script = var.custom_post_install_script
brainstore_cache_file_size = local.brainstore_fast_reader_cache_file_size
skip_pg_for_brainstore_objects = var.skip_pg_for_brainstore_objects
brainstore_enable_export = var.brainstore_enable_export
ai_proxy_url_ssm_parameter = var.ai_proxy_url_ssm_parameter
}))

tags = merge({
Expand Down
Loading
Loading