Spaces:
Running
Running
terraform { | |
required_providers { | |
aws = { | |
source = "hashicorp/aws" | |
version = "~> 5.0" | |
} | |
} | |
} | |
# Define provider | |
variable "AWS_ACCESS_KEY" {} | |
variable "AWS_SECRET_ACCESS_KEY" {} | |
provider "aws" { | |
access_key = var.AWS_ACCESS_KEY | |
secret_key = var.AWS_SECRET_ACCESS_KEY | |
region = var.region | |
} | |
# Create security group | |
resource "aws_security_group" "chroma_sg" { | |
name = "chroma-cluster-sg" | |
description = "Security group for the cluster nodes" | |
ingress { | |
from_port = 22 | |
to_port = 22 | |
protocol = "tcp" | |
cidr_blocks = var.mgmt_source_ranges | |
} | |
dynamic "ingress" { | |
for_each = var.public_access ? [1] : [] | |
content { | |
from_port = var.chroma_port | |
to_port = 8000 | |
protocol = "tcp" | |
cidr_blocks = var.source_ranges | |
} | |
} | |
egress { | |
from_port = 0 | |
to_port = 0 | |
protocol = "-1" | |
cidr_blocks = ["0.0.0.0/0"] | |
ipv6_cidr_blocks = ["::/0"] | |
} | |
tags = local.tags | |
} | |
resource "aws_key_pair" "chroma-keypair" { | |
key_name = "chroma-keypair" # Replace with your desired key pair name | |
public_key = file(var.ssh_public_key) # Replace with the path to your public key file | |
} | |
data "aws_ami" "ubuntu" { | |
most_recent = true | |
filter { | |
name = "name" | |
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy*"] | |
} | |
filter { | |
name = "virtualization-type" | |
values = ["hvm"] | |
} | |
filter { | |
name = "architecture" | |
values = ["x86_64"] | |
} | |
owners = ["099720109477"] # Canonical | |
} | |
# Create EC2 instances | |
resource "aws_instance" "chroma_instance" { | |
ami = data.aws_ami.ubuntu.id | |
instance_type = var.instance_type | |
key_name = "chroma-keypair" | |
security_groups = [aws_security_group.chroma_sg.name] | |
user_data = data.template_file.user_data.rendered | |
tags = local.tags | |
ebs_block_device { | |
device_name = "/dev/sda1" | |
volume_size = var.chroma_instance_volume_size # size in GBs | |
} | |
} | |
resource "aws_ebs_volume" "chroma-volume" { | |
availability_zone = aws_instance.chroma_instance.availability_zone | |
size = var.chroma_data_volume_size | |
final_snapshot = var.chroma_data_volume_snapshot_before_destroy | |
snapshot_id = var.chroma_data_restore_from_snapshot_id | |
tags = local.tags | |
lifecycle { | |
prevent_destroy = true | |
} | |
} | |
locals { | |
cleaned_volume_id = replace(aws_ebs_volume.chroma-volume.id, "-", "") | |
} | |
locals { | |
restore_from_snapshot = length(var.chroma_data_restore_from_snapshot_id) == 0 ? false : true | |
} | |
resource "aws_volume_attachment" "chroma_volume_attachment" { | |
device_name = "/dev/sdh" | |
volume_id = aws_ebs_volume.chroma-volume.id | |
instance_id = aws_instance.chroma_instance.id | |
provisioner "remote-exec" { | |
inline = [ | |
"if [ -z \"${local.restore_from_snapshot}\" ]; then export VOLUME_ID=${local.cleaned_volume_id} && sudo mkfs -t ext4 /dev/$(lsblk -o +SERIAL | grep $VOLUME_ID | awk '{print $1}'); fi", | |
"sudo mkdir /chroma-data", | |
"export VOLUME_ID=${local.cleaned_volume_id} && sudo mount /dev/$(lsblk -o +SERIAL | grep $VOLUME_ID | awk '{print $1}') /chroma-data", | |
"export VOLUME_ID=${local.cleaned_volume_id} && cat <<EOF | sudo tee /etc/fstab >> /dev/null", | |
"/dev/$(lsblk -o +SERIAL | grep $VOLUME_ID | awk '{print $1}') /chroma-data ext4 defaults,nofail,discard 0 0", | |
"EOF", | |
] | |
connection { | |
host = aws_instance.chroma_instance.public_ip | |
type = "ssh" | |
user = "ubuntu" | |
private_key = file(var.ssh_private_key) | |
} | |
} | |
depends_on = [aws_instance.chroma_instance, aws_ebs_volume.chroma-volume] | |
} | |
output "instance_public_ip" { | |
value = aws_instance.chroma_instance.public_ip | |
} | |
output "instance_private_ip" { | |
value = aws_instance.chroma_instance.private_ip | |
} | |
output "chroma_auth_token" { | |
value = random_password.chroma_token.result | |
sensitive = true | |
} | |
output "chroma_auth_basic" { | |
value = "${local.basic_auth_credentials.username}:${local.basic_auth_credentials.password}" | |
sensitive = true | |
} | |