Cron の外部実行とメール送信の追加 - Nextcloud 環境の構築を通じて AWS での環境構築を体験する⑥

**※(2020/3/8 修正) Nextcloud の設定変更における複数サーバー運用に対する考慮が不足している手順であったため修正を行いました。**

「Nextcloud 環境の構築を通じて AWS での環境構築を体験する」 の第 6 回となります。

「Nextcloud 環境の構築を通じて AWS での環境構築を体験する」 シリーズの記事は下記からどうぞ。

* 【第 1 回】[EC2 と RDS を利用した Nextcloud 環境の構築](https://qiita.com/S_Katz/items/756ca04ecece844ce503)
* 【第 2 回】[ElastiCache サービスの導入](https://qiita.com/S_Katz/items/280642e437c709052781)
* 【第 3 回】[EFS ファイルサーバーへの移行](https://qiita.com/S_Katz/items/5b5f37db29c3f800e610)
* 【第 4 回】[ALB を利用したサーバー負荷分散、可用性向上に向けた取り組み](https://qiita.com/S_Katz/items/edadf33755c0d834eb46)
* 【第 5 回】[分散した EC2 インスタンスのログの集約](https://qiita.com/S_Katz/items/2fa740c5051859963dae)
* 【第 6 回】[Cron の外部実行とメール送信の追加](https://qiita.com/S_Katz/items/35525eba5ff61801e7e3)
* 【第 7 回】[AutoScaling の導入](https://qiita.com/S_Katz/items/6c6d0a46e592eb783fda)

# はじめに
[前回記事](https://qiita.com/S_Katz/items/edadf33755c0d834eb46) で、分散させた EC2 インスタンスのログを CloudWatch Logs に集約させて管理しやすくしました。
今回は、前回までで EC2 の構成差分となっている Cron による Nextcloud バックグラウンド処理を EC2 外部から起動するように変更して、EC2 の構成差分の解消を図ります。Nextcloud のバックグラウンド処理は、これまでに設定していた、Cron による起動のほか、WebCron といって、Web アクセスによる起動も可能となっています。
今回は、 Lambda と CloudWatch Events というサービスを組み合わせて WebCron によるバックグラウンド処理起動を仕掛けるようにします。
また、Nextcloud からさまざまな通知をメールで送信する機能があるのですが、メールを送信する設定もついでに追加していきます。

# 今回構築する Nextcloud on AWS 環境
次のような構成となります。今回も Nextcloud を動かす部分の構成自体には何も変更はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/106af529-0cf6-6c67-3495-d8d3bba9db2b.png)

## 今回追加で利用する AWS サービス
|サービス名|役割|
|:--|:--|
|AWS Lambda|イベント駆動型のサーバーレスコンピューティングサービス。コンピューティングで使った分だけの課金体系。|
|Amazon CloudWatch Events|指定したルールにしたがってイベントを発生させるサービス。|
|Amazon SES|フルマネジメント、サーバーレスの電子メール送受信サービス。送受信通数に応じた課金体系。|

# 設定手順

## Nextcloud サーバーの停止(破棄)

片方の Nextcloud の EC2 を破棄して一時的にシングル運用とします。

1. AWS マネジメントコンソールにログインし、EC2 サービスを選択します。「インスタンス」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/23c6b669-8027-5011-48d4-66d18389fbd0.png)

2. Nextcloud のバックグラウンドジョブ Cron が**動作していない** EC2 インスタンスを選択し、「アクション」－「インスタンスの状態」－「終了」の順にクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/dc935159-4cef-ae9f-431b-e782b9193744.png)

3. 「はい、終了する」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/dac47960-4a17-4950-bd5e-186c7c76b011.png)

4. 下の画面のように「Terminated」となればインスタンスの破棄が完了です ( 破棄したインスタンスの情報は 1 時間程度で見れなくなります ) 。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/107e84b7-ceba-f040-5bff-ebf147ae7ffd.png)

## Nextcloud の設定① : バックグラウンドジョブの設定変更

1. Nextcloud に管理者ユーザーでログインし、右上のアイコンをクリック→「設定」クリックで設定画面を表示、左ペインの「基本設定」をクリックするとバックグラウンドジョブの設定画面が表示されます。「WebCron」をクリックします。設定変更は即座に反映されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/94ed404b-93f7-63f7-fa82-8867ac8c3255.png)

## Lambda 関数ならびに CloudWatch Events の設定

1. AWS マネジメントコンソールにログインし、Lambda サービスを選択します。「関数の作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/75e10acc-49b1-fc87-76dd-edda614f15aa.png)

2. 「一から作成」をクリックし、以下のとおり設定します。設定後「関数の作成」をクリックします。

    |項目|設定|
    |:--|:--|
    |関数名|わかりやすい名前をつけてください。|
    |ランタイム|"Python3.8" を選択。|

3. 少し待たされますが、作成が終わるとしたのような画面となります。引き続いて「関数コード」に関数の内容(コード)を設定していきます。設定したら「保存」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/22760233-d638-b405-864f-33436d89d28a.png)

    ```
    import urllib.request
    
    def lambda_handler(event, context):
        #
        url = 'https://【Nextcloud を動かすサーバの FQDN】/cron.php'
        
        req = urllib.request.Request(url)
        try:
            with urllib.request.urlopen(req) as res:
                body = res.read()
        except urllib.error.HTTPError as err:
            print(err.code)
        except urllib.error.URLError as err:
            print(err.reason)
    ```
    <参考> [Python の HTTP クライアントは urllib.request で十分](https://qiita.com/hoto17296/items/8fcf55cc6cd823a18217)

4. 次に作成した Lambda 関数が動くかどうか確認します。 Lambda 関数は AWS の各サービスのイベントを契機に起動しますので、まず、テスト用のイベントを作成します。「テストイベントの選択」をクリックし、「テストイベントの設定」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/456196a5-88df-df23-69d3-b959bfd7e16a.png)

5. テストとしてはイベントを発生させることができれば OK なので、テストイベントの内容は適当で大丈夫です。以下のとおり設定し、「作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/4cc5abdf-e85e-b9e9-c157-41ae224958b7.png)

    |項目|設定|
    |:--|:--|
    |イベントテンプレート|"Hello World" を選択します。|
    |イベント名|わかりやすい名称を設定します。|

6. テストを実施します。「テスト」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/fa66b818-2565-cec8-4cf3-1d403f76def0.png)

7. 実行結果が「成功」となれば問題ありません。さらに「詳細」をクリックすると実行内容の詳細を確認することができます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/9129a5c9-4887-a38a-01ff-5fde3ff58789.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/ebc15c23-159c-c8f8-c03b-1429e8cd788c.png)

8. Nextcloud のバックグラウンドジョブ設定画面を再度確認し、「最終ジョブ実行」の時間が更新されていることを確認できれば、WebCron でのバックグラウンドジョブ起動設定は OK です。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/e4ad6f23-2945-af96-7d38-20edcae0f7c8.png)

9. 次に、作成した Lambda 関数をどの AWS サービスのイベントで起動するかという、トリガーの設定を行います。「Designer」の中にある「＋ トリガーを追加」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/9ef82a92-423e-5fb6-aac3-6eb8b8bee83b.png)

10. 「トリガーを選択」のプルダウンで「CloudWatch Events」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/68f84d03-c609-6014-5d1c-705f84186b8b.png)

11. 「ルール」のプルダウンで「新規ルールの作成」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/e5f8c397-dbb0-afac-f3e6-63f0c06effac.png)

12. ルールの設定を行っていきます。以下のとおり設定し、「追加」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/f5b3bf0c-0ec2-aecd-e8bb-8164c011fa87.png)

    |項目|設定|
    |:--|:--|
    |ルール名|わかりやすいルール名を設定します。|
    |ルールタイプ|"スケジュール式" を選択します。|
    |スケジュール式|"rate(5 minuts)"と入力します。これで 5 分間隔でイベントを発生させる意味となります。|

13. これで、作成した WebCron を起動する Lambda 関数の設定が完了です。今後 5 分おきに WebCron でバックグラウンドジョブが起動します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/b72098a6-173b-7a7b-bb85-a733efcbc922.png)

14. Lambda 関数の実行ログは CloudWatch Logs に追加されます。CloudWatch Logs のログループ画面から "/aws/lambda/(Lambda 関数名)" のロググループで確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a643fcb6-8878-2e66-ade2-bc0937825394.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/385ad6f9-5b81-22b5-df72-c36066433ccd.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/f5445411-7498-44e8-7cc0-46042f23bc20.png)

## SES の設定

**※この設定は必須ではありません。**
**SES の利用にあたっては、DNS に設定を追加することによる認証処理が必要です。サービス運用中の DNS への設定変更はサービスに影響が出ることがありますので、十分注意をしてください。**
**SES を利用せず、既存のメールサーバを使う形でも全く問題ありません。**

Amazon SES を利用して Nextcloud からメールを送信できるようにしていきます。
SES のサービスは、初期状態ではサンドボックスでの利用に限定されており、様々な宛先に送るようにするためには、 AWS に対してそのようにする旨の申請が必要となります。
サンドボックスでの利用では、 AWS 側で認証されている特定のメールアドレスを宛先に限定して送信することができます。

1. AWS マネジメントコンソールにログインし、Simple Email Service サービスを選択します。SES のサービスは記事掲載時点で東京リージョンに展開されておりませんので、そのほかのリージョンを選択します。今回は「米国東部 (バージニア北部)」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/be9755e8-cbbd-d6ff-817d-f50f365b9bb4.png)

2. まず、Nextcloud サーバから SES でメールを送るためのドメイン認証を行います。「Domains」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/110cd220-9951-7ee6-8b7f-7911829bdfa1.png)

3. 「Verify a New Domain」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/fe4e0bfa-e06f-3585-1859-cf9798e241e2.png)

4. 「Domain」に Nextcloud が動いている FQDN を入力、「Generate DKIM Settings」をチェックして「Verify This Domain」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/16e10160-2bc1-607e-a9bf-43de39cdf4e4.png)

5. ドメイン認証に必要な DNS レコード情報が表示されますので、これを DNS に追加していきます。それぞれの値(Value)は、1バイトのダブルクォーテーションで囲ってください。「Download Record Set as CSV」でダウンロードすることも可能です。
もし、DNS において、すでに同じ名前の TXT レコード (例えば SPF レコードとか) が登録されている場合、
    * Route 53 を利用している場合は、登録済みの TXT レコードを編集する形で、登録済みのものに対して、行末に改行を追加して設定値を追加することで登録可能です。
    * Route 53 以外の DNS の場合は、普通にもう 1 行追加すれば問題ないはずです・・・ (試せてないのであいまいですみません)

6. DNS のレコード確認による認証となりますので時間がかかります。Route 53 であれば数分程度で認証できると思いますが、それ以外の一般的な DNS では最大で 72 時間程度かかることもあるようです。認証が OK となると下のような画面となります。
認証が OK となったら次は送信先とするメールアドレスを認証していきます。「Emain Addresses」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/5d89f7cc-c121-e779-5cb6-7aa8b87dc363.png)

7. 「Verify a New Email Address」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/1cce17d8-99fc-55fd-05da-7cbd2836937e.png)

8. 「Email Address」にメールを送信したい宛先メールアドレスを入力して「Verify This Email Address」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/5e115f02-3fab-5e9f-7a72-fa9cdd7b71ed.png)

9. 認証用のメールが入力したメールアドレスに対して送信されます。「Close」を押してメールを確認します。`Amazon Web Services – Email Address Verification Request in region US East (N. Virginia)` というタイトルのメールが送信されてくるはずです。もし確認できない場合は、メールソフトの迷惑メールフォルダやごみ箱も確認してみてください。
メール本文内に指定された URL にアクセスします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/04fca170-9bf5-ef91-1cb6-284c450a6b2a.png)

10. 認証が成功すると下のような画面が表示されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/202eb71c-f6b9-572f-b7e9-686b0ed40699.png)

11. 先ほどの SES 設定画面に戻ります。ブラウザのリロード等で画面を更新して「verified」のステータスを確認します。
引き続いてメールが実際に送信できることを確認していきます。認証したメールアドレスの左のチェックボックスを選択して「Send a Test Email」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/0708742b-4c18-17cb-4842-9ebc20759319.png)


12. 送信するメールの内容の設定です。下のように入力して「Send Test Email」をクリックします。メールが送信されてきたら設定 OK です。

    |項目|設定|
    |:--|:--|
    |To|認証済みの送信先メールアドレス|
    |Subject|メールの件名|
    |Body|メールの内容|
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/ab685a9a-67d2-8595-3eb5-a243fadabf5c.png)

13. Nextcloud に設定するメールサーバー情報を取得します。「SMTP Settings」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/7702e545-506e-bb52-aaa4-fd2a0ed7b750.png)

14. メールサーバーの基本情報が表示されますので確認します。さらにメールサーバーに接続するための認証情報を取得するため、「Create My SMTP Credentials」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/58a58e29-e701-1b97-2071-07f976958806.png)

    |項目|Nextcloud における設定項目|
    |:--|:--|
    |Server Name|サーバーアドレス|
    |Port|ポート|
    |Use Transport Layer Security (TLS): Yes|暗号化: STARTTLS|

15. 「作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/0f238639-7fda-774f-2741-dd13d2f0d3d4.png)

16. メールサーバー接続情報が作成されます。「ユーザーの SMTP セキュリティ認証情報を表示」をクリックすると情報が表示されます。「認証情報のダウンロード」で認証情報を CSV 形式でダウンロードすることもできます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a6b799a0-a7e5-f5b4-16d9-efa8c60dcd64.png)

## Nextcloud 設定の変更② : メールサーバー情報の設定

設定した SES の情報を Nextcloud に設定していきます。

1. 現在のユーザーにメールアドレス情報を付与しておきます。
Nextcloud にログインし、右上のアイコンをクリック→「設定」をクリックすると個人情報設定画面が表示されます。「メール」に SES で認証済みのメールアドレスを設定します。設定は即時に反映されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/f05e2bcf-0308-2450-7652-26e6ebb461f0.png)

2. 左ペインの「基本設定」をクリックするとメールサーバーの設定画面が表示されます。以下のように設定していきます。資格情報以外は即座に設定が反映されます。
設定後に「メールを送信」ボタンをクリックすると、先に設定したメールアドレスあてにテストメールが送信されてきます。メールが受信できていれば設定 OK です。

    |項目|設定|
    |:--|:--|
    |送信モード|SMTP|
    |暗号化|STARTTLS|
    |送信元アドレス|SES で認証済みのメールアドレス|
    |認証方法|平文|
    |認証を必要とする|チェックする|
    |サーバーアドレス|SES 接続情報の "Server Name"|
    |ポート|465 または 587|
    |SMTP ユーザー名|SES 認証情報の SMTPユーザ名|
    |SMTP パスワード|SES 認証情報の SMTP パスワード|
    ※資格情報 (SMTP ユーザー名、SMTP パスワード) 設定時には「Save」ボタンをクリックして保存します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/b917e5b8-75ed-7b83-71a6-991df5e29229.png)

## 設定変更後の EC2 サーバーから新しい EC2 サーバーを作成、ロードバランサ追加

第 4 回の記事[「ALB を利用したサーバー負荷分散、可用性向上に向けた取り組み - Nextcloud 環境の構築を通じて AWS での環境構築を体験する④」](https://qiita.com/S_Katz/items/edadf33755c0d834eb46) の [「EC2 サーバーの追加」](https://qiita.com/S_Katz/items/edadf33755c0d834eb46#ec2-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%BF%BD%E5%8A%A0)～[「ロードバランサの追加」](https://qiita.com/S_Katz/items/edadf33755c0d834eb46#%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B5%E3%83%BC%E3%81%AE%E8%BF%BD%E5%8A%A0)のの記事を参考に、

* 現在動いている EC2 のマシンイメージの再取得
* マシンイメージから EC2 を 1 つ作成 (インスタンスタイプは同じもの)
* 作成した EC2 をロードバランサへ追加

を行います。あえて細かい手順は省きますが、多分問題ないかと思います。 (必要な声を多数お寄せいただいた場合は追記します。)

**お疲れさまでした！　これで完了です。**

# あとがき

当初記載していた手順について、複数の EC2 インスタンスで運用していることへの考慮が足りず、後出しで手順を変更してしまい申し訳ございません。 
今回の設定作業により、 EC2 の設定差分が解消され、どのサーバーも同じ設定となりますので、万が一どちらかの EC2 がダウンしても全く同じ復旧手順で復旧することができるようになり、管理が簡素になります。
あと、SES によるメール送信環境の構築はオマケで完全に私自身の学習、備忘のために記載いたしました。設定は若干大変な感じがありますが、それだけセキュリティを保つために必要であるということで理解いただければと思います。

連載形式で記事を書いてきましたが、構築の記事としては次回で最終回となる予定です。
次回は、EC2 で障害が起こっても自動的に EC2 を復旧させ、必要に応じてスケールアウト/スケールインを行い可用性を上げることができる、Auto Scaling を設定します。