RaspberryPiにTerraformを入れてAWSを自動制御
◆ Terraformのコードを使ってAWSの自動制御◆
このページでは、これまで準備したRaspberryPiとAWSの環境を使って、実際にTerraformのコードからAWSを自動制御してみます。
◆ 手順◆
ansibleを実行するディレクトリを作成します。
pi@raspberrypi :~ $ mkdir linux-memo-aws
Terraformのコードを1ファイルで一気に記述していきます。
ちなみにコードはファイルを小分けにして、モジュール形式で作成すると、部品として小回りを効かせたコーディングができるのですが、ここでは機能を一気に詰め込んだ1ファイルで紹介します。
pi@raspberrypi :~ $ vi linux-memo-aws/ec2.tf
variable "provider_region" {
description = "Provider region"
default = "us-west-2"
}
variable "provider_profile" {
description = "AWS Profile"
default = "default"
}
variable "availability_zone" {
description = "avairability zone"
default = "us-west-2a"
}
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
}
provider "aws" {
profile = var.provider_profile
region = var.provider_region
#access_key = "${var.aws_access_key}"
#secret_key = "${var.aws_secret_key}"
#region = "${var.aws_region}"
}
# @VPCを作成します。
#variable "public_subnets" {}
resource "aws_vpc" "linux-memo-ex" {
cidr_block = "172.16.0.0/16"
instance_tenancy = "default"
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "linux-memo-ex"
}
}
# Aインターネットゲートウェイを作成します。
resource "aws_internet_gateway" "linux-memo-ex" {
vpc_id = aws_vpc.linux-memo-ex.id
tags = {
Name = "linux-memo-ex"
}
}
# Bルートテーブルを作成します。
resource "aws_route_table" "linux-memo-ex" {
vpc_id = aws_vpc.linux-memo-ex.id
tags = {
Name = "linux-memo-ex"
}
}
# CVPC内サブネットを2つ作成していきます。
resource "aws_subnet" "public_linux-memo-ex_01" {
vpc_id = aws_vpc.linux-memo-ex.id
cidr_block = "172.16.30.0/24"
map_public_ip_on_launch = true
availability_zone = var.availability_zone
tags = {
Name = "linux-memo-ex"
}
}
resource "aws_subnet" "public_linux-memo-ex_02" {
vpc_id = aws_vpc.linux-memo-ex.id
cidr_block = "172.16.31.0/24"
map_public_ip_on_launch = true
availability_zone = var.availability_zone
tags = {
Name = "linux-memo-ex"
}
}
## Dインターネット側ルーティングを作成します。
resource "aws_route" "linux-memo-ex" {
route_table_id = aws_route_table.linux-memo-ex.id
gateway_id = aws_internet_gateway.linux-memo-ex.id
destination_cidr_block = "0.0.0.0/0"
}
## Eルートテーブルにサブネットを関連付けて行きます。
resource "aws_route_table_association" "linux-memo-example_01" {
subnet_id = aws_subnet.public_linux-memo-ex_01.id
route_table_id = aws_route_table.linux-memo-ex.id
}
resource "aws_route_table_association" "linux-memo-example_02" {
subnet_id = aws_subnet.public_linux-memo-ex_02.id
route_table_id = aws_route_table.linux-memo-ex.id
}
## Fセキュリティグループを作成していきます。
## 外部からはTCP22番ポートのみ開け、内部から外部はすべて開けます。
resource "aws_security_group" "linux-memo-ex" {
name = "linux-memo-ex"
description = "linux-memo-ex security group"
vpc_id = aws_vpc.linux-memo-ex.id
ingress {
description = "allow ssh"
from_port = 22
to_port = 22
protocol = "tcp"
# cidr_blocks = ["aws_vpc.example.cidr_block"]
cidr_blocks = ["0.0.0.0/0"]
}
egress {
description = "allow outbound"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "linux-memo-ex"
}
}
## GEC2で使用できるAMIを検索します。
data "aws_ami" "linux-memo-ex" {
most_recent = true
name_regex = "amzn2*"
owners = ["amazon"]
filter {
name = "name"
values = ["amzn2-ami-hvm-*"]
}
filter {
name = "architecture"
values = ["x86_64"]
}
filter {
name = "root-device-type"
values = ["ebs"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
filter {
name = "state"
values = ["available"]
}
}
## H最後にインスタンスを作成し、サブネットやセキュリティグループを
## 適用します。
resource "aws_instance" "linux-memo-ex-web1" {
ami = data.aws_ami.linux-memo-ex.id
instance_type = "t2.micro"
monitoring = true
availability_zone = var.availability_zone
# security_groups = [aws_security_group.linux-memo-ex.id]
vpc_security_group_ids = [aws_security_group.linux-memo-ex.id]
subnet_id = aws_subnet.public_linux-memo-ex_01.id
tags = {
Name = "linux-memo-ex"
}
}
それでは、実際にコードからAWSを制御してみましょう。
Terraformはコードがあるディレクトリに移動して、以下の処理を行うことで、初期化->AWSの環境の構築->廃棄までの1サイクルをまわすことができます。
pi@raspberrypi :~ $ cd linux-memo-aws #コードが置かれたディレクトリへ
pi@raspberrypi :~ $ terraform init #初期化
pi@raspberrypi :~ $ terraform validate #変数の確認
pi@raspberrypi :~ $ terraform plan #実行内容の確認(ドライラン)
pi@raspberrypi :~ $ terraform apply #実行
pi@raspberrypi :~ $ terrafrom destroy #実行した内容の廃棄
なお、実行と実行した内容の廃棄に関しては、コマンド入力後、以下の通り最終確認が行われますので、確認後「yes」と入力して「ENTER」キーを入力して処理を続行させてください。
pi@raspberrypi :~ $ terraform apply #実行
:
:
Plan: 10 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes <--「yes」と入力
:
:
pi@raspberrypi :~ $ terrafrom destroy #実行した内容の廃棄
:
:
Plan: 0 to add, 0 to change, 10 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown
above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes <--「yes」と入力
:
:
実際に「terraform apply #実行」のあとに、AWSのEC2をブラウザで見てみると、インスタンスがVPC等と共に自動構成されていることが確認できます。
また、「terrafrom destroy #実行した内容の廃棄」のあとに、確認いただくとインスタンスやVPCがきれいになくなっていることが分かります。
◆ TerraformでのAWSの自動構成の様子 ◆
TerraformがインストールされたRaspberryPiからAWSを自動的に制御する様子を動画でもご確認ください。
VIDEO
以上でRaspberryPiにTerraformを入れてAWSを自動制御するレシピは終了です。さらにいろいろなコードを作成し、AWSの自動化を研究してみましょう。