mirror of https://github.com/coder/coder.git
199 lines
4.4 KiB
HCL
199 lines
4.4 KiB
HCL
terraform {
|
|
required_providers {
|
|
coder = {
|
|
source = "coder/coder"
|
|
version = "0.6.10"
|
|
}
|
|
}
|
|
}
|
|
|
|
# Last updated 2022-05-31
|
|
# aws ec2 describe-regions | jq -r '[.Regions[].RegionName] | sort'
|
|
variable "region" {
|
|
description = "What region should your workspace live in?"
|
|
default = "us-east-1"
|
|
validation {
|
|
condition = contains([
|
|
"ap-northeast-1",
|
|
"ap-northeast-2",
|
|
"ap-northeast-3",
|
|
"ap-south-1",
|
|
"ap-southeast-1",
|
|
"ap-southeast-2",
|
|
"ca-central-1",
|
|
"eu-central-1",
|
|
"eu-north-1",
|
|
"eu-west-1",
|
|
"eu-west-2",
|
|
"eu-west-3",
|
|
"sa-east-1",
|
|
"us-east-1",
|
|
"us-east-2",
|
|
"us-west-1",
|
|
"us-west-2"
|
|
], var.region)
|
|
error_message = "Invalid region!"
|
|
}
|
|
}
|
|
|
|
variable "instance_type" {
|
|
description = "What instance type should your workspace use?"
|
|
default = "t3.micro"
|
|
validation {
|
|
condition = contains([
|
|
"t3.micro",
|
|
"t3.small",
|
|
"t3.medium",
|
|
"t3.large",
|
|
"t3.xlarge",
|
|
"t3.2xlarge",
|
|
], var.instance_type)
|
|
error_message = "Invalid instance type!"
|
|
}
|
|
}
|
|
|
|
provider "aws" {
|
|
region = var.region
|
|
}
|
|
|
|
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"
|
|
|
|
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.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 = <<EOT
|
|
Content-Type: multipart/mixed; boundary="//"
|
|
MIME-Version: 1.0
|
|
|
|
--//
|
|
Content-Type: text/cloud-config; charset="us-ascii"
|
|
MIME-Version: 1.0
|
|
Content-Transfer-Encoding: 7bit
|
|
Content-Disposition: attachment; filename="cloud-config.txt"
|
|
|
|
#cloud-config
|
|
cloud_final_modules:
|
|
- [scripts-user, always]
|
|
hostname: ${lower(data.coder_workspace.me.name)}
|
|
users:
|
|
- name: ${local.linux_user}
|
|
sudo: ALL=(ALL) NOPASSWD:ALL
|
|
shell: /bin/bash
|
|
|
|
--//
|
|
Content-Type: text/x-shellscript; charset="us-ascii"
|
|
MIME-Version: 1.0
|
|
Content-Transfer-Encoding: 7bit
|
|
Content-Disposition: attachment; filename="userdata.txt"
|
|
|
|
#!/bin/bash
|
|
sudo -u ${local.linux_user} sh -c '${coder_agent.main.init_script}'
|
|
--//--
|
|
EOT
|
|
|
|
user_data_end = <<EOT
|
|
Content-Type: multipart/mixed; boundary="//"
|
|
MIME-Version: 1.0
|
|
|
|
--//
|
|
Content-Type: text/cloud-config; charset="us-ascii"
|
|
MIME-Version: 1.0
|
|
Content-Transfer-Encoding: 7bit
|
|
Content-Disposition: attachment; filename="cloud-config.txt"
|
|
|
|
#cloud-config
|
|
cloud_final_modules:
|
|
- [scripts-user, always]
|
|
|
|
--//
|
|
Content-Type: text/x-shellscript; charset="us-ascii"
|
|
MIME-Version: 1.0
|
|
Content-Transfer-Encoding: 7bit
|
|
Content-Disposition: attachment; filename="userdata.txt"
|
|
|
|
#!/bin/bash
|
|
sudo shutdown -h now
|
|
--//--
|
|
EOT
|
|
|
|
linux_user = "coder" # Ensure this user/group does not exist in your VM image
|
|
|
|
}
|
|
|
|
resource "aws_instance" "dev" {
|
|
ami = data.aws_ami.ubuntu.id
|
|
availability_zone = "${var.region}a"
|
|
instance_type = var.instance_type
|
|
|
|
user_data = data.coder_workspace.me.transition == "start" ? local.user_data_start : local.user_data_end
|
|
tags = {
|
|
Name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
|
|
# Required if you are using our example policy, see template README
|
|
Coder_Provisioned = "true"
|
|
}
|
|
}
|
|
|
|
resource "coder_metadata" "workspace_info" {
|
|
resource_id = aws_instance.dev.id
|
|
item {
|
|
key = "region"
|
|
value = var.region
|
|
}
|
|
item {
|
|
key = "instance type"
|
|
value = aws_instance.dev.instance_type
|
|
}
|
|
item {
|
|
key = "disk"
|
|
value = "${aws_instance.dev.root_block_device[0].volume_size} GiB"
|
|
}
|
|
}
|