mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
add: ECS example template (#3915)
* add: ECS example template * fix: empty main.tf * cleanup * rm: cluster & compute * set CPU & memory vars Co-authored-by: Ben Potter <ben@coder.com> Co-authored-by: Ben Potter <ben@coder.com>
This commit is contained in:
23
examples/templates/ecs-container/README.md
Normal file
23
examples/templates/ecs-container/README.md
Normal file
@ -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`.
|
113
examples/templates/ecs-container/main.tf
Normal file
113
examples/templates/ecs-container/main.tf
Normal file
@ -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 = <<EOT
|
||||||
|
#!/bin/bash
|
||||||
|
# install and start code-server
|
||||||
|
curl -fsSL https://code-server.dev/install.sh | sh | tee code-server-install.log
|
||||||
|
code-server --auth none --port 13337 | tee code-server-install.log &
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "coder_app" "code-server" {
|
||||||
|
agent_id = coder_agent.coder.id
|
||||||
|
name = "code-server"
|
||||||
|
icon = "/icon/code.svg"
|
||||||
|
url = "http://localhost:13337?folder=/home/coder"
|
||||||
|
relative_path = true
|
||||||
|
}
|
Reference in New Issue
Block a user