coder/examples/templates/aws-ecs-container/main.tf

126 lines
3.0 KiB
HCL

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.28"
}
coder = {
source = "coder/coder"
version = "0.6.10"
}
}
}
variable "ecs-cluster" {
description = "Input the ECS cluster ARN to host the workspace"
default = ""
}
variable "cpu" {
default = "1024"
}
variable "memory" {
default = "2048"
}
# configure AWS provider with creds present on Coder server host
provider "aws" {
shared_config_files = ["$HOME/.aws/config"]
shared_credentials_files = ["$HOME/.aws/credentials"]
}
# coder workspace, created as an ECS task definition
resource "aws_ecs_task_definition" "workspace" {
family = "coder"
requires_compatibilities = ["EC2"]
cpu = var.cpu
memory = var.memory
container_definitions = jsonencode([
{
name = "coder-workspace-${data.coder_workspace.me.id}"
image = "codercom/enterprise-base:ubuntu"
cpu = 1024
memory = 2048
essential = true
user = "coder"
command = ["sh", "-c", coder_agent.coder.init_script]
environment = [
{
"name" = "CODER_AGENT_TOKEN"
"value" = coder_agent.coder.token
}
]
mountPoints = [
{
# the name of the volume to mount
sourceVolume = "home-dir-${data.coder_workspace.me.id}"
# path on the container to mount the volume at
containerPath = "/home/coder"
}
]
portMappings = [
{
containerPort = 80
hostPort = 80
}
]
}
])
# workspace persistent volume definition
volume {
name = "home-dir-${data.coder_workspace.me.id}"
docker_volume_configuration {
# "shared" ensures that the disk is persisted upon workspace restart
scope = "shared"
autoprovision = true
driver = "local"
}
}
}
resource "aws_ecs_service" "workspace" {
name = "workspace-${data.coder_workspace.me.id}"
cluster = var.ecs-cluster
task_definition = aws_ecs_task_definition.workspace.arn
# scale the service to zero when the workspace is stopped
desired_count = data.coder_workspace.me.start_count
}
data "coder_workspace" "me" {}
resource "coder_agent" "coder" {
arch = "amd64"
auth = "token"
os = "linux"
dir = "/home/coder"
login_before_ready = false
startup_script_timeout = 180
startup_script = <<-EOT
set -e
# install and start code-server
curl -fsSL https://code-server.dev/install.sh | sh -s -- --version 4.8.3
code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 &
EOT
}
resource "coder_app" "code-server" {
agent_id = coder_agent.coder.id
slug = "code-server"
display_name = "code-server"
icon = "/icon/code.svg"
url = "http://localhost:13337?folder=/home/coder"
subdomain = false
share = "owner"
healthcheck {
url = "http://localhost:13337/healthz"
interval = 3
threshold = 10
}
}