リモート開発メインのソフトウェア開発企業のエンジニアブログです

Terraform で Amazon Lightsail 上に WordPress インスタンスを立てる

とあるプロジェクトで WordPress インスタンスの作成を依頼されました。最初は Bitnami の AMI を使って EC2 上に構築しようかと思っていたのですが、別のプロジェクトで Amazon Lightsail を使っていたのを見て、Lightsail を使ってみることにしました。

概要

対象

今回の記事は、主に、以下のような人を対象とします。

  • Amazon Lightsail がどんなものなのか何となく知っている
  • Terraform を使った事がある

やりたいこと

  • Lightsail を使って WordPress のインスタンスを作成
    • ホスト名は wordpress.example.com
    • SSL を有効化する
    • 管理者ユーザーの情報を、実際の利用者に渡す
      • プラグイン・テーマの設定・インストールはその人が行う
  • 作業は Terraform で自動化する
    • 一部、手作業が発生する事は許容する

具体的にやったこと

作業概要

今回は、以下のような作業を行いました。

  • Terraform にて
    • Lightsail 上で WordPress のインスタンスを生成
      • 秘密鍵は新規作成
      • 固定 IP を設定
    • Route 53 で、ホスト名を設定
  • AWS Management Console から、ブラウザで Lightsail インスタンスに SSH 接続し、コマンドラインから以下を実行
    • Let’s Encrypt を使用して SSL 化
    • Bitnami ロゴを非表示に変更

Terraform のファイル

まずは、Terreform の設定ファイルを記載し、のちほど解説します。

# provider.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.8.0"
    }

    tls = {
      source  = "hashicorp/tls"
      version = "~> 2.0.0"
    }

    local = {
      source  = "hashicorp/local"
      version = "~> 1.4"
    }
  }

  backend "s3" {
    region  = "ap-northeast-1"
    encrypt = true

    bucket = "example-terraform"
    key    = "wordpress/terraform.tfstate"
  }
  required_version = ">= 0.13"
}

# Configure the AWS Provider
provider "aws" {
  region = "ap-northeast-1"
}
# lightsail.tf
resource "aws_lightsail_key_pair" "wordpress" {
  name = "wordpress_key"
}

resource "aws_lightsail_instance" "wordpress" {
  name              = "wordpress"
  availability_zone = "ap-northeast-1a"
  blueprint_id      = "wordpress"
  bundle_id         = "micro_2_0"
  key_pair_name     = aws_lightsail_key_pair.wordpress.name
}

resource "aws_lightsail_static_ip" "wordpress" {
  name = "wordpress_ip"
}

resource "aws_lightsail_static_ip_attachment" "wordpress" {
  static_ip_name = aws_lightsail_static_ip.wordpress.id
  instance_name  = aws_lightsail_instance.wordpress.id
}
# Route53のホストゾーンは手動で(or 別プロジェクトの Terraform で)作成済み
data "aws_route53_zone" "root" {
  name = "example.com."
}

resource "aws_route53_record" "a_record_wordpress" {
  type    = "A"
  zone_id = data.aws_route53_zone.root.id
  name    = "wordpress"
  ttl     = "300"
  records = [aws_lightsail_static_ip.wordpress.ip_address]
}

インスタンス構築後、実行したコマンド

インスタンス構築後、AWS Management Console 経由でインスタンスに SSH 接続し、以下のコマンドを実行します。

# Let's Encrypt を使用する
sudo /opt/bitnami/bncert-tool

# 画面右下の Bitnami アイコンを非表示にする
sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1 && sudo /opt/bitnami/ctlscript.sh restart apache

# WordPress 管理者ユーザーの情報を表示
cat ~/bitnami_credentials

詳細は、以下のドキュメントを参考にして下さい。

Moba Pro

解説・補足説明

Terraform では、全ての Lightsail の設定が出来るわけでは無い

2021年6月11日現在、Terraform には以下の Lightsail 関連のリソースがあります。

今回、ドメイン名、ホスト名の設定は aws_lightsail_domain ではなく Route 53 を使用しました。

理由としては、aws_lightsail_domain ではドメイン名は作成出来ますが、DNS レコードの設定は出来ないからです。2017年末に立てられた以下の issue が実装が提案されています。

Add AWS Lightsail DNS Entry Support · Issue #2731 · hashicorp/terraform-provider-aws

Lightsail のような比較的マイナーなサービスだと、Terraform で出来ない機能というのは結構あるので、まぁ仕方ないかなと思います。

DNS レコードの設定以外ですと、ロードバランシングの設定も多分 Terraform からは出来ません。

鍵ペアを作成したが、使う事はあまりない

Lightsail の場合、ログインに使用する鍵ペアは

  • デフォルトのものを使用する
  • 新規で作成する
  • 既存の SSH 公開鍵をインポートする

という選択肢があります。以下がドキュメントです。

SSH and connecting to your Lightsail instance | Lightsail Documentation

日本語だと、以下のページで分かりやすく解説してありました。

Amazon Lightsailは3種類のSSH鍵を利用できます | DevelopersIO

今回は、上の lightsail.tf を見て頂くと分かる通り、新規で SSH 鍵を作成しました。(ちなみに、EC2 の場合 aws_key_pair では鍵ペアの新規作成はできません。)

ただ、鍵ペアを作成したものの、AWS Management Console からブラウザ上でインスタンスに SSH 接続でき、その際には鍵ペアは必要ありませんので、WordPress インスタンスの場合、鍵ペアを使う事はほとんど無いと思います。

作成した鍵ペアの確認方法

ちなみに、Terraform で Lightsail 鍵ペアを作成して、それを使いたい場合は、以下のような記述を追加すると、terraform apply の後で鍵ペアが表示されます。

# outputs.tf
output "wordpress_private_key" {
  value = aws_lightsail_key_pair.wordpress.private_key
}

なぜこんなことが出来るかというと、Terraform で作成されたリソースの情報は state ファイルに書き込まれているからです。

詳しくは、以前書いた以下の記事を参照して下さい。

Terraform で秘密情報を扱う – もばらぶエンジニアブログ

Terraform + Lightsail の長所・短所・使いどころ

EC2 に比べて圧倒的に簡単

最初に書いた通り、当初は WordPress の AMI を使って EC2 インスタンスを立てようと思っていました。この方法ですと、

  • VPC 及び、ネットワーク構成要素
    • サブネット
    • インターネットゲートウェイ(IGW)
    • セキュリティグループ
    • ルーティングテーブル
  • EC2 インスタンス
    • 鍵ペア
    • 固定 IP
    • セキュリティグループ
  • Route 53 で DNS レコード

といったリソースを作成する必要があります。

それに対して Lightsail の場合、上で見た通り

  • Lightsail インスタンス
    • 鍵ペア
    • 固定 IP
  • Route 53 で DNS レコード

を作成するだけで済みます。EC2 に比べて圧倒的に簡単なのが分かるかと思います。

複雑なことをやる場合は、Terraform ではなく CLI で

DNS レコードの設定など、現状では Terraform で出来ない Lightsail 関連の操作がいくつかあります。Lightsail で少し複雑なことをやる場合(※)は、CLI を使う必要があります。

※: 複雑なことをやる場合は、そもそも「Lightsail を使うべきか」、というところから検討する必要があるかもしれません。

まとめ

今回のユースケースのように、WordPress インスタンスを簡単に立てるだけであれば、EC2 ではなく Lightsail を使った方が簡単です。また、Terraform を使うと作業の自動化ができるため、手動で Lightsail インスタンスを立てるよりもさらに簡単になります。

一方、Terraform では Lightsail 関連の全ての操作ができるわけではありませんので、場合によっては CLI で直接操作する必要が出てきます。また、Lightsail 自体の性質上、サーバー・インフラの細かな部分まで手を入れることは出来ませんので、そうした場合には Lightsail ではなく EC2 や ECS など、他のサービスを使う必要があります。

← 前の投稿

aws-vault を使って AWS IAM のクレデンシャルを安全に管理する

次の投稿 →

Spark 2.x で null を含む JSON を書き出す方法

コメントを残す