Terraform入門その一(インストール)
Terraform入門その二(AWSのEC2作成)
Terraform入門その三(hello worldの表示)[本記事]
Terraform入門その四(AWSのELB&ASGの導入)
前回AWSのEC2作成方法を記述しました。
続きまして、EC2インスタンスにapacheをインストールしてhello world
をブラウザに表示させます。
最終的なディレクトリ構成図
working
├── main.tf
└── vars.tf
apacheのインストール
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)は全許可を表します。
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"]
}
}
上記で記述した内容をインスタンスに紐づけます。
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
の記述です。
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
に記述することでファイルも分けます。
variable "server_port" {
description = "The port the server will use for HTTP requests"
default = 80
}
宣言した変数を、aws_security_group
に組み込みます。"${var.server_port}"
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"]
}
}
リファクタリング後の全体のソースコード
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"]
}
}
output "elb_dns_name" {
value = "${aws_elb.example.dns_name}"
}
次回は、ELBとASGの導入を解説していきます。
Terrafrom入門その四(AWSのELB&ASGの導入)
参照
TERRAFORM TUTORIAL - VPC, SUBNETS, ROUTETABLE, ELB, SECURITY GROUP, AND APACHE SERVER II