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 にディストリビューションを追加してみた!

1
Last updated at Posted at 2026-03-30

はじめに

前回 Amazon Lightsail(以降:Lightsail)に WordPress をインストールし負荷テストを実施しましたが、キャッシュを利用することで負荷テストの結果にどのぐらい違いが出るのか Lightsail のディストリビューションを追加し比較してみました。
※2026年3月時点の情報を元に作成しています。

対象読者

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

おことわり

構成図や構成図の注意点は前回の記事をご参照ください。

ディストリビューションの月額料金

  • 50 GB 転送まで:2.5 USD (最初の 1 年間は無料)
  • 200 GB 転送まで:10 USD
  • 500 GB 転送まで:35 USD

別途 Lightsail の料金がかかります。

CDK を試してみました

事前準備

実行環境は前回のとおりです。

ステップ 5 の「CDK環境の初期化(ブートストラップ)」まで終わっていることを想定しています。

ブートストラップは、バージニア北部(us-east-1)でも行ってください。
※Lightsail の SSL/TLS 証明書やディストリビューションの管理 API がバージニア北部リージョンに集約されており、ディストリビューションは us-east-1 でのみデプロイを行えるためです。


ステップ1:CDK ファイル作成とデプロイ

1-1. 作業ディレクトリの作成

lightsail-cdn-wordpress というディレクトリを作成しています。
お好きな名前に変更してください。

> mkdir lightsail-cdn-wordpress && cd lightsail-cdn-wordpress
lightsail-cdn-wordpress>

1-2. CDK プロジェクトの作成

lightsail-cdn-wordpress> cdk init app --language=typescript
lightsail-cdn-wordpress> npm install dotenv --save

※成功すると lightsail-cdn-wordpress 内にいろいろファイルが作られます。


1-3. スタック(Stack)の修正

Lightsail と ディストリビューションは違うリージョンで作成する必要があるため、2ファイルに分割しています。

lightsail-cdn-wordpress/lib/lightsail-cdn-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 LightsailCdnWordPressStackProps extends cdk.StackProps {
  /**
   * インスタンス名
   */
  lightsailInstanceName: string;
  /**
   * インスタンスのスペック(BundleId)
   */
  lightsailBundleId: string;
  /**
   * WordPressのバージョン
   */
  lightsailBlueprintId: string;
  /**
   * 自動スナップショットの時間 (UTC, HH:00) (オプション)
   */
  lightsailAutoSnapshotTime?: string;
}

export class LightsailCdnWordPressStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: LightsailCdnWordPressStackProps) {
    super(scope, id, props);

    if (!props) {
      throw new Error('LightsailCdnWordPressStackProps 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, 'LightsailInstanceNameOutput', {
      value: wpInstance.instanceName,
      description: 'Lightsailのインスタンス名',
      exportName: `${id}-InstanceName`,
    });
    new cdk.CfnOutput(this, 'LightsailStaticIpAddressOutput', {
      value: staticIp.attrIpAddress,
      description: 'Lightsailのスタティック IP アドレス',
      exportName: `${id}-StaticIpAddress`,
    });
  }
}
lightsail-cdn-wordpress/lib/lightsail-cdn-distribution-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lightsail from 'aws-cdk-lib/aws-lightsail';

export interface LightsailCdnDistributionStackProps extends cdk.StackProps {
  lightsailInstanceName: string;
  lightsailDistributionBundleId?: string;
  lightsailInstanceRegion?: string;
}

export class LightsailCdnDistributionStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: LightsailCdnDistributionStackProps) {
    super(scope, id, props);

    const distributionBundleId = props.lightsailDistributionBundleId || 'small_1_0';
    const lightsailInstanceRegion = props.lightsailInstanceRegion || 'us-east-1';

    // インスタンス名を直接使用
    const instanceName = props.lightsailInstanceName;

    // 4. Lightsail ディストリビューションの作成
    const distributionName = `${instanceName}-cdn`;
    const cdnDistribution = new lightsail.CfnDistribution(this, 'WordPressCdnDistribution', {
      distributionName: distributionName,
      bundleId: distributionBundleId,
      origin: {
        name: instanceName,
        // 本番環境を構築する場合は「https-only」に変更してご利用ください。
        protocolPolicy: 'http-only',
        // オリジンインスタンスのリージョンを明示的に指定
        regionName: lightsailInstanceRegion, // Lightsailインスタンスがデプロイされているリージョン
      },
      defaultCacheBehavior: {
        behavior: 'cache',
      },
      cacheBehaviors: [
        {
          path: '/wp-admin/*',
          behavior: 'dont-cache',
        },
        {
          path: '/wp-login.php',
          behavior: 'dont-cache',
        },
      ],
      isEnabled: true,
    });

    // 出力
    new cdk.CfnOutput(this, 'LightsailDistributionName', {
      value: cdnDistribution.distributionName,
      description: 'Lightsailのディストリビューション名',
      exportName: `${id}-DistributionName`,
    });
  }
}

1-4. アプリ(App)

lightsail-cdn-wordpress/bin/lightsail-cdn-wordpress.ts
import * as cdk from 'aws-cdk-lib';
import { LightsailCdnWordPressStack } from '../lib/lightsail-cdn-wordpress-stack';
import { LightsailCdnDistributionStack } from '../lib/lightsail-cdn-distribution-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 lightsailDistributionBundleId = process.env.LIGHTSAIL_DISTRIBUTION_BUNDLE_ID;
const cdkDefaultAccount = process.env.CDK_DEFAULT_ACCOUNT;
const cdkDefaultRegion = process.env.CDK_DEFAULT_REGION;

// 必須の環境変数のチェック
if (!lightsailInstanceName || !lightsailBundleId || !lightsailBlueprintId) {
  throw new Error(
    '以下の環境変数が.envファイルに設定されていません: LIGHTSAIL_INSTANCE_NAME, LIGHTSAIL_BUNDLE_ID, LIGHTSAIL_BLUEPRINT_ID'
  );
}

// Lightsail インスタンスを 環境変数指定のリージョン にデプロイ
const instanceStack = new LightsailCdnWordPressStack(app, 'LightsailCdnWordPressStack', {
  env: { region: cdkDefaultRegion },
  // 環境変数から設定値を読み込む
  lightsailInstanceName: lightsailInstanceName,
  lightsailBundleId: lightsailBundleId,
  lightsailBlueprintId: lightsailBlueprintId,
  lightsailAutoSnapshotTime: lightsailAutoSnapshotTime,
});

// Lightsail ディストリビューションを us-east-1 (バージニア北部) にデプロイ
new LightsailCdnDistributionStack(app, 'LightsailCdnDistributionStack', {
  env: { region: 'us-east-1' },
  lightsailInstanceName: lightsailInstanceName,
  lightsailDistributionBundleId: lightsailDistributionBundleId,
  lightsailInstanceRegion: cdkDefaultRegion,
});

app.synth();

1-5. 環境変数

lightsail-cdn-wordpress/.env
# AWS Configuration
CDK_DEFAULT_ACCOUNT=
CDK_DEFAULT_REGION=

# Lightsail Configuration
LIGHTSAIL_INSTANCE_NAME=WordpressCdnInstance

# 指定できる値は下記コマンドよりご確認ください。
# 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

# Lightsail ディストリビューションの bundleId
LIGHTSAIL_DISTRIBUTION_BUNDLE_ID=small_1_0

環境に合わせて変更してください。
SSH の接続は WordPress の管理者パスワード確認時に利用します。

1-6. デプロイ

lightsail-cdn-wordpress> cdk deploy LightsailCdnWordPressStack LightsailCdnDistributionStack

時間がかかりますので気長に待ちましょう!


ステップ2:WordPress へのアクセス方法

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

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

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

  4. Networking をクリック
    Networking

  5. ディストリビューション名(例「WordpressCdnInstance-cdn」)をクリック
    ディストリビューション名

  6. Default domain をコピー
    Default domain

  7. Default domain の URL をブラウザに入力すると、WordPress の初期画面が表示されました!
    WordPress の初期画面


負荷テスト

Lightsail と WordPress の前提条件

  • LB(Load balancing) は有効にしていません。
  • WordPress は初期インストール状態のままです。プラグインも設定していません。
  • 負荷テストは Apache 標準の Apache Bench (ab) コマンドを使用します。

本番環境で負荷テストは行わないでください。

負荷テストの不合格判定基準やシナリオなどは前回と一緒です。


負荷テスト結果

インスタンス ウォームアップ (c=1) フェーズ 1 (c=5) フェーズ 2 (c=10) フェーズ 3 (c=20) フェーズ 4 (c=50) フェーズ 5 (c=100)
nano_3_0 ○ (0.033s) × (0.085s) × (0.171s)
micro_3_0 ○ (0.033s) ○ (0.086s) × (0.854s)
small_3_0 ○ (0.034s) ○ (0.089s) ○ (0.181s)
medium_3_0 ○ (0.033s) ○ (0.083s) ○ (0.168s)
large_3_0 ○ (0.036s) ○ (0.089s) ○ (0.183s)

○: 基準をクリア(合格)、×: 基準を超過(不合格、括弧内は応答時間)

CPU(vCPU): 2 までの結果です。
本記事に基づき作成した環境での参考値です。
開発する際は、作った環境で改めて確認してみてください。


前回との比較

  1. 全インスタンスで応答時間が劇的に短縮 → システム全体の最適化が成功
  2. medium_3_0 と large_3_0 が完全合格 → 本番環境への昇格可能
  3. スケーラビリティの確認 → c=100 でも安定した結果

推奨判定

インスタンス 前回評価 今回評価 推奨用途 本番導入
nano_3_0 🔴 不可 🟠 条件付き テスト環境のみ ❌ 非推奨
micro_3_0 🟠 要検討 🟡 可(要監視) 低負荷専用 ⚠️ 限定的
small_3_0 🟡 限定的 🟢 推奨 中負荷サイト ✅ 可能
medium_3_0 🟡 限定的 🟢 推奨 中~高負荷 最適
large_3_0 🟡 限定的 🟢 推奨 高負荷・スパイク対応 推奨

後始末

  1. 以下のコマンドを実行します。
lightsail-cdn-wordpress> cdk destroy --all

us-east-1 で作成するディストリビューションの削除で時間がかかりエラーとなります。

  1. CloudFormation(us-east-1 リージョン)の LightsailCdnDistributionStack が DELETE_FAILED で異常終了しています。
  2. LightsailCdnDistributionStack 脇のラジオボタンを選択し、右上の「削除を再試行」をクリックします。
    削除を再試行
  3. ポップアップが表示されますので「このスタック全体を強制削除」を選択し「スタックを削除」をクリックします。
    ![このスタック全体を強制削除](https://storage.googleapis.com/zenn-user-upload/329c3f1faaae-20260324.png =300x)
  4. AWSマネジメントコンソールを再読み込みし、該当スタックが削除されていることを確認します。
  5. 改めて以下のコマンドを実行します。
lightsail-cdn-wordpress> cdk destroy --all
  1. 削除されました!

まとめ

今回は CDK で Lightsail にディストリビューションを設定し負荷テストを試してみました。
ディストリビューションを導入しキャッシュを有効にすることでかなり速度が改善することが分かりました。
かなり格安で WordPress を導入できるんじゃないかと思います。

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

参考サイト

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?