mirror of
https://github.com/coder/coder.git
synced 2025-07-10 23:53:15 +00:00
This enables a "kubernetes_pod" to attach multiple agents that could be for multiple services. Each agent is required to have a unique name, so SSH syntax is: `coder ssh <workspace>.<agent>` A resource can have zero agents too, they aren't required.
143 lines
3.0 KiB
HCL
143 lines
3.0 KiB
HCL
terraform {
|
|
required_providers {
|
|
coder = {
|
|
source = "coder/coder"
|
|
version = "~> 0.3.1"
|
|
}
|
|
}
|
|
}
|
|
|
|
variable "access_key" {
|
|
description = <<EOT
|
|
Create an AWS access key to provision resources with Coder:
|
|
- https://console.aws.amazon.com/iam/home#/users
|
|
|
|
AWS Access Key
|
|
EOT
|
|
sensitive = true
|
|
}
|
|
|
|
variable "secret_key" {
|
|
description = <<EOT
|
|
AWS Secret Key
|
|
EOT
|
|
sensitive = true
|
|
}
|
|
|
|
variable "region" {
|
|
description = "What region should your workspace live in?"
|
|
default = "us-east-1"
|
|
validation {
|
|
condition = contains(["us-east-1", "us-east-2", "us-west-1", "us-west-2"], var.region)
|
|
error_message = "Invalid region!"
|
|
}
|
|
}
|
|
|
|
variable "disk_size" {
|
|
description = "Specify your disk size (GiBs)"
|
|
default = "20"
|
|
type = number
|
|
validation {
|
|
condition = (
|
|
var.disk_size >= 8 &&
|
|
var.disk_size <= 256
|
|
)
|
|
error_message = "Disk size must be between 8 and 256."
|
|
}
|
|
}
|
|
|
|
provider "aws" {
|
|
region = var.region
|
|
access_key = var.access_key
|
|
secret_key = var.secret_key
|
|
}
|
|
|
|
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" "dev" {
|
|
arch = "amd64"
|
|
auth = "aws-instance-identity"
|
|
os = "linux"
|
|
}
|
|
|
|
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]
|
|
|
|
--//
|
|
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 -E -u ubuntu sh -c '${coder_agent.dev.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
|
|
}
|
|
|
|
resource "aws_instance" "dev" {
|
|
ami = data.aws_ami.ubuntu.id
|
|
availability_zone = "${var.region}a"
|
|
instance_type = "t3.micro"
|
|
|
|
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}"
|
|
}
|
|
}
|