こんにちは、関根です。
AWSのサインイン画面、右側に出るポップなバナーを押したことはありますか。普段は素通りしてしまいますが、ある日押してみたら Amazon Lightsail のコンソールが出てきました。
検証用サーバが欲しいだけなのに、EC2はVPCやセキュリティグループなど考えることが多くて腰が重い……という方も多いはず。Lightsailはそんな「もっと手軽にサーバを持ちたい」ニーズに応えるサービスです。
今回はドメインを取らずIPアドレスだけでHTTPS通信を試すため、Lightsail上にnginxを構築してドメインなしのHTTPS環境を作ってみました。
「Let’s EncryptはIPアドレスに証明書を発行してくれない」と思うかもしれませんが、実は最近ベータでIPアドレス証明書が提供され始めていますので、それを活用したいと思います。
Lightsailとは
AWSのサインイン画面の右側には、こんなバナーが表示されていることがあります。

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

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コンソールから「インスタンスの作成」を選択すると、以下の画面が表示されます。

プラットフォームは大きく3種類から選べます。
- リナックスアプリ:WordPressやNode.jsなど、Linux上にアプリケーションがあらかじめセットアップされた状態で使える
- Linuxオペレーティングシステム:OSのみのまっさらな状態から構築する
- Microsoft Windows:Windowsサーバー
今回はnginxを自分で構築したいので、「Linuxオペレーティングシステム」を選択します。
また、画面上部の「インスタンスの場所」からはリージョンとアベイラビリティーゾーン(AZ)も指定できます。

今回はリージョンを東京(ap-northeast-1)、ゾーンをAのままとしました。
「Linuxオペレーティングシステム」を選択すると、設計図(ディストリビューション)を選べます。今回は Amazon Linux 2023 を使用します。

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

今回は検証用途として少し余裕を持たせ、月額7ドルのプラン(1GBメモリ/2仮想CPU/40GB SSD/2TB転送)を選びました。
最後にインスタンス名とキーペア(SSHで接続する際に使う鍵)を指定します。

インスタンス名は同一リージョン内で一意である必要があります。今回は hello-lightsail としました。SSHキーは既存のキーペアを選ぶか、「カスタムキーを作成」から新規に作成できます。特にこだわりがなければデフォルトのキーペアのままでも問題ありません。
入力できたら「インスタンスの作成」ボタンを押します。数分待つとインスタンスが起動します。
ここで作成したキーペアの情報は、あとから画面右上のアカウントメニューでも確認できます。

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

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

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

また、「ネットワーキング」タブのファイアウォールルールでは、許可するアプリケーション・ポートに加えて送信元IPアドレスも指定できます。必要に応じて接続元IPを絞り込むことで、公開範囲を制限することも可能です。
さらに、パブリックIPv4アドレスは、1つまでは無償で利用できますので「静的IPをアタッチする」で固定化することができます。
ファイアウォール(ネットワーキング)設定
インスタンスの「ネットワーキング」タブで、以下のポートが開いていることを確認します。
| アプリケーション | プロトコル | ポート |
|---|---|---|
| SSH | TCP | 22 |
| HTTP | TCP | 80 |
| HTTPS | TCP | 443 |
SSHとHTTPはデフォルトで開いていますが、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のウェルカムページが表示されます。

パブリックIPは、インスタンス詳細画面の「パブリック 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 でわかりやすい固定名を指定しておきます。
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接続が正常に確立していることがわかります。

発行元(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を両立できる、なかなか面白い構成です。自動更新まわりの工夫はまた別の機会に紹介できればと思います。

