Terraform入門その三（hello worldの表示）

[Terraform入門その一（インストール）](https://qiita.com/kenkono/items/86fb4544735d9cfad080)
[Terraform入門その二（AWSのEC2作成）](https://qiita.com/kenkono/items/a3a67585b1737a11c5c4)
Terraform入門その三（hello worldの表示）**[本記事]**
[Terraform入門その四（AWSのELB&ASGの導入）](https://qiita.com/kenkono/items/1dc35586f908a6bd177c)

前回AWSのEC2作成方法を記述しました。
続きまして、EC2インスタンスにapacheをインストールして`hello world`をブラウザに表示させます。

# 最終的なディレクトリ構成図

```
working
├── main.tf
└── vars.tf
```

# apacheのインストール

```main.tf
resource "aws_instance" "example" {
    ami = "ami-04b2d1589ab1d972c"
    instance_type = "t2.micro"

# 追加。user_dataはインスタンス作成の際に、実行されるbashスクリプトです
    user_data = <<-EOF
                #! /bin/bash
                sudo yum update
                sudo yum install -y httpd
                sudo chkconfig httpd on
                sudo service httpd start
                echo "<h1>hello world</h1>" | sudo tee /var/www/html/index.html
                EOF

    tags = {
        Name = "terraform-example"
    }
}
```

続いて、ブラウザからのアクセスを許可するため`security_group`を設定します。
下記はインバウンド(igress)についてはhttp80番ポートの開放、アウトバウンド(egress)は全許可を表します。

```main.tf
resource "aws_security_group" "instance" {
    name = "terraform-example-instance"
    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"]
  }
}
```
上記で記述した内容をインスタンスに紐づけます。

```main.tf
resource "aws_instance" "example" {
    ami = "ami-04b2d1589ab1d972c"
    instance_type = "t2.micro"
# 追加。先程記述したsecutiry_groupをインスタンスに紐づけます
    vpc_security_group_ids = ["${aws_security_group.instance.id}"]

    user_data = <<-EOF
                #! /bin/bash
                sudo yum update
                sudo yum install -y httpd
                sudo chkconfig httpd on
                sudo service httpd start
                echo "<h1>hello world</h1>" | sudo tee /var/www/html/index.html
                EOF

    tags = {
        Name = "terraform-example"
    }
}
```

設定が完了しました。

下記は全体の`main.tf`の記述です。

```main.tf
provider "aws" {
  profile    = "default"
  region     = "ap-northeast-1"
}

resource "aws_instance" "example" {
    ami = "ami-04b2d1589ab1d972c"
    instance_type = "t2.micro"
# 追加。先程記述したsecutiry_groupをインスタンスに紐づけます
    vpc_security_group_ids = ["${aws_security_group.instance.id}"]

# 追加。user_dataはインスタンス作成の際に、実行されるbashスクリプトです
    user_data = <<-EOF
                #! /bin/bash
                sudo yum update
                sudo yum install -y httpd
                sudo chkconfig httpd on
                sudo service httpd start
                echo "<h1>hello world</h1>" | sudo tee /var/www/html/index.html
                EOF

    tags = {
        Name = "terraform-example"
    }
}

resource "aws_security_group" "instance" {
    name = "terraform-example-instance"
    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"]
  }
}
```
あとは`terraform apply`を実行し、AWSマネジメントコンソールでパブリックIPの確認→ブラウザからアクセスすれば`hello world`が表示されます。

# リファクタリング
ポート番号の記述は、今後変更する可能性もあります。
今後の変更の容易性を考えて、変数を宣言します。
また、`vars.tf`に記述することでファイルも分けます。

```vars.tf
variable "server_port" {
  description = "The port the server will use for HTTP requests"
  default = 80
}
```

宣言した変数を、`aws_security_group`に組み込みます。`"${var.server_port}"`

```main.tf
resource "aws_security_group" "instance" {
    name = "terraform-example-instance"
    ingress {
        from_port = "${var.server_port}"
        to_port = "${var.server_port}"
        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"]
  }
}
```

リファクタリング後の全体のソースコード

```main.tf
provider "aws" {
  profile    = "default"
  region     = "ap-northeast-1"
}

resource "aws_instance" "example" {
    ami = "ami-04b2d1589ab1d972c"
    instance_type = "t2.micro"
    vpc_security_group_ids = ["${aws_security_group.instance.id}"]

    user_data = <<-EOF
                #! /bin/bash
                sudo yum update
                sudo yum install -y httpd
                sudo chkconfig httpd on
                sudo service httpd start
                echo "<h1>hello world</h1>" | sudo tee /var/www/html/index.html
                EOF

    tags = {
        Name = "terraform-example"
    }
}

resource "aws_security_group" "instance" {
    name = "terraform-example-instance"
    ingress {
        from_port = "${var.server_port}"
        to_port = "${var.server_port}"
        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"]
  }
}
```

```vars.tf
output "elb_dns_name" {
  value = "${aws_elb.example.dns_name}"
}
```

次回は、ELBとASGの導入を解説していきます。
[Terrafrom入門その四（AWSのELB&ASGの導入）](https://qiita.com/kenkono/items/1dc35586f908a6bd177c)

# 参照
[TERRAFORM TUTORIAL - VPC, SUBNETS, ROUTETABLE, ELB, SECURITY GROUP, AND APACHE SERVER II](https://www.bogotobogo.com/DevOps/Terraform/Terraform-VPC-Subnet-ELB-RouteTable-SecurityGroup-Apache-Server-2.php)