はじめに
AWS CDK で WordPress 案件をお手軽に始めたいと思い、Amazon Lightsail(以降:Lightsail)を試してみました。
また、Lightsail のスペックや月額料金、負荷テスト結果も調べてみました。
※2026年3月時点の情報を元に作成しています。
対象読者
- AWS CDK を試してみたい方
- WordPress を手軽に始めてみたい方
- Lightsail のスペックや月額料金を知りたい方
構成図
構成図の説明と注意
- Lightsail 内で WordPress を起動しています。
- Lightsail には Static IP アドレスを割り当てています。
- Lightsail は自動スナップショットを日次で実行し、最新の1つのみが保持されます。
- ユーザー(Users)は HTTP または HTTPS で WordPress にアクセスします。
- SSH は Lightsail の管理コンソールから ブラウザSSH でアクセスします。
- Bitnami WordPress ブループリントの最新バージョンを使用し、プラグインはインストールしていません。
- その他に CDN などの設定は行っていません。
本構成の料金
AWS Lightsail インスタンス (bundleId: small_3_0) を利用した場合
- 月額料金: 15.00 USD
- 内訳:
Lightsail のスペックと料金
| インスタンス | CPU(vCPU) | ディスク(GB) | メモリ(GB) | 料金(USD) |
|---|---|---|---|---|
| nano_3_0 | 2 | 20 | 0.5 | 5.0 |
| micro_3_0 | 2 | 40 | 1.0 | 7.0 |
| small_3_0 | 2 | 60 | 2.0 | 12.0 |
| medium_3_0 | 2 | 80 | 4.0 | 24.0 |
| large_3_0 | 2 | 160 | 8.0 | 44.0 |
| xlarge_3_0 | 4 | 320 | 16.0 | 84.0 |
| 2xlarge_3_0 | 8 | 640 | 32.0 | 164.0 |
| 4xlarge_3_0 | 16 | 1280 | 64.0 | 384.0 |
| 8xlarge_3_0 | 32 | 1280 | 128.0 | 884.0 |
| 12xlarge_3_0 | 48 | 1280 | 192.0 | 1324.0 |
| 16xlarge_3_0 | 64 | 1280 | 256.0 | 1764.0 |
東京リージョン(ap-northeast-1)のパブリック IPv4 アドレスの月額料金です。
各サービスには無料枠がありますので料金の詳細は公式サイトよりご確認ください。
CDK を試してみました
事前準備
実行環境は前回のとおりです。
ステップ 5 の「CDK環境の初期化(ブートストラップ)」まで終わっていることを想定しています。
ステップ1:CDK ファイル作成とデプロイ
1-1. 作業ディレクトリの作成
lightsail-wordpress というディレクトリを作成しています。
お好きな名前に変更してください。
> mkdir lightsail-wordpress && cd lightsail-wordpress
lightsail-wordpress>
1-2. CDK プロジェクトの作成
lightsail-wordpress> cdk init app --language=typescript
lightsail-wordpress> npm install dotenv --save
※成功すると lightsail-wordpress 内にいろいろファイルが作られます。
1-3. スタック(Stack)の修正
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lightsail from 'aws-cdk-lib/aws-lightsail';
export interface LightsailWordPressStackProps extends cdk.StackProps {
/**
* インスタンス名
*/
lightsailInstanceName: string;
/**
* インスタンスのスペック(BundleId)
*/
lightsailBundleId: string;
/**
* WordPressのバージョン
*/
lightsailBlueprintId: string;
/**
* SSHアクセスを許可する特定のIPアドレス(CIDR形式) (オプション)
*/
sshAllowedIp?: string;
/**
* 自動スナップショットの時間 (UTC, HH:00) (オプション)
*/
lightsailAutoSnapshotTime?: string;
}
export class LightsailWordPressStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: LightsailWordPressStackProps) {
super(scope, id, props);
if (!props) {
throw new Error('LightsailWordPressStackProps must be provided');
}
const instanceName = props.lightsailInstanceName || 'WordPressInstance';
const bundleId = props.lightsailBundleId || 'small_3_0';
const bluePrintId = props.lightsailBlueprintId || 'wordpress';
const snapshotTime = props?.lightsailAutoSnapshotTime || '18:00';
// 1. ファイアウォールルールの定義
const firewallRules: lightsail.CfnInstance.PortProperty[] = [
{ fromPort: 80, toPort: 80, protocol: 'tcp', accessFrom: 'Anywhere (Internet)', accessType: 'public' },
{ fromPort: 443, toPort: 443, protocol: 'tcp', accessFrom: 'Anywhere (Internet)', accessType: 'public' },
{ fromPort: 22, toPort: 22, protocol: 'tcp', cidrListAliases: ['lightsail-connect', 'lightsail-setup-ipv4'], accessType: 'public' },
];
// 2. Lightsail インスタンスの作成
const wpInstance = new lightsail.CfnInstance(this, 'WordPressInstance', {
instanceName: instanceName,
blueprintId: bluePrintId,
bundleId: bundleId,
availabilityZone: this.availabilityZones[0],
networking: {
ports: firewallRules,
},
addOns: [
{
addOnType: 'AutoSnapshot',
autoSnapshotAddOnRequest: { snapshotTimeOfDay: snapshotTime },
},
],
});
// 3. Lightsail スタティック IP の作成
const staticIpName = `${instanceName}-static-ip`;
const staticIp = new lightsail.CfnStaticIp(this, 'WordPressStaticIp', {
staticIpName: staticIpName,
attachedTo: wpInstance.instanceName,
});
staticIp.addDependency(wpInstance);
// 出力
new cdk.CfnOutput(this, 'LightsailInstanceName', {
value: wpInstance.instanceName,
description: 'Lightsailのインスタンス名',
});
new cdk.CfnOutput(this, 'LightsailStaticIpAddress', {
value: staticIp.attrIpAddress,
description: 'Lightsailのスタティック IP アドレス',
});
new cdk.CfnOutput(this, 'LightsailSshAllowedFrom', {
value: props.sshAllowedIp ? props.sshAllowedIp : 'Anywhere (Internet)',
description: 'SSHを許可するCIDR (または Anywhere)',
});
}
}
1-4. アプリ(App)
import * as cdk from 'aws-cdk-lib';
import { LightsailWordPressStack } from '../lib/lightsail-wordpress-stack';
import * as dotenv from 'dotenv';
dotenv.config(); // .envファイルを読み込む
const app = new cdk.App();
const lightsailInstanceName = process.env.LIGHTSAIL_INSTANCE_NAME;
const lightsailBundleId = process.env.LIGHTSAIL_BUNDLE_ID;
const lightsailBlueprintId = process.env.LIGHTSAIL_BLUEPRINT_ID;
const lightsailAutoSnapshotTime = process.env.LIGHTSAIL_AUTO_SNAPSHOT_TIME;
const cdkDefaultAccount = process.env.CDK_DEFAULT_ACCOUNT;
const cdkDefaultRegion = process.env.CDK_DEFAULT_REGION || 'us-east-1';
// 必須の環境変数のチェック
if (!lightsailInstanceName || !lightsailBundleId || !lightsailBlueprintId) {
throw new Error(
'以下の環境変数が.envファイルに設定されていません: LIGHTSAIL_INSTANCE_NAME, LIGHTSAIL_BUNDLE_ID, LIGHTSAIL_BLUEPRINT_ID'
);
}
new LightsailWordPressStack(app, 'LightsailWordPressStack', {
// 環境変数から設定値を読み込む
lightsailInstanceName: lightsailInstanceName,
lightsailBundleId: lightsailBundleId,
lightsailBlueprintId: lightsailBlueprintId,
lightsailAutoSnapshotTime: lightsailAutoSnapshotTime,
env: {
account: cdkDefaultAccount || process.env.CDK_DEFAULT_ACCOUNT,
region: cdkDefaultRegion || process.env.CDK_DEFAULT_REGION,
},
});
app.synth();
1-5. 環境変数
# AWS Configuration
CDK_DEFAULT_ACCOUNT=
CDK_DEFAULT_REGION=
# Lightsail Configuration
LIGHTSAIL_INSTANCE_NAME=WordpressInstance
# 指定できる値は下記コマンドよりご確認ください。
# aws lightsail get-bundles --region ap-northeast-1 --query 'bundles[].{price:price,cpuCount:cpuCount,ramSizeInGb:ramSizeInGb,diskSizeInGb:diskSizeInGb,bundleId:bundleId,instanceType:instanceType,supportedPlatforms:supportedPlatforms[0]}' --output table
LIGHTSAIL_BUNDLE_ID=medium_3_0
# 指定できる値は下記コマンドよりご確認ください。
# aws lightsail get-blueprints --region ap-northeast-1 --query 'blueprints[].{blueprintId:blueprintId,name:name,group:group,productUrl:productUrl,platform:platform}' --output table
LIGHTSAIL_BLUEPRINT_ID=wordpress
# 自動スナップショットの時間 (HH:00 形式、UTC時間)
# 日本時間 (JST) 03:00 に実行したい場合は UTC 18:00
LIGHTSAIL_AUTO_SNAPSHOT_TIME=18:00
環境に合わせて変更してください。
SSH の接続は WordPress の管理者パスワード確認時に利用します。
1-6. デプロイ
lightsail-wordpress> cdk deploy
時間がかかりますので気長に待ちましょう!
ステップ2:WordPress へのアクセス方法
2-1. WordPress ログインパスワードの確認
-
AWSマネジメントコンソールにログイン
-
Default WordPress admin password の Retrieve default password をクリック

-
コピー内容をマネジメントコンソール下部に起動している CloudShell にコピペして実行
AWS のセキュリティ警告が表示されますが、この操作は安全なため「貼り付け」をクリック

パスワードは漏えいさせないよう適切に管理してください。
2-2. WordPress へのログイン
-
Access the WP-Admin Dashboard の Public IP address より、WordPress の管理 URL をクリック

-
下記ログイン情報を入力し WordPress にログインできるかご確認ください。
Username or Email Address:user
Password:上記 8. WordPress の管理者パスワード情報
- WordPress にログインできました!
あとは、適宜 WordPress のカスタマイズを行ってください。
負荷テスト
Lightsail と WordPress の前提条件
- CDN や LB(Load balancing) などのキャッシュや負荷分散は有効にしていません。
- WordPress は初期インストール状態のままです。プラグインも設定していません。
- 負荷テストは Apache 標準の Apache Bench (ab) コマンドを使用します。
本番環境で負荷テストは行わないでください。
負荷テスト結果の「NG(不合格)」基準
| 指標 | NG(不合格)の基準 | 理由・背景 |
|---|---|---|
| 応答時間 (Time per request) | 2.0秒 (2000ms) 以上 | ユーザーがストレスを感じ、サイトから離脱し始める限界値です。 |
| 失敗率 (Failed requests) | 1.0% 以上 | サーバーのリソース(メモリやプロセス)が完全に枯渇しているサインです。 |
| 待機時間 (Waiting / TTFB) | 1.0秒 (1000ms) 以上 | PHPやデータベースの処理が追いついておらず、バックエンドがボトルネックです。 |
負荷テストのシナリオ
| ステップ | 同時実行数 (-c) |
総リクエスト数 (-n) |
実行時間 (-t) |
目的 |
|---|---|---|---|---|
| ウォームアップ | 1 | 100 | 60秒 | キャッシュのウォームアップ、ベースライン性能の確認 |
| フェーズ 1 (低負荷) | 5 | 500 | 300秒 | 安定した状態での性能測定 |
| フェーズ 2 (中負荷) | 10 | 1000 | 300秒 | 応答時間の変化を観察 |
| フェーズ 3 (やや高負荷) | 20 | 2000 | 300秒 | リソース使用率の上昇を観察 |
| フェーズ 4 (高負荷) | 50 | 5000 | 300秒 | 性能劣化の兆候を検出 |
| フェーズ 5 (限界負荷) | 100 | 10000 | 300秒 | エラー発生、タイムアウトの確認、限界点の特定 |
# 負荷テストのコマンド(例:ウォームアップの場合)
ab -c 1 -n 100 -t 60 http://YOUR_LIGHTSAIL_IP/
負荷テスト結果
| インスタンス | ウォームアップ (c=1) | フェーズ 1 (c=5) | フェーズ 2 (c=10) | フェーズ 3 (c=20) | フェーズ 4 (c=50) | フェーズ 5 (c=100) |
|---|---|---|---|---|---|---|
| nano_3_0 | ○ | ○ | ○ | × (2.2s) | × (36.9s) | × (43.4s) |
| micro_3_0 | ○ | ○ | ○ | ○ (0.7s) | × (15.2s) | × (30.1s) |
| small_3_0 | ○ | ○ | ○ | ○ (0.7s) | × (6.5s) | × (15.7s) |
| medium_3_0 | ○ | ○ | ○ | ○ (0.7s) | ○ (1.7s) | × (3.5s) |
| large_3_0 | ○ | ○ | ○ | ○ (0.7s) | ○ (1.8s) | × (3.7s) |
○: 基準をクリア(合格)、×: 基準を超過(不合格、括弧内は応答時間)
CPU(vCPU): 2 までの結果です。
本記事に基づき作成した環境での参考値です。
開発する際は、作った環境で改めて確認してみてください。
負荷テストの総評
-
スループット(RPS)の飽和
全てのインスタンスで、1秒間に処理できるリクエスト数(RPS)が 約20〜28 req/sec で頭打ちになっています。
これは、インスタンスのプラン(メモリ量)を上げても、WordPressの動的生成処理(PHP + MySQL)がボトルネックとなり、動的ページの生成速度自体は劇的には向上しないことを示しています。 -
メモリによる「粘り」の差
プランが上がる(nano → large)につれて、高負荷時(同時50〜100)の応答時間の悪化が緩やかになっています。
nano: 同時20で既に2.2秒を超えNG判定。
medium/large: 同時50まで2.0秒以内を維持し合格。
これは、メモリ量が多いほど、多くのリクエストをキュー(待ち行列)に保持でき、プロセスがクラッシュ(Failed requests)することなく処理を継続できるためです。 -
全テストにおいて Failed requests: 0 であったことは、Bitnami WordPressの安定性が非常に高いことを証明しています。
結論と改善案
現在の「動的処理のみ」の設定では、最上位の large_3_0 でも同時接続 100 は NG という結果になりました。
もし同時接続 100 以上を快適に捌きたい場合は、インスタンスをさらに上げるよりも 「静的キャッシュ(WP Super Cache等)」の導入 が圧倒的に効果的です。キャッシュを導入すれば、nano インスタンスでも同時接続 100 を ○(合格)にできる可能性があります。
まとめ
今回は CDK で Lightsail + WordPress を試してみました。
負荷テストでは自分なりの参考値が整理できたのでよかったです!
次回はキャッシュやサーバー構成を変えて負荷テストの結果がどのように変化するのか試してみます。
この記事が、誰かのお役に立てば幸いです。
参考サイト
- AWS CLI のコマンドを使用して Lightsail インスタンスを管理する方法を教えてください。
- ab コマンド (ApacheBench) の自分的チートシート。
- Amazon Lightsail
- AWS クラウド開発キット (AWS CDK) v2








