とあるプロジェクトで 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 の設定ファイルを記載し、のちほど解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # 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" } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 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 } |
1 2 3 4 5 6 7 8 9 10 11 12 | # 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 接続し、以下のコマンドを実行します。
1 2 3 4 5 6 7 8 | # 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
の後で鍵ペアが表示されます。
1 2 3 4 | # 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 など、他のサービスを使う必要があります。