【Lightsail入門】ドメインなしでnginx + HTTPS環境を作ってみる

こんにちは、関根です。

AWSのサインイン画面、右側に出るポップなバナーを押したことはありますか。普段は素通りしてしまいますが、ある日押してみたら Amazon Lightsail のコンソールが出てきました。

検証用サーバが欲しいだけなのに、EC2はVPCやセキュリティグループなど考えることが多くて腰が重い……という方も多いはず。Lightsailはそんな「もっと手軽にサーバを持ちたい」ニーズに応えるサービスです。

今回はドメインを取らずIPアドレスだけでHTTPS通信を試すため、Lightsail上にnginxを構築してドメインなしのHTTPS環境を作ってみました。

「Let’s EncryptはIPアドレスに証明書を発行してくれない」と思うかもしれませんが、実は最近ベータでIPアドレス証明書が提供され始めていますので、それを活用したいと思います。

Lightsailとは

AWSのサインイン画面の右側には、こんなバナーが表示されていることがあります。

AWSサインイン画面の右側に表示されるAmazon Lightsailのバナー

押してみると、専用のコンソールに移動します。普段のAWSマネジメントコンソールとは雰囲気が違う、シンプルで親しみやすい画面が出てきます。

Amazon Lightsailコンソールのトップ画面
Amazon Lightsailは、仮想サーバ・ストレージ・データベースなどをまとめて、シンプルな料金体系と管理画面で使えるようにしたサービスです。EC2をベースにしていますが、利用者が意識する範囲を大きく減らしているのが特徴です。

EC2との主な違いをまとめると、以下のようになります。

  Amazon Lightsail Amazon EC2
料金体系 月額固定(インスタンス代・データ転送込み) 従量課金(EC2・EBS・データ転送などが個別課金)
ネットワーク設定 VPCやサブネットの意識がほぼ不要 VPC・サブネット・ルートテーブル等を自分で設計
ファイアウォール インスタンスにポート開放のUIが直付け セキュリティグループを別途作成・アタッチ
静的IP 無料で1つアタッチ可能 Elastic IPとして別途作成(一部条件で課金)
拡張性・カスタマイズ性 低め(シンプルさとのトレードオフ) 高い(インスタンスタイプ・ストレージ等を柔軟に選択)
向いている用途 検証・個人開発・小規模サイト 本番運用・大規模システム・高度な要件

要するに「AWSの知識をあまり使わずに、とりあえずサーバを1台動かしたい」というときに向いているのがLightsailです。今回のような検証用途にはうってつけなので、このままLightsailでインスタンスを作っていきます。

今回のゴール

  • Lightsailインスタンス上にnginxを構築する
  • Let’s EncryptのIPアドレス証明書でHTTPS化する
  • https://<パブリックIP>/ にアクセスしてnginxのウェルカムページが表示されることを確認する

設定手順

Lightsailインスタンスの作成

Lightsailコンソールから「インスタンスの作成」を選択すると、以下の画面が表示されます。

Lightsailインスタンス作成画面のプラットフォーム選択(リナックスアプリ/Linuxオペレーティングシステム/Windows)

プラットフォームは大きく3種類から選べます。

  • リナックスアプリ:WordPressやNode.jsなど、Linux上にアプリケーションがあらかじめセットアップされた状態で使える
  • Linuxオペレーティングシステム:OSのみのまっさらな状態から構築する
  • Microsoft Windows:Windowsサーバー

今回はnginxを自分で構築したいので、「Linuxオペレーティングシステム」を選択します。

また、画面上部の「インスタンスの場所」からはリージョンとアベイラビリティーゾーン(AZ)も指定できます。

Lightsailインスタンスのリージョン・アベイラビリティーゾーン選択画面
今回はリージョンを東京(ap-northeast-1)、ゾーンをAのままとしました。

「Linuxオペレーティングシステム」を選択すると、設計図(ディストリビューション)を選べます。今回は Amazon Linux 2023 を使用します。

Lightsailインスタンスの設計図(ディストリビューション)選択画面、Amazon Linux 2023を選択

次にインスタンスプランを選択します。Lightsailは月額固定料金制で、最小プランは月5ドルから利用できます。プランごとの詳細な仕様(メモリ・vCPU・ストレージ・データ転送量)は公式サイトの料金ページを参照してください。

Lightsailインスタンスプランの選択画面、月額7ドルのプランを選択

今回は検証用途として少し余裕を持たせ、月額7ドルのプラン(1GBメモリ/2仮想CPU/40GB SSD/2TB転送)を選びました。

最後にインスタンス名とキーペア(SSHで接続する際に使う鍵)を指定します。

Lightsailインスタンス名とSSHキーペアの設定画面
インスタンス名は同一リージョン内で一意である必要があります。今回は hello-lightsail としました。SSHキーは既存のキーペアを選ぶか、「カスタムキーを作成」から新規に作成できます。特にこだわりがなければデフォルトのキーペアのままでも問題ありません。

入力できたら「インスタンスの作成」ボタンを押します。数分待つとインスタンスが起動します。

ここで作成したキーペアの情報は、あとから画面右上のアカウントメニューでも確認できます。

Lightsail画面右上のアカウントメニュー
「アカウント」を開き、「SSH キー」タブを選択すると、作成済みのキーペア一覧が確認できます。

アカウント画面のSSHキータブ、カスタムキーとデフォルトキーの一覧
インスタンス作成時に指定したキー(今回の hello-lightsail-key)が「カスタムキー」欄に、リージョンごとのデフォルトキーが「デフォルトキー」欄に表示されます。ここから秘密鍵のダウンロードも可能です。SSH接続時に使う秘密鍵が見当たらなくなった場合は、まずこの画面を確認するとよいでしょう。

数分待つと、インスタンスが起動します。こんなに簡単にサーバが用意できてしまいます。

Lightsailインスタンス詳細画面、ステータスが実行中
「接続」タブの「SSHを使用して接続」を押すと、ブラウザ上のターミナルからそのままSSH接続できます。手元にSSHクライアントを用意しなくてもすぐに操作できるのは便利です(ただし日本語を含む出力は文字化けすることがあります)。

ブラウザ経由のSSHターミナル画面
また、「ネットワーキング」タブのファイアウォールルールでは、許可するアプリケーション・ポートに加えて送信元IPアドレスも指定できます。必要に応じて接続元IPを絞り込むことで、公開範囲を制限することも可能です。
さらに、パブリックIPv4アドレスは、1つまでは無償で利用できますので「静的IPをアタッチする」で固定化することができます。

Lightsailファイアウォールルール編集画面、送信元IPアドレスの指定

今回は検証のため動的IPのまま進めます。

ファイアウォール(ネットワーキング)設定

インスタンスの「ネットワーキング」タブで、以下のポートが開いていることを確認します。

アプリケーション プロトコル ポート
SSH TCP 22
HTTP TCP 80
HTTPS TCP 443

SSHとHTTPはデフォルトで開いていますが、HTTPSは手動でルールを追加する必要があります。「ファイアウォールルール」の「+ ルールを追加」を押すと、画面右側にルール編集パネルが開きます。

ファイアウォールにHTTPSルールを追加するパネル
「アプリケーション」で HTTPS を選択すると、プロトコル(TCP)とポート(443)が自動的に入力されます。「送信元IPアドレス」は、プリセットから「任意の場所のIPv4」(0.0.0.0/0)を選ぶとどこからでもアクセス可能になります。接続元を絞りたい場合は、プリセットを「カスタム」に切り替えて、許可したいIPアドレスやCIDR範囲を指定してください。設定できたら「ルールを追加」を押して保存します。

nginxのインストール

先ほどのブラウザターミナル(または手元のSSHクライアント)でインスタンスに接続し、nginxをインストールします。今回のOSはAmazon Linux 2023なので、パッケージ管理は dnf を使います。

sudo dnf -y install nginx

インストールできたらバージョンを確認しておきます。

nginx -v
nginx version: nginx/1.30.1

続いてnginxを起動し、ステータスを確認します。

sudo systemctl start nginx
sudo systemctl status nginx

最後に、OS再起動時にもnginxが自動起動するように設定しておきます。

sudo systemctl enable nginx
sudo systemctl is-enabled nginx

enabledと表示されれば、自動起動の設定は完了です。

この時点で http://<your public ip> のようにパブリックIPへHTTPでアクセスすると、nginxのウェルカムページが表示されます。

HTTPでパブリックIPにアクセスした際のnginxウェルカムページ
パブリックIPは、インスタンス詳細画面の「パブリック IPv4 アドレス」欄で確認できます。

インスタンス詳細画面のパブリックIPv4アドレス欄

Let’s Encryptで証明書を取得する(IPアドレス証明書)

冒頭で「Let’s EncryptはIPアドレスには証明書を発行してくれない」と書きましたが、実はLet’s Encryptは2025年から、有効期間の短い「IPアドレス証明書」をベータ提供しています。ドメインなしでも、正規のSSL証明書をIPアドレス宛てに発行できるようになりました。せっかくなので、自己署名証明書ではなくこちらを使ってみます。

ただし、この機能はまだ安定版のcertbotパッケージには取り込まれていません。dnfやpipで入るcertbotには --ip-address オプションが存在せず、GitHubのソースから直接ビルドする必要があります。

certbotをソースからビルドする

まずビルドに必要なパッケージを入れます。

sudo dnf install -y git python3.12 python3.12-devel augeas-devel gcc

certbotのリポジトリを取得し、付属のスクリプトで仮想環境を作成します。

git clone https://github.com/certbot/certbot
cd certbot
python3.12 tools/venv.py

これで certbot/venv/bin/certbot が使えるようになります。

証明書の取得

証明書の取得にはポート80での検証(HTTP-01チャレンジ)を使うため、一時的にnginxを停止しておきます。

sudo systemctl stop nginx

証明書を取得します。パブリックIPは curl で自動取得し、--preferred-profile shortlived でIPアドレス証明書向けの短期プロファイルを指定します。また、証明書の保存先ディレクトリ名がIPアドレスそのものになってしまうと、IPが変わるたびにnginxの設定も書き換える必要が出てしまうため、--cert-name でわかりやすい固定名を指定しておきます。

SSL証明書はPublic IPアドレスに対して発行されます。Public IPアドレスが変更された場合は、SSL証明書を再発行する必要があります。
sudo ./venv/bin/certbot certonly --ip-address $(curl -s https://checkip.amazonaws.com) --preferred-profile shortlived --cert-name hello-lightsail

実行すると、検証方法を選択するメニューが表示されます。今回はローカルに一時的なHTTPサーバーを立てて検証する「standalone」の「15」を選びます(番号は環境によって変わる可能性があります)。

15: Runs an HTTP server locally which serves the necessary validation files
under the /.well-known/acme-challenge/ request path. Suitable if there is no
HTTP server already running. HTTP challenge only (wildcards not supported).
(standalone)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-16] then [enter] (press 'c' to cancel): 15

メールアドレスの入力を求められますが、今回は検証用途なので未入力のままEnterでスキップし、利用規約への同意を y で入力します。

Enter email address or hit Enter to skip.
 (Enter 'c' to cancel):

Please read the Terms of Service at:
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf
You must agree in order to register with the ACME server. Do you agree?
(Y)es/(N)o: y

成功すると、証明書の保存先が表示されます。

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/hello-lightsail/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/hello-lightsail/privkey.pem
This certificate expires on 2026-02-16.
These files will be updated when the certificate renews.

--cert-nameで指定した名前のおかげで、保存先が /etc/letsencrypt/live/hello-lightsail/ というわかりやすいパスになりました。IPアドレスをそのままディレクトリ名にしてしまうと、IPが変わるたびにnginxの設定ファイルも書き換える必要が出てきてしまうので、この一手間は入れておくのがおすすめです。

IPアドレス証明書は有効期間が数日程度と短いため、自動更新の設定が前提になります(後述)。

証明書が取得できたら、nginxを起動し直しておきます。

sudo systemctl start nginx

nginxのSSL設定

取得した証明書を使うよう、nginxの設定ファイルを編集します。Amazon Linux 2023のnginxは、/etc/nginx/nginx.conf/etc/nginx/conf.d/*.conf を読み込む構成になっています。デフォルト設定を直接いじるのではなく、conf.d配下に新しい設定ファイルを作成します。

sudo vi /etc/nginx/conf.d/ssl.conf

以下の内容を記述します。

server {
    listen       443 ssl;
    listen       [::]:443 ssl;
    http2        on;
    server_name  _;
    root         /usr/share/nginx/html;

    ssl_certificate     "/etc/letsencrypt/live/hello-lightsail/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/hello-lightsail/privkey.pem";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;

    location / {
        try_files $uri $uri/ =404;
    }
}

IPアドレス証明書はホスト名を持たないため、server_nameはどのホスト名にもマッチする _ としています。

また、/etc/nginx/nginx.conf にもポート80を待ち受けるデフォルトのserverブロックが元から存在します。これをHTTPS化に合わせてHTTPSへのリダイレクト用に書き換えます。

sudo vi /etc/nginx/nginx.conf

httpブロック内にあるデフォルトのserver { listen 80; ... }ブロックを見つけ、中身を以下のように置き換えます。

server {
    listen 80;
    listen [::]:80;

    server_name _;

    # Redirect HTTP access to HTTPS
    return 301 https://$host$request_uri;
}

設定ファイルの文法チェックをしてから反映します。

sudo nginx -t
sudo systemctl reload nginx

nginx: configuration file /etc/nginx/nginx.conf test is successful と表示されればOKです。

証明書の自動更新

IPアドレス証明書は有効期間が数日程度と短いため、更新をcronなどで自動化しておく必要があります。更新自体はcertbot renewで行えます。ただしstandaloneプラグインはポート80を一時的に使うため、nginx稼働中に実行するとポートが競合してしまい、そのあたりはnginx側の調整が必要になります。本書では割愛します。

動作確認

ブラウザで https://<パブリックIP>/ にアクセスします。正規のSSL証明書なので、自己署名証明書のときのような警告は表示されず、そのままnginxのウェルカムページが表示されます。アドレスバーの鍵アイコンから証明書の詳細を確認すると、有効期間や発行元の情報が表示され、HTTPS接続が正常に確立していることがわかります。

ブラウザの証明書ビューア、発行元がLet's Encryptと表示されている
発行元(O)に Let's Encryptと表示されていれば成功です。有効期間もご覧の通り1週間程度と短く、IPアドレス証明書らしい特徴が見て取れます。

また、http://<パブリックIP>/ にアクセスした場合は、設定した通り https://<パブリックIP>/ へリダイレクトされることも確認しておきましょう。

コマンドラインから確認する場合は、curlでそのままアクセスしてみます。正規の証明書なので、自己署名証明書のときのような -k オプションは不要です。

curl -I https://<パブリックIP>/

HTTP/1.1 200 OK が返ってくればOKです。

まとめ

Lightsailインスタンスにnginxをインストールし、IPアドレス宛てにLet’s EncryptのIPアドレス証明書でSSL設定する手順を紹介しました。

Lightsailは、EC2ほど細かい構成を意識せずにサーバを立ち上げられる一方、必要になればnginxやSSL設定まで通常のLinuxサーバとして扱えます。今回のようにドメインを用意せずHTTPSまで構成できれば、検証環境やPoC、ちょっとしたWebアプリの公開基盤として、かなり使い勝手のよい選択肢になります。

証明書の有効期間が数日と短い分、自動更新の仕組みは別途必要になりますが、そこさえ整えてしまえば手軽さと正規のHTTPSを両立できる、なかなか面白い構成です。自動更新まわりの工夫はまた別の機会に紹介できればと思います。

参考資料

著者について
関根 学

SCSKのERPパッケージであるPROACTIVEの企画・開発を担当
会計・AI・データを組み合わせたソリューションの構築に取り組む

2025-2026 Japan All AWS Certifications Engineer
税理士有資格者など保有

関根 学をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSクラウド
シェアする
×
タイトルとURLをコピーしました