diff --git a/examples/templates/ecs-container/README.md b/examples/templates/ecs-container/README.md new file mode 100644 index 0000000000000..8ca7a2fc79d14 --- /dev/null +++ b/examples/templates/ecs-container/README.md @@ -0,0 +1,23 @@ +--- +name: Develop in an ECS-hosted container +description: Get started with Linux development on AWS ECS. +tags: [cloud, aws] +--- + +# aws-ecs + +This is a sample template for running a Coder workspace on ECS. It assumes there +is a pre-existing ECS cluster with EC2-based compute to host the workspace. + +## Architecture + +This workspace is built using the following AWS resources: + +- Task definition - the container definition, includes the image, command, volume(s) +- ECS service - manages the task definition + +## code-server + +`code-server` is installed via the `startup_script` argument in the `coder_agent` +resource block. The `coder_app` resource is defined to access `code-server` through +the dashboard UI over `localhost:13337`. diff --git a/examples/templates/ecs-container/main.tf b/examples/templates/ecs-container/main.tf new file mode 100644 index 0000000000000..7c5a882ce4576 --- /dev/null +++ b/examples/templates/ecs-container/main.tf @@ -0,0 +1,113 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 4.28" + } + coder = { + source = "coder/coder" + version = "~> 0.4.9" + } + } +} + +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" + startup_script = <