🐼

「このインスタンスは3秒後に消滅する」

2023/10/10に公開

何の役に立つのか分からんが、Terraformを使ったお遊び半分で。

  • インスタンスを1つ用意する
  • インスタンスは時限式で、作って3時間後にTerminateされる

という条件のEC2インスタンスを作ってみた。

前提として、IAM role instance_killer を以下のポリシーで作っておく必要がある。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:TerminateInstances",
            "Resource": "arn:aws:ec2:<region>:<account-id>:instance/*"
        }
    ]
}

また、Terraformを実行するプロファイルはこのRoleをPassRoleする権限が必要。

provider "aws" {}

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~>5.0"
    }
  }
}

data "aws_caller_identity" "self" { }

data "aws_ami" "arch" {
  owners = ["647457786197"]
  filter {
    name = "name"
    values = ["arch-linux-ec2-hvm-????.??.??.x86_64-ebs"]
  }
}

variable "lifespan" {
  type = string
  default = "3h"
}

resource "aws_instance" "workspace" {
  ami = data.aws_ami.arch.id
  instance_type = "t3.micro"
}

resource "aws_scheduler_schedule" "timeout_instance" {
  target {
    arn = "arn:aws:scheduler:::aws-sdk:ec2:terminateInstances"
    role_arn = "arn:aws:iam::${data.aws_caller_identity.self.account_id}:role/instance_killer"
    input = jsonencode({
      "InstanceIds": [aws_instance.workspace.id]
    })
  }
  flexible_time_window {
    mode = "OFF"
  }
  schedule_expression = "at(${formatdate("YYYY-MM-DD'T'hh:mm:ss", timeadd(timestamp(), var.lifespan))})"
}

無駄に寿命を変数にしてるので、

$ terraform apply -var "lifespan=3m"

みたいにいじれる。

実用性は謎。

Discussion