【Terraform】CloudFormationの代わりに使ったら超絶簡単だった話

こんにちは、日曜午後いかがお過ごしでしょうか?

さて、今日はInfrastructure as Code(IaC)的な取り組みとしてCloudFormationを一旦やめて、Terraformを使ってみることにしました。

Introduction to Infrastructure as Code with Terraform:
https://learn.hashicorp.com/terraform/getting-started/intro

結論、Terraformはめちゃくちゃ学習コスト低いです。
まだ勉強中ですが、CloudFormationに比べたら、超絶わかりやすいです。

つい昨日は【AWS】CloudFormationでEC2を立ち上げてApache & php installまで、というタイトルで、頑張ってCloudFormationでEC2もミドルウェアをインストールするところまで来ました。

なんとか昨日書いた記事内容くらいの設定をTerraformを使ってやってみようと思い、今日始めてTerraformを触り始めたのですが、なんとほぼ1時間くらいで実現できてしまいました。

作成したファイルは2つで、main.tfとvariables.tfのみです。

これがmain.tf

provider "aws" {
  region = "${var.aws_region}"
}
resource "aws_vpc" "default" {
  cidr_block = "10.0.0.0/16"
}
resource "aws_internet_gateway" "default" {
  vpc_id = "${aws_vpc.default.id}"
}
resource "aws_route" "internet_access" {
  route_table_id         = "${aws_vpc.default.main_route_table_id}"
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = "${aws_internet_gateway.default.id}"
}
resource "aws_subnet" "default" {
  vpc_id                  = "${aws_vpc.default.id}"
  cidr_block              = "10.0.0.0/24"
  map_public_ip_on_launch = true
}
resource "aws_security_group" "default" {
  name        = "aws_security_group"
  description = "aws_security_group"
  vpc_id      = "${aws_vpc.default.id}"
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
resource "aws_key_pair" "example" {
  key_name   = "examplekey"
  public_key = file("~/.ssh/terraform.pub")
}
resource "aws_instance" "web" {
  connection {
    type        = "ssh"
    user        = "ec2-user"
    private_key = file("~/.ssh/terraform")
    host        = self.public_ip
  }
  instance_type = "t2.micro"
  ami = "${lookup(var.aws_amis, var.aws_region)}"
  key_name = "${aws_key_pair.example.key_name}"
  vpc_security_group_ids = ["${aws_security_group.default.id}"]
  subnet_id = "${aws_subnet.default.id}"

  provisioner "remote-exec" {
    inline = [
      "sudo yum update -y",
      "sudo yum install nginx -y",
      "sudo service nginx start",
    ]
  }
}

そして、variables.tf

variable "public_key_path" {
  description = "public_key_path"
}

variable "key_name" {
  description = "name of AWS key pair"
}

variable "aws_region" {
  description = "AWS region to launch servers."
  default     = "ap-northeast-1"
}

# AmazonLinux
variable "aws_amis" {
  default = {
    ap-northeast-1 = "ami-0318ecd6d05daa212"
  }
}

この二つのtfファイルを適当なディレクトリに配置して、そのディレクトリで下記のコマンドを実行

$ terraform init
$ terraform apply -var 'key_name=terraform' -var 'public_key_path=/Users/ryoyaozaki/.ssh/terraform.pub'

で、パブリックIP調べてブラウザから見ると

はい、nginx起動しています。リソース丸ごと消しますー

$ terraform destroy

いや〜、学習コスト低いって言うかほぼゼロですわ。

一生懸命CloudFormationと格闘していた時間が。。。
虫の目にならず、鳥の目も持たないといけません。
Chao

Please share this page:

コメントを残す