AWS Lightsail を Terraform で構築

AWS

このブログを今まで さくらのVPS で運用しておりましたが、AWSのLightsail へ移行することにしました。

まずはインスタンスの作成を Terraform で行いましたので、記事にしたいと思います。

はじめに

以前の記事で、ドメインキングからAWS Route53へ移管しました。この記事の続きとなりますが、今回はVPSを AWS Lightsail へ移行するために、Terraform を使用してインスタンスを構築することを目的とします。

AWS Lightsail とは、月額 3.50 USD から使用できるAWSのVPSです。定額で利用出来るため安心して利用することが出来ます。

Lightsail 料金など (https://aws.amazon.com/jp/lightsail/pricing/)

Amazon Linux 2、Ubuntu、Debian等のOSを実行したり、WordPress、LAMP、Nginx等の事前に設定されたアプリケーションをインスタンスを作成してすぐに利用したりすることが出来ます。

後に Docker を使用して WordPress を動作させようと思っていますので、5 USD のインスタンスでDebianを実行させようと思います。

Terraform 実行環境

Terraformの実行環境としてDockerを使用します。DockerイメージはHashiCorp社が提供している、 hashicorp/terraform を使用します。実際にはdocker-composeを使用してterraformコマンドを実行します。

ディレクトリ構成

以下のファイル、ディレクトリを作成します。

├── docker-compose.yml  # コンテナ情報を記載
├── .env                # AWSのアクセスキー・シークレット等を記載
└── terraform           # Terraform関係ファイルを格納するディレクトリ

docker-compose.yml

Terraform関係のファイルを terraform ディレクトリへ格納し、コンテナへボリュームマウントを行っており、このディレクトリをワーキングディレクトリに設定しています。

version: '3'

services:
  terraform:
    image: hashicorp/terraform:light
    volumes:
      - ${PWD}/terraform:/terraform
    working_dir: "/terraform"
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_REGION

.env

docker-compose.yml の environment で定義している、AWSのアクセスキー、シークレット、リージョンの情報を記載します。

AWS_ACCESS_KEY_ID=XXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXX
AWS_REGION=ap-northeast-1

.env ファイルは docker-compose がデフォルトで読み込む環境変数をしておくことが出来るファイルです。コード全体をプライベートリポジトリで管理し、.env ファイルをGitの管理から除外するようにしています。

Terraformファイルの作成

ファイルの追加

ファイルを3つ追加します。

├── docker-compose.yml
├── .env
└── terraform
    ├── id_rsa.pub      # 公開鍵
    ├── main.tf         # Terraformのメイン設定ファイル
    └── lightsail.tf    # Lightsailの設定ファイル

id_rsa.pub

作成したインスタンスへ設定する公開鍵ですので、鍵ペアを作成して配置して下さい。~/.ssh/authorized_keys へ書き込まれます。

main.tf

.tfstate ファイルを S3バケット へ保存する設定と、プロバイダを明示的にAWSと指定しています。.tfstate用のS3バケットはAWSコンソールより手動で作成したものを指定しています。

terraform {
  required_version = ">= 0.11.0"
  backend "s3" {
    bucket = "XXXXXXXXXXXXXX"
    region = "ap-northeast-1"
    key = "terraform.tfstate"
    encrypt = true
  }
}

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

lightsail.tf

以下の内容を lightsail.tf へ記述して下さい。

# 既存の公開鍵をインポート
resource "aws_lightsail_key_pair" "flan_key_pair" {
  name       = "flan_key_pair"
  public_key = file("./id_rsa.pub")
}

# インスタンスを作成(vps01)
resource "aws_lightsail_instance" "vps01" {
  name              = "vps01"
  availability_zone = "ap-northeast-1a"
  blueprint_id      = "debian_10"
  bundle_id         = "micro_2_0"
  key_pair_name     = "flan_key_pair"
}

# 静的グローバルIPアドレスを割り当てる
resource "aws_lightsail_static_ip" "vps01_static_ip" {
  name = "vps01_static_ip"
}

# vps01インスタンスへ静的グローバルIPアドレスをアタッチする
resource "aws_lightsail_static_ip_attachment" "zeus_attach" {
  static_ip_name = aws_lightsail_static_ip.vps01_static_ip.id
  instance_name  = aws_lightsail_instance.vps01.id
}

# vps01インスタンスへ適用するファイアウォールルールを定義
resource "aws_lightsail_instance_public_ports" "vps01_fw" {
  instance_name = aws_lightsail_instance.vps01.name

  # SSH接続を XXX.XXX.XXX.XXX/32 からのみ許可
  port_info {
    protocol  = "tcp"
    from_port = 22
    to_port   = 22
    cidrs = ["XXX.XXX.XXX.XXX/32"]
  }

  # HTTPアクセスを全て許可
  port_info {
    protocol  = "tcp"
    from_port = 80
    to_port   = 80
  }

  # HTTPSアクセスを全て許可
  port_info {
    protocol  = "tcp"
    from_port = 443
    to_port   = 443
  }
}
avaiability_zone
  • 設定出来るアベイラビリティゾーンについてはコチラのドキュメントを参照して下さい。
  • 東京リージョンの場合は ap-northeast-1{a,c,d} が設定出来ます。
blueprint_id
  • サーバイメージのIDを設定します。
  • 以下のコマンドを実行し、対象の blueprintId を設定して下さい。
    • aws lightsail get-blueprints --output json
bundle_id
  • インスタンスサイズを設定します。
  • 設定出来るbundle_idはコチラのドキュメントを参照して下さい。

Terraformの実行

作業ディレクトリの初期化

作業ディレクトリの初期化をし、必要なプラグインなどをダウンロードします。

$ docker-compose run terraform init

コンフィグの確認

リソースの変更予定箇所を確認します。

$ docker-compose run terraform plan

設定の適用

terraform plan で問題が無ければ、実際に設定を適用します。

$ docker-compose run terraform apply

インスタンスの確認

AWSのWebコンソールより、Lightsailの管理画面へ移動するとインスタンスが作成されていることが分かります。

インスタンスが作成されたことの確認

SSH接続

admin ユーザで対象のインスタンスへログインすることが出来ます。

$ ssh -i [秘密鍵のパス] admin@[対象サーバのIPアドレス]

ログイン後、必要に応じてユーザの作成や必要なソフトウェアのインストールを行って下さい。

おわりに

今回の記事では Terraform を使用して AWS Lightsail のインスタンスを作成しました。

次回は作成したインスタンス上で Docker を使用して WordPress の環境を構築したいと思います。

※ ちなみにこの記事公開時点で、当ブログは AWS Lightsail上で動作しています。

コメント

タイトルとURLをコピーしました