1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CDK で Amazon Lightsail + WordPress を試してみた!

1
Last updated at Posted at 2026-03-10

はじめに

AWS CDK で WordPress 案件をお手軽に始めたいと思い、Amazon Lightsail(以降:Lightsail)を試してみました。
また、Lightsail のスペックや月額料金、負荷テスト結果も調べてみました。
※2026年3月時点の情報を元に作成しています。

対象読者

  • AWS CDK を試してみたい方
  • WordPress を手軽に始めてみたい方
  • Lightsail のスペックや月額料金を知りたい方

構成図

Lightsail と WordPress の構成図

構成図の説明と注意

  • 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
  • 内訳:
    • Lightsail1: 12.00 USD (月間750時間使用の場合)
    • StaticIP2: 0.00 USD
    • スナップショット3: 3.00 USD / 月 (0.05 * 60GB)
    • データ転送量4: 3 TB (送信)

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)の修正

lightsail-wordpress/lib/lightsail-wordpress-stack.ts
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)

lightsail-wordpress/bin/lightsail-wordpress.ts
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. 環境変数

lightsail-wordpress/.env
# 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 ログインパスワードの確認

  1. AWSマネジメントコンソールにログイン

  2. Lightsail サービスにアクセス
    Lightsail サービス

  3. 「Instances」から作成したインスタンス名(例「WordpressInstance」)をクリック
    Instances

  4. Default WordPress admin password の Retrieve default password をクリック
    Retrieve default password

  5. CloudShell を起動
    CloudShell

  6. Step 2 をコピー
    Copy and paste this command into the CloudShell window:

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

  8. WordPress の管理者パスワードが表示されました。
    WordPress の管理者パスワード

パスワードは漏えいさせないよう適切に管理してください。


2-2. WordPress へのログイン

  1. Access WordPress Admin をクリック
    Access WordPress Admin

  2. Access the WP-Admin Dashboard の Public IP address より、WordPress の管理 URL をクリック
    Public IP address

  3. WordPress の管理画面が別タブで表示されます。
    WordPress の管理画面

  4. 下記ログイン情報を入力し WordPress にログインできるかご確認ください。

Username or Email Address:user
Password:上記 8. WordPress の管理者パスワード情報
  1. 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/

ab コマンドは SSH で実行してください。
SSH は下図赤枠をクリックすると起動します。
SSH 起動


負荷テスト結果

インスタンス ウォームアップ (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 までの結果です。
本記事に基づき作成した環境での参考値です。
開発する際は、作った環境で改めて確認してみてください。


負荷テストの総評

  1. スループット(RPS)の飽和
    全てのインスタンスで、1秒間に処理できるリクエスト数(RPS)が 約20〜28 req/sec で頭打ちになっています。
    これは、インスタンスのプラン(メモリ量)を上げても、WordPressの動的生成処理(PHP + MySQL)がボトルネックとなり、動的ページの生成速度自体は劇的には向上しないことを示しています。

  2. メモリによる「粘り」の差
    プランが上がる(nano → large)につれて、高負荷時(同時50〜100)の応答時間の悪化が緩やかになっています。
    nano: 同時20で既に2.2秒を超えNG判定。
    medium/large: 同時50まで2.0秒以内を維持し合格。
    これは、メモリ量が多いほど、多くのリクエストをキュー(待ち行列)に保持でき、プロセスがクラッシュ(Failed requests)することなく処理を継続できるためです。

  3. 全テストにおいて Failed requests: 0 であったことは、Bitnami WordPressの安定性が非常に高いことを証明しています。


結論と改善案

現在の「動的処理のみ」の設定では、最上位の large_3_0 でも同時接続 100 は NG という結果になりました。
もし同時接続 100 以上を快適に捌きたい場合は、インスタンスをさらに上げるよりも 「静的キャッシュ(WP Super Cache等)」の導入 が圧倒的に効果的です。キャッシュを導入すれば、nano インスタンスでも同時接続 100 を ○(合格)にできる可能性があります。

まとめ

今回は CDK で Lightsail + WordPress を試してみました。
負荷テストでは自分なりの参考値が整理できたのでよかったです!
次回はキャッシュやサーバー構成を変えて負荷テストの結果がどのように変化するのか試してみます。

この記事が、誰かのお役に立てば幸いです。

参考サイト

  1. Lightsailのインスタンスによる

  2. インスタンスにアタッチされている間は無料

  3. 自動スナップショットは最新1つのみ保持される設定(手動スナップショットは含まず)

  4. データ転送量: 月 3 TB まで無料、超過分は追加料金

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?