Linux活用レシピ > AWS活用 > RaspberryPiにTerraformを入れてAWSを自動制御する方法
RaspberryPiに、TerraformをインストールしてAWSを自動制御する「Infrastructure as Code」を実現するレシピを紹介します。

RaspberryPiにTerraformを入れてAWSを自動制御


Terraformのコードを使ってAWSの自動制御

    このページでは、これまで準備したRaspberryPiとAWSの環境を使って、実際にTerraformのコードからAWSを自動制御してみます。


手順

  1. ansibleを実行するディレクトリを作成します。
    pi@raspberrypi:~ $ mkdir linux-memo-aws
    


  2. 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"
        }
    }
    


  3. それでは、実際にコードから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を自動的に制御する様子を動画でもご確認ください。



    以上でRaspberryPiにTerraformを入れてAWSを自動制御するレシピは終了です。さらにいろいろなコードを作成し、AWSの自動化を研究してみましょう。