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 で、ホスト名を設定
- Lightsail 上で WordPress のインスタンスを生成
- 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
詳細は、以下のドキュメントを参考にして下さい。
- Amazon Lightsail の Bitnami スタックに SSL 証明書をインストールする
- Remove the Bitnami banner from “Certified by Bitnami” blueprint applications on Amazon Lightsail instances | Lightsail Documentation
- Getting the application user name and password for your ‘Certified by Bitnami’ instance in Amazon Lightsail | Lightsail Documentation
解説・補足説明
Terraform では、全ての Lightsail の設定が出来るわけでは無い
2021年6月11日現在、Terraform には以下の Lightsail 関連のリソースがあります。
- aws_lightsail_domain
- aws_lightsail_instance
- aws_lightsail_instance_public_ports
- aws_lightsail_key_pair
- aws_lightsail_static_ip
- aws_lightsail_static_ip_attachment
今回、ドメイン名、ホスト名の設定は 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 など、他のサービスを使う必要があります。
コメントを残す