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:
Eric Paulsen
2022-09-08 10:27:27 -05:00
committed by GitHub
parent 2c41343ce5
commit 9c5b879b16
2 changed files with 136 additions and 0 deletions

View 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`.

View 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
}