開発日報

窓際エンジニアの開発備忘。日報は嘘です。

【連載】terraform によるAWS環境構築入門 第1回 ~ terraformの基本操作とEC2 ~

はじめに

本連載でterraformを使用したAWS環境の構築を学んでいきます。
ECSを使用したコンテナオーケストレーションを用いてアプリケーションをAWS環境にデプロイします。
terraformtとは、、についてはここでは割愛します。

この記事ではterraformのインストール、基本的な使用方法を学び、
実際にawsにec2を立ててみます。
この記事で作成した成果物は最後に削除いたします。

連載記事一覧

本連載での使用技術

  • AWS
  • Docker
  • VPC
  • ECS(fargate)
  • ELB
  • IAM
  • Route53
  • RDS
  • ElastiCache
  • codexxx

1. インストール

テラフォームのインストール

$ brew install terraform

$ terraform --version
    Terraform v0.11.13

tfenv(テラフォームのバージョンマネージャー)のインストール

$ brew install tfenv

$ tfenv --version
    tfenv 0.6.0

tfenvへのテラフォームインストール。

「.terraform-version」にバージョンを記述すると、そのバージョンを自動的にインストールできます。

$ echo 0.12.0-beta1 > .terraform-version

$ tfenv install

クレデンシャルの付与。

AWSCLIを使用しても構いません。
なお、本連載では「AdministratorAccess」ポリシーをアタッチした IAM ユーザのアクセスキーを前提とします。

$ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyy
$ export AWS_DEFAULT_REGION=ap-northeast-1

2. terraformの基礎

では実際に手を動かしてみながらterraformの基礎を身につけましょう。

リソースの作成

適当なディレクトリに「main.tf」を作成しましょう。

$ mkdir example
$ cd example
$ touch main.tf

EC2インスタンスの定義

EC2 インスタンスのようなリソースは「resource」ブロックで定義します。

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_instance" "example" {
  ami           = "ami-0f9ae750e8274075b"
  instance_type = "t3.micro"
}

awsに反映

「terraform init」で初期化

$ terraform init
Initializing the backend...

「terraform plan」で実行計画の確認。
破壊的な変更・その他予期しない動作がないかよく確認しましょう。

$ terraform plan

    An execution plan has been generated and is shown below.
    Resource actions are indicated with the following symbols:
      + create

    Terraform will perform the following actions:
    
    # aws_instance.example will be created
    + resource "aws_instance" "example" {
      + ami
      + id
      + instance_type
      ......
    }

「terraform apply」で変更を実際のAWS環境に適用しましょう。

 $ terraform apply
    ......
    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
      Enter a value:

もし、以下のエラーが出たら、既存のAWS環境のDefaultVPCに任意のサブネットを作成してあげましょう。

Error: Error launching source instance: MissingInput: No subnets found for the default VPC 'vpc-312c7656'. Please specify a subnet.

反映が完了したか、実際にAWSの管理画面から確認してみましょう.
コードを変更後も「terraform plan」「terraform apply」で変更を適用できます。

変数・出力値

「variable」を使うと変数が定義できます。
「output」を使うと出力値が定義でき、apply時にターミナルで値を確認できます。

provider "aws" {
  region = "ap-northeast-1"
}

#「local」にすると上書きできなくなる。
variable "example_instance_type" {
  default = "t3.micro"
}

resource "aws_instance" "example" {
  ami           = "ami-0f9ae750e8274075b"
  instance_type = var.example_instance_type
}

output "example_instance_id" {
  value = aws_instance.example.id
}

「variable」で定義した変数は「-var」オプションで上書きできます。 「variable」の箇所を「local」にすると、上書きできなくなります。

$ terraform plan -var 'example_instance_type=t3.nano'

「terraform apply」するとoutputの値が確認できるかと思います。

$ terraform apply
    ......
    Outputs:
    example_instance_id = i-02bd77505ab68856f

条件分岐

Terraform では、三項演算子が使えます。

variable "env" {}

resource "aws_instance" "example" {
  ami           = "ami-0f9ae750e8274075b"
  instance_type = var.env == "prod" ? "m5.large" : "t3.micro"
}

env変数をTerraform実行時に切り替えるとplanの結果が変わります。

$ terraform plan -var 'env=prod'
$ terraform plan -var 'env=dev'

リソースの削除

ここまでで作成したリソースを削除しましょう。
今後の連載ではEC2は取り扱いません。

$ terraform destroy
    ......
      # aws_instance.example will be destroyed
      - resource "aws_instance" "example" {
          - ami                          = "ami-0f9ae750e8274075b" -> null
    Plan: 0 to add, 0 to change, 1 to destroy.

削除後実際にAWSの管理画面から確認してみましょう.