Lightsailってどんなサービス？　～AWS100本ノック～ 5/100

# はじめに

そこまで多くの人が使うサービスではないのかもしれませんが、業務でLightsailを使う機会があったので紹介します。
Lightsailは一言で言うと、`導入が簡単かつ低価格でVPS(仮想プライベートサーバー)を構築できる`ツールかなと思います。

# Lightsailのメリット
Lightsailのメリットを紹介します。

## 1. 導入が簡単

まず、非常に簡単にWebアプリケーションの基盤を作れるというメリットがあります。
例えば、WordPress環境をAWSで構築したいとなったら以下のようなAWSリソースの作成や作業をすることになると思います。

- ドメインの取得
  - Route53もしくはドメインサービスで取得
- ネットワーク作業
  - VPCやサブネットの作成
- 仮想サーバ作業
  - EC2インスタンスの作成
  - PHPやWebサーバ(Nginx、Apacheなど)のインストールや設定
  - WordPressのインストール
- 負荷分散対応
  - ALBの作成
- HTTPS用の証明書取得
  - ACMで取得
- データ保存用のDB作成
  - RDSでDBを作成
- メディア保存用のストレージ作成
  - S3バケットを作成

AWS構築経験が豊富な人には難しくない作業かもしれませんが、AWS初学者やとりあえずWordPress作りたい、って人にはなかなか敷居が高いように思えます。

そこで、Lightsailの出番です。

なんと、上記の作業をLightsail画面のみで行えるのです :smile: 

![サービス統合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/16bd5a91-106b-6da9-b3bb-178dd0c7ad57.png)



各AWSリソースのコンソールで作業する必要もないですし、設定項目も必要最低限のものだけで非常に少なくなっています。

また、Wordpressなどの一部ケースにおいては、必要なソフトのインストールもしてくれます！

:::note info
Lightsailの管理機能には以下が含まれています
- インスタンスの管理
   - アプリ + OS：WordPress、LAMP、Node.js、GitLab、Redmineなど
   - OSのみ：AmazonLinux2023、Ubuntu、Debian、CentOSなど
- コンテナの管理
  - DokerHubなどのパブリックレジストリにあるイメージからコンテナを作成
- データベースの管理
  - MySQL or PostgreSQLの作成
- ネットワーキングの管理
  - ElasticIP(静的IPアドレス)の作成
  - CDNの作成
  - ロードバランサーの作成
- ストレージの管理
  - S3の作成
  - ブロックストレージの作成
- DNSの管理
  - DNSゾーンの管理
  - ドメインの管理
- スナップショット
  - 手動
  - 自動 
- エクスポート機能
  - スナップショットから作成するLightsailからEC2に移行するた目の機能
:::

## 2. 低価格

次に、価格面でのメリットです。

ここでいう低価格とは、
- 導入が簡単に行えることによる`人的リソース`のコスト
- `AWSリソース`のコスト
の2つになります。

まず人的リソースのコストという部分ですが、1.で紹介した導入のメリットにより、人の工数の削減と、多くのAWSサービスを深く知らなくても出来るナレッジ工数の削減が見込めます。

次にAWSリソースのコストという部分ですが、従量料金制のEC2などと違い、Lightsailは月額固定料金になっています。
また、下の写真はWordpress構築を選択した際の料金プランになるのですが、この料金にはインスタンスの料金以外に以下なども含まれます。

- Elasitc IP
- DNS管理
- SSHアクセスするためのターミナル機能
- サーバーのモニタリング
- SSDストレージ
- データ転送量

![料金.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/b21bade9-c052-1782-09e0-bfbf98da13b1.png)

料金について、詳しく知りたい方は[公式サイト](https://aws.amazon.com/jp/lightsail/pricing/)をご確認ください。


# EC2との違い

よく比較されるEC2との比較は以下になります。
- 同じ仮想サーバー
- 簡単でシンプル。何十個も設定項目があるEC2と比べて、設定項目が少ない
- OSとアプリケーションが事前設定済み。WordPressやWebサーバが事前にインストール・設定されている
- 柔軟性は低い。設定できる項目が少ないので、細かい設定や制御をしたい場合には向いていない

# WordPressを作ってみる

では、試しにWordPress環境を作ってみようと思います。
今回は、以下の最小構成で作りたいと思います。

- WordPressインスタンスの作成
- 静的IPをアタッチ
- カスタムドメインの設定
- HTTPS化
  - HTTPアクセスしたら、HTTPSにリダイレクト

![Lightsail-最小構成.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/4eeedd39-029f-f060-b208-dc13c0989975.png)


## WordPressインスタンスの作成
まずは、インスタンスを作ります。

左メニューの`インスタンス`を選択し、`インスタンスの作成`をクリックします。
![1-インスタンスの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/abcf7855-2643-616f-cc4d-9653074e2eea.png)

次に、
- `リージョン`で東京リージョンを選択
- `インスタンスイメージ`でLinux/Unixを選択
- `設計図の選択`でWordPressを選択
します
![2-インスタンスイメージの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/7802375c-86e0-211f-7266-2a0bcfabe15b.png)

:::note info
他にも、LAMP・Node.js・GitLab・Redmineなどが選択できます
:::

次に、`インスタンスプラン`を選択します。
※今回は`24$`のものを選びましたが、いったん作る程度なら一番安い`5$`でいいと思います

![3-インスタンスプランの選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/259f2fb9-9729-db0c-75ce-73c7d7a741f1.png)

:::note info
今回は設定しませんでしたが、以下も設定できます。
- 起動スクリプト：インスタンスの初回起動時に、インスタンスで実行するシェルスクリプト
- SSHキーペアの変更：デフォルトキー以外でインスタンスにSSH接続する場合のキー作成
:::


任意のインスタンス名を入力して、最後に`インスタンスの作成`をクリックします。

![4-インスタンス作成完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/58a7197b-01e7-510f-4aa5-4b1594d715d7.png)


作成されると、`保留中`のインスタンスが表示され、1分くらい待つと`実行中`になります。

![5-インスタンス保留中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/10ac91e7-8e06-59bd-fcdf-c369648ea4b1.png)

![6-インスタンス実行中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/0625644d-f714-38c2-eb4a-a798c6895b34.png)


## 静的IPをアタッチ
インスタンスを作成すると`パブリックIP`が割り当てられますが、これはインスタンスを停止すると変わってしまいます。
なので、固定のIP(静的IP)をアタッチします。

`管理`をクリックし、`ネットワーキング`タブの`静的IPをアタッチする`をクリックします。

![7-管理画面へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/c72d18f6-a4ec-7d58-7d7d-f2a93fab1c26.png)


![8-静的IPをアタッチする.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/6408a07e-8e31-b3ba-2c1e-739e17e005bc.png)


モーダルが開くので、`任意の名前`を入力し、`作成およびアタッチ`をクリックします。
すると、静的IPがアタッチされます。

![9-静的IPをアタッチする完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/be44c309-a15f-6f52-7170-630fd42fb07f.png)

![10-静的IPをアタッチする完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/a2ed4a8e-cc6f-d77a-473a-b672d79a894e.png)

ここで、一度アクセスしてみましょう。
HTTPで静的IPにアクセスすると、WordPressのサンプルページが表示されます。
![11-アクセスしてみる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/53d0e033-8725-a145-bc2a-698f76e6130e.png)

## カスタムドメインの設定
実際にサービス展開するとなったら、自社のドメインなどにすることになると思います。
なので、ドメインとIPを紐づけてみましょう。

今回は、Lightsailで取得したドメインではなく、別で取得したドメインとLightsailインスタンスを紐づける形で行います。

`ドメインとDNS`をクリックし、`DNSゾーンの作成`をクリックします。

そうすると、作成画面が表示されるので
- `別のレジストラからドメインを使用`を選択
- 任意のドメインを入力し、`DNSゾーンの作成`をクリックするとDNSゾーンが作成されます。


![12-DNSゾーンの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/71739126-f04b-cfce-45cb-a13efcd671e4.png)

![13-DNSゾーンの作成完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/00879de9-1fe5-4cb3-5457-e25a6a7abccc.png)

NSレコードが4つ表示されるので、これらをドメインを管理しているサービスに登録します。
![14-NSレコードの確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/01af370a-e826-e6d5-f458-b84caa981ac8.png)

ドメインとDNSゾーンは紐づきましたが、Lightsailインスタンスとはまだ紐づいていません。
なので、`割り当て`をクリックし、先ほど作成した静的IPを選択して割り当てます。

これで紐づきが完了したので、設定したドメインでアクセスしてみましょう。

![15-割り当て.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/1d75f7e3-df1f-cf1f-840b-cb9f468ed690.png)

:::note info
アクセスできない場合は、ドメインの浸透がまだ終わっていないので気長に待ちましょう :cry: 
:::


## HTTPS化

まだ、HTTPでしかアクセスできないので、最後にHTTPS化をしましょう。
AWSで証明書といえばACMがありますが、Ligntsailでは`bncert`を使って`Let's encrypt認証局`に証明書をリクエストを行うことでSSL/TLS 証明書を取得・設定できます

まず、ターミナルにアクセスしましょう
`接続`タブで`SSHを使用して接続`をクリックすると別ウィンドウが開き、Lightsailインスタンスにssh接続できます
![16-ssh接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/f018ad79-bab5-cdc2-93da-99a41de29869.png)

次に、bncertツールを実行します。
```bash
bitnami@ip-xx-xx-xx-xx:~$ sudo /opt/bitnami/bncert-tool
----------------------------------------------------------------------------
Welcome to the Bitnami HTTPS Configuration tool.

----------------------------------------------------------------------------
Domains

Please provide a valid space-separated list of domains for which you wish to 
configure your web server.
```


`Domain list []: `：登録するドメインを入力します
`The following domains were not included: www.xxxxx.jp. Do you want to add them? [Y/n]:` wwwを含むか聞かれています。今回は`n`を選択します
`Enable HTTP to HTTPS redirection [Y/n]:`：HTTPアクセスされた際に、HTTPSにリダイレクトするか聞かれます。`Y`を選択します
```
Domain list []: xxxxx.jp

The following domains were not included: www.xxxxx.jp. Do you want to add them? [Y/n]: n

Warning: No www domains (e.g. www.example.com) or non-www domains (e.g. 
www.example.com) have been provided, so the following redirections will be 
disabled: non-www to www, www to non-www.
Press [Enter] to continue:
----------------------------------------------------------------------------
Enable/disable redirections

Please select the redirections you wish to enable or disable on your Bitnami 
installation.



Enable HTTP to HTTPS redirection [Y/n]: Y
```

同意してほしい内容が表示されるので、`Y`を入力します。
```
----------------------------------------------------------------------------
Changes to perform

The following changes will be performed to your Bitnami installation:

1. Stop web server
2. Configure web server to use a free Let's Encrypt certificate for the domains: 
xxxxx.jp
3. Configure a cron job to automatically renew the certificate each month
4. Configure web server name to: xxxxx.jp
5. Enable HTTP to HTTPS redirection (example: redirect 
http://xxxxx.jp to https://xxxxx.jp)
6. Start web server once all changes have been performed


Do you agree to these changes? [Y/n]: 
```

質問の内容をGoogle翻訳すると以下についての同意を求めています
```
1. ウェブサーバーを停止する
2. ドメインに無料のLet's Encrypt証明書を使用するようにウェブサーバーを設定する： 
xxxxx.jp
3. 毎月自動的に証明書を更新するようにcronジョブを設定します。
4. ウェブサーバー名を xxxxx.jp
5. HTTPからHTTPSへのリダイレクトを有効にする。
http://xxxxx.jp から https://xxxxx.jp)
6. すべての変更が完了したら、ウェブサーバーを起動します。
```

`E-mail address []:`連絡先のメールアドレスを聞かれているので、担当者のメールアドレスを入力します
`Do you agree to the Let's Encrypt Subscriber Agreement? [Y/n]:`最後に同意を求められるので`Y`を入力します


しばらく待って`Success`と出たら無事作成完了です
```
----------------------------------------------------------------------------
Create a free HTTPS certificate with Let's Encrypt

Please provide a valid e-mail address for which to associate your Let's Encrypt 
certificate.

Domain list: xxxxx.jp

Server name: xxxxx.jp

E-mail address []: xxx.example.com

The Let's Encrypt Subscriber Agreement can be found at:

https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf

Do you agree to the Let's Encrypt Subscriber Agreement? [Y/n]: Y
```

```
----------------------------------------------------------------------------
Performing changes to your installation

The Bitnami HTTPS Configuration Tool will perform any necessary actions to your 
Bitnami installation. This may take some time, please be patient.

----------------------------------------------------------------------------
Success

The Bitnami HTTPS Configuration Tool succeeded in modifying your installation.

The configuration report is shown below.

Backup files:
* /opt/bitnami/apache/conf/httpd.conf.back.202409060055
* /opt/bitnami/apache/conf/bitnami/bitnami.conf.back.202409060055
* /opt/bitnami/apache/conf/bitnami/bitnami-ssl.conf.back.202409060055
* /opt/bitnami/apache/conf/vhosts/wordpress-https-vhost.conf.back.202409060055
* /opt/bitnami/apache/conf/vhosts/wordpress-vhost.conf.back.202409060055

Find more details in the log file:

/tmp/bncert-202409060055.log

If you find any issues, please check Bitnami Support forums at:

https://github.com/bitnami/vms

Press [Enter] to continue:

```

さぁ、HTTPSでアクセスしてみましょう。
無事にアクセスできましたね :smile: 

![17-https接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/865a1602-3820-16ad-329e-b1fbf3bad55e.png)


:::note info
bncertでは証明書の有効期限が切れる前、 80日ごとに証明書の自動更新を実行します
:::

## 構成を変える場合

今回は最小構成にしましたが、実際は負荷に応じてインスタンスをスケールする構成を取る場合があります。
その場合の構成図も載せておきます。
※こちらの[公式サイト](https://aws.amazon.com/jp/blogs/compute/deploying-a-highly-available-wordpress-site-on-amazon-lightsail-part-4-increasing-performance-and-scalability-with-a-lightsail-load-balancer/
)を参考にしました

以下、簡単な説明です。
- インスタンスを`複数`作成し、負荷分散のために`ロードバランサー`を配置
- インスタンスの`スナップショットを毎日自動`で取得
- メディファイル(画像や動画)は`S3`に保存し、取得は`CDN経由`にしてキャッシュすることでパフォーマンスの改善
- WordPressのデータは`PostgreSQL`に保存

![Lightsail-最大構成.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/e01a41e4-0686-cf98-1494-031c1acde59b.png)


::: note info
構成図で、Lightsail xxxとなっているのは、`Lightsailサービスに内包されている`という意味になります。
よって、Lightsailで作成したS3バケットなどのAWSリソースは、各コンソール画面には出てきません :thinking: 
:::

# WordPressのその他設定など
本筋とは少し離れますが、WordPress関連ついて少しだけ追加で説明します

## WordPressの管理画面にアクセスしたい
`https://${ドメイン}/wp-admin`でアクセスできます。

ログインのユーザ名とパスワードは、
- ユーザ名：`user`(デフォルトユーザ)
- パスワード：インスタンス内で`cat bitnami_application_password`を実行すると確認できます

:::note alert
ログイン画面があるとはいえ、管理画面はエンドユーザには表示できないほうが良いので`IP制限`などを検討してください
:::

## ファイアウォールの見直し

デフォルトだと、全てのIPアドレスからの22, 80, 443ポートのアクセスを許可しています。

これはあまりよくないので、
- sshは自社のIPだけにする
- 80と443アクセスは本番環境以外は自社のIPだけにする、Basic認証をかける
など絞るようにしましょう

## 管理画面のIP制限

管理画面のIP制限の設定方法を紹介します。
※全体的にIP制限する場合は、ファイアーウォールから設定してください

Apacheの設定ファイルを開き、以下を追加します
```bash
bitnami@ip-xx-xx-xx-xx:~$ sudo vim /opt/bitnami/apache/conf/httpd.conf

<FilesMatch "wp-login.php|wp-admin">
Order Allow,Deny
Allow from xx.xx.xx.xx　👈許可したいIP
</FilesMatch>
```

Apache設定ファイルの構文チェックを行います
```
bitnami@ip-xx-xx-xx-xx:~$ sudo apachectl configtest
Syntax OK
```

Apache設定ファイルの再読み込みを行い、許可したIP以外でアクセスすると、アクセスできないことが確認できます
```
bitnami@ip-xx-xx-xx-xx:~$ sudo apachectl graceful
```

## Basic認証をかける

WordPress全体にBasic認証をかけてみます
※[公式サイト](https://docs.bitnami.com/aws/infrastructure/lamp/administration/use-htpasswd/
)を参考にしました。

まず、Basic認証のユーザを作成します。
```bash
bitnami@ip-xx-xx-xx-xx:/opt/bitnami/wordpress$ sudo /opt/bitnami/apache/bin/htpasswd -cb /opt/bitnami/apache/wordpress_users ${ユーザ名} '${パスワード}'
Adding password for user ${ユーザ名}
```

次に、Apacheの設定ファイルを開き、以下を追加します。
```bash
bitnami@ip-xx-xx-xx-xx:/opt/bitnami/wordpress$ sudo vim   /opt/bitnami/apache/conf/vhosts/htaccess/wordpress-htaccess.conf

<Directory "/opt/bitnami/wordpress">
AuthType Basic
AuthName "Authentication required"
AuthUserFile "/opt/bitnami/apache/wordpress_users"
Require valid-user
</Directory>
```

Apache設定ファイルの構文チェックを行います
```
bitnami@ip-xx-xx-xx-xx:~$ sudo apachectl configtest
Syntax OK
```

Apache設定ファイルの再読み込みを行い、Basic認証がかかっていることが確認できます
```
bitnami@ip-xx-xx-xx-xx:~$ sudo apachectl graceful
```


# Lightsail for Research

Lightsailには、`Lightsail for Research`というサービスがあります。
これは研究者や学生がクラウド上で数回クリックするだけで高性能CPUやGPU研究用コンピューターを簡単に作成および管理できるようにするサービスらしいです。
今回は簡単な紹介に留めます :bow: 


# おわりに
今回はLightsailについて紹介しました。
なんとなくサービスは聞いたことがあるが、何が出来るかよくわからないって人の参考になれば幸いです:bow: