terraform { required_providers { coder = { source = "coder/coder" version = "~> 0.7.0" } aws = { source = "hashicorp/aws" version = "~> 4.55" } } } # Last updated 2023-03-14 # aws ec2 describe-regions | jq -r '[.Regions[].RegionName] | sort' data "coder_parameter" "region" { name = "region" display_name = "Region" description = "The region to deploy the workspace in." default = "us-east-1" mutable = false option { name = "Asia Pacific (Tokyo)" value = "ap-northeast-1" icon = "/emojis/1f1ef-1f1f5.png" } option { name = "Asia Pacific (Seoul)" value = "ap-northeast-2" icon = "/emojis/1f1f0-1f1f7.png" } option { name = "Asia Pacific (Osaka-Local)" value = "ap-northeast-3" icon = "/emojis/1f1f0-1f1f7.png" } option { name = "Asia Pacific (Mumbai)" value = "ap-south-1" icon = "/emojis/1f1f0-1f1f7.png" } option { name = "Asia Pacific (Singapore)" value = "ap-southeast-1" icon = "/emojis/1f1f0-1f1f7.png" } option { name = "Asia Pacific (Sydney)" value = "ap-southeast-2" icon = "/emojis/1f1f0-1f1f7.png" } option { name = "Canada (Central)" value = "ca-central-1" icon = "/emojis/1f1e8-1f1e6.png" } option { name = "EU (Frankfurt)" value = "eu-central-1" icon = "/emojis/1f1ea-1f1fa.png" } option { name = "EU (Stockholm)" value = "eu-north-1" icon = "/emojis/1f1ea-1f1fa.png" } option { name = "EU (Ireland)" value = "eu-west-1" icon = "/emojis/1f1ea-1f1fa.png" } option { name = "EU (London)" value = "eu-west-2" icon = "/emojis/1f1ea-1f1fa.png" } option { name = "EU (Paris)" value = "eu-west-3" icon = "/emojis/1f1ea-1f1fa.png" } option { name = "South America (São Paulo)" value = "sa-east-1" icon = "/emojis/1f1e7-1f1f7.png" } option { name = "US East (N. Virginia)" value = "us-east-1" icon = "/emojis/1f1fa-1f1f8.png" } option { name = "US East (Ohio)" value = "us-east-2" icon = "/emojis/1f1fa-1f1f8.png" } option { name = "US West (N. California)" value = "us-west-1" icon = "/emojis/1f1fa-1f1f8.png" } option { name = "US West (Oregon)" value = "us-west-2" icon = "/emojis/1f1fa-1f1f8.png" } } data "coder_parameter" "instance_type" { name = "instance_type" display_name = "Instance type" description = "What instance type should your workspace use?" default = "t3.micro" mutable = false option { name = "2 vCPU, 1 GiB RAM" value = "t3.micro" } option { name = "2 vCPU, 2 GiB RAM" value = "t3.small" } option { name = "2 vCPU, 4 GiB RAM" value = "t3.medium" } option { name = "2 vCPU, 8 GiB RAM" value = "t3.large" } option { name = "4 vCPU, 16 GiB RAM" value = "t3.xlarge" } option { name = "8 vCPU, 32 GiB RAM" value = "t3.2xlarge" } } provider "aws" { region = data.coder_parameter.region.value } data "coder_workspace" "me" { } data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"] } filter { name = "virtualization-type" values = ["hvm"] } owners = ["099720109477"] # Canonical } resource "coder_agent" "main" { arch = "amd64" auth = "aws-instance-identity" os = "linux" startup_script_timeout = 180 startup_script = <<-EOT set -e # install and start code-server curl -fsSL https://code-server.dev/install.sh | sh -s -- --method=standalone --prefix=/tmp/code-server --version 4.11.0 /tmp/code-server/bin/code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 & EOT metadata { key = "cpu" display_name = "CPU Usage" interval = 5 timeout = 5 script = <<-EOT #!/bin/bash set -e top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4 "%"}' EOT } metadata { key = "memory" display_name = "Memory Usage" interval = 5 timeout = 5 script = <<-EOT #!/bin/bash set -e free -m | awk 'NR==2{printf "%.2f%%\t", $3*100/$2 }' EOT } metadata { key = "disk" display_name = "Disk Usage" interval = 600 # every 10 minutes timeout = 30 # df can take a while on large filesystems script = <<-EOT #!/bin/bash set -e df /home/coder | awk '$NF=="/"{printf "%s", $5}' EOT } } resource "coder_app" "code-server" { agent_id = coder_agent.main.id slug = "code-server" display_name = "code-server" url = "http://localhost:13337/?folder=/home/coder" icon = "/icon/code.svg" subdomain = false share = "owner" healthcheck { url = "http://localhost:13337/healthz" interval = 3 threshold = 10 } } locals { # User data is used to stop/start AWS instances. See: # https://github.com/hashicorp/terraform-provider-aws/issues/22 user_data_start = <