Terraform으로 인프라의 코딩을 체험해 보자 ~ 그 ③ VPC 환경을 만들어 그 안에 EC2 인스턴스를 만들어 보자

10561 단어 EC2vpcTerraformAWS
지난번 , terraform을 사용하여 EC2 인스턴스를 시작하고 즉시 destroy로 파괴합니다.
라는 일련의 흐름을 체험했습니다.

이번에는 VPC를 만들고 그 안에 EC2 인스턴스를 시작한다는 점과 일반적으로 되어 온 구성을 만들어 보겠습니다.

전제 지식



이번, 아래와 같은 {awsのリソース名}.{リソースの名前}.id 라든지 잘 나옵니다.

예. 여기서는 "${aws_vpc.test_vpc.id}"test_vpc 라는 이름이 붙은 vpc 리소스의 id 를 당겨 왔습니다.
resource "aws_subnet" "public-1a" {
    vpc_id = "${aws_vpc.test_vpc.id}"
    cidr_block = "10.0.0.0/24"
    availability_zone = "ap-northeast-1a"
    tags {
     Name = "test_1a"
   }
}

이와 같이, terrafom에서는, 다른 자원의 ID나 name등을 상술한 룰로 사용할 수가 있습니다.

조속히 만들어 보자



이번은 이제 전제를 말하는 것보다, 실제의 terraform의 파일을 보는 편이 빠르다고 생각하기 때문에 봅니다.

구성


terraform-test/
├── aws.tf
├── main.tf
├── terraform.tfstate
└── terraform.tfvars
  • aws.tf
  • aws라는 provider를 사용하기위한 설정을 설명합니다

  • terraform.tfvars
  • AWS의 access_key와 secret_key를 나열합니다 (github에 커밋하면 죽는 사람입니다).

  • terraform.tfstate
  • 현재의 인프라의 상황을 나타내는 json 파일입니다.
  • 한 번이라도 terraform로 인프라를 구축하면 자동으로 생성됩니다


  • 아 ws. tf


    variable "aws_access_key" {}
    variable "aws_secret_key" {}
    variable "region" {}
    
    provider "aws" {
        access_key = "${var.aws_access_key}"
        secret_key = "${var.aws_secret_key}"
        region     = "${var.region}"
    }
    

    마인. tf


    # VPCの設定
    resource "aws_vpc" "test_vpc" {
        cidr_block = "10.0.0.0/16"
        instance_tenancy = "default"
        tags {
         Name = "test_vpc_"
       }
    }
    
    ## 以下サブネットの設定(各AZ毎に設定する)
    resource "aws_subnet" "public-1a" {
        vpc_id = "${aws_vpc.test_vpc.id}"
        cidr_block = "10.0.0.0/24"
        availability_zone = "ap-northeast-1a"
        tags {
         Name = "test_1a"
       }
    }
    
    resource "aws_subnet" "public-1c" {
        vpc_id = "${aws_vpc.test_vpc.id}"
        cidr_block = "10.0.1.0/24"
        availability_zone = "ap-northeast-1c"
        tags {
         Name = "test_2a"
       }
    }
    
    ## ゲートウェイの設定
    resource "aws_internet_gateway" "igw_for_test_vpc" {
        vpc_id = "${aws_vpc.test_vpc.id}"
    }
    
    ## 以下ルーティングテーブルの設定
    
    resource "aws_route_table" "public-route" {
        vpc_id = "${aws_vpc.test_vpc.id}"
        route {
          cidr_block = "0.0.0.0/0"
          gateway_id = "${aws_internet_gateway.igw_for_test_vpc.id}"
       }
    }
    
    resource "aws_route_table_association" "puclic-1a" {
        subnet_id = "${aws_subnet.public-1a.id}"
        route_table_id = "${aws_route_table.public-route.id}"
    }
    
    resource "aws_route_table_association" "puclic-1c" {
        subnet_id = "${aws_subnet.public-1c.id}"
        route_table_id = "${aws_route_table.public-route.id}"
    }
    
    
    # セキュリティグループ
    resource "aws_security_group" "test_vpc_sg" {
        name = "test_vpc_sg"
        description = "testing security group for test_vpc"
        vpc_id = "${aws_vpc.test_vpc.id}"
        ingress {
          from_port = 80
          to_port = 80
          protocol = "tcp"
          cidr_blocks = ["0.0.0.0/0"]
        }
        ingress {
          from_port = 443
          to_port = 443
          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"]
        }
    
        tags {
          Name = "test_vpc"
       }
    }
    
    # EC2インスタンス
    
    resource "aws_instance" "test_rikkey" {
      # Amazon Linux AMI
      ami           = "ami-4af5022c"
      instance_type = "t2.micro"
      # 予め作っておいたkey pairの名前を指定する(存在しないとエラーになります)
      key_name      = "test_key_pair"
      vpc_security_group_ids = ["${aws_security_group.test_vpc_sg.id}"]
      subnet_id = "${aws_subnet.public-1a.id}"
      ebs_block_device = {
        device_name = "/dev/sdf"
        volume_type = "gp2"
        volume_size = "30"
      }
      tags {
       Name = "test-vpc"
      }
    }
    
    # EIP
    
    resource "aws_eip" "eip_for_test_rikkey" {
        instance = "${aws_instance.test_rikkey.id}"
        vpc = true
    }
    

    apply 해보자


    $ terraform apply
    aws_vpc.test_vpc: Refreshing state... (ID: vpc-c4dbefa0)
    aws_subnet.public-1a: Refreshing state... (ID: subnet-1a18da53)
    aws_internet_gateway.igw_for_test_vpc: Refreshing state... (ID: igw-3e6ca65a)
    aws_subnet.public-1c: Refreshing state... (ID: subnet-15f4f34d)
    aws_security_group.test_vpc_sg: Refreshing state... (ID: sg-86e993e0)
    aws_route_table.public-route: Refreshing state... (ID: rtb-543ce333)
    aws_route_table_association.puclic-1a: Refreshing state... (ID: rtbassoc-9bc6cefc)
    aws_route_table_association.puclic-1c: Refreshing state... (ID: rtbassoc-1bded67c)
    aws_instance.test_rikkey: Creating...
      ami:                                               "" => "ami-4af5022c"
      associate_public_ip_address:                       "" => "<computed>"
      availability_zone:                                 "" => "<computed>"
      ebs_block_device.#:                                "" => "1"
      ebs_block_device.2659407853.delete_on_termination: "" => "true"
      ebs_block_device.2659407853.device_name:           "" => "/dev/sdf"
      ebs_block_device.2659407853.encrypted:             "" => "<computed>"
      ebs_block_device.2659407853.iops:                  "" => "<computed>"
      ebs_block_device.2659407853.snapshot_id:           "" => "<computed>"
      ebs_block_device.2659407853.volume_size:           "" => "30"
      ebs_block_device.2659407853.volume_type:           "" => "gp2"
      ephemeral_block_device.#:                          "" => "<computed>"
      instance_state:                                    "" => "<computed>"
      instance_type:                                     "" => "t2.micro"
      ipv6_addresses.#:                                  "" => "<computed>"
      key_name:                                          "" => "test_key_pair"
      network_interface.#:                               "" => "<computed>"
      network_interface_id:                              "" => "<computed>"
      placement_group:                                   "" => "<computed>"
      primary_network_interface_id:                      "" => "<computed>"
      private_dns:                                       "" => "<computed>"
      private_ip:                                        "" => "<computed>"
      public_dns:                                        "" => "<computed>"
      public_ip:                                         "" => "<computed>"
      root_block_device.#:                               "" => "<computed>"
      security_groups.#:                                 "" => "<computed>"
      source_dest_check:                                 "" => "true"
      subnet_id:                                         "" => "subnet-1a18da53"
      tags.%:                                            "" => "1"
      tags.Name:                                         "" => "test-vpc"
      tenancy:                                           "" => "<computed>"
      vpc_security_group_ids.#:                          "" => "1"
      vpc_security_group_ids.2953584881:                 "" => "sg-86e993e0"
    aws_instance.test_rikkey: Still creating... (10s elapsed)
    aws_instance.test_rikkey: Still creating... (20s elapsed)
    aws_instance.test_rikkey: Creation complete (ID: i-00eb71e709f8b1f25)
    aws_eip.eip_for_test_rikkey: Creating...
      allocation_id:     "" => "<computed>"
      association_id:    "" => "<computed>"
      domain:            "" => "<computed>"
      instance:          "" => "i-00eb71e709f8b1f25"
      network_interface: "" => "<computed>"
      private_ip:        "" => "<computed>"
      public_ip:         "" => "<computed>"
      vpc:               "" => "true"
    aws_eip.eip_for_test_rikkey: Creation complete (ID: eipalloc-8abadcb0)
    
    Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
    
    The state of your infrastructure has been saved to the path
    below. This state is required to modify and destroy your
    infrastructure, so keep it safe. To inspect the complete state
    use the `terraform show` command.
    
    State path:
    

    좋아 보인다.

    완성 된 결과를 확인하십시오.


  • VPC
  • 라우팅 테이블
  • 서브넷
  • 등이 예상대로 설정되었습니다



  • EC2 인스턴스
  • VPC가 예상대로 지정되었습니다
  • 보안 그룹도 설정되었습니다
  • key pair 이름도 지정됩니다
  • Elastic IP도 구성 가능
  • 보안 그룹의 ingress (인바운드)와 egress (아웃 바운드)도 설정할 수 있습니다.






  • 다음 번 예고



    점점 terraform의 기법이나 규칙도 익숙해 왔기 때문에,
    일반적인 web서버의 구성이나, S3/SQS등의 서비스도 terraform로 만들어 갑니다.

    좋은 웹페이지 즐겨찾기