NextcloudのプライマリストレージをAWS S3に変更してCloudWatch Alarmを設定する

NextcloudのプライマリストレージをAWS S3に変更してCloudWatch Alarmを設定する

こんにちは、6月に入社した高井です。
今回は社内でサーバーのOS入れ替えをした際に行ったNextcloudのストレージ変更のお話をします。

 

弊社ではファイル共有ストレージとしてNextcloudというオンラインストレージを導入しています。
簡単に説明すると「自社サーバー上で運用するGoogle Drive」のようなものです。(多分)
OSSなので運用保守については基本的に自分達で行う必要がありますが、
Google Workspace(Google Driveを包括したGoogleの法人向け有料サービス) にあるような機能を無料で利用することが出来ます。便利ですね。

もともとは一つのレンタルサーバー上でNextcloudの稼働とファイル保存を行っていました。
しかしファイル容量とは無慈悲に増えていくもので、元々あった200GBの空き容量はいつの間にか残り5GB程度まで減ってしまい・・・
ストレージを追加すれば解決しますがレンタルサーバーのストレージがSSDなので容量追加も安くありません。
どうしようかと考えていた所、公式ドキュメントにファイルの保存領域を外部ストレージへ変更する方法を発見。
さらにサポートしている変更先の中に「 Amazon Simple Storage Service (S3)」と書いてあるではありませんか。

 

個人的に使ったことはありますが業務ではなかったので使ってみたかったんですよねAWS。
S3ならばこの先ファイル容量がもっと増えても問題ないと判断し、早速社長にゴリ押し提案して運用してみることにしました。
ついでにデータ転送量の異常を感知してアラートを鳴らす設定も行います。(クラウド死対策)

※注意:今回使用するAWSのサービスには有料の操作が含まれています。料金表

手順

以下の設定を行います。

  • NextcloudがS3にアクセスする際に使用するユーザーをIAM(Identity and Access Management)で作成する。
  • S3にNextcloudのデータを保存するバケットを作成する
  • Nextcloudのconfig.phpを編集してS3へのアクセス情報を設定する
  • SNS(Simple Notification Service)とCloudWatchを使用してアラートを作成する

AWSの設定

  • Nextcloudに割り当てるAWSアカウントをIAMで作成する

    ・IAMにアクセスして[ユーザー]→[ユーザーを追加]を選択

    ・ユーザー名を入力して[プログラムによるアクセス]にチェックを入れます

    ・アクセス許可の設定で[既存のポリシーを直接アタッチ]→検索欄でS3と入力して検索→[AmazonS3FullAccess]を選択

    ・タグの追加を行う(任意なので省略)

    ・確認画面が表示されるので内容を確認して[ユーザーの作成]を押下する

    ・[成功]と表示されるとアクセスキーとシークレットアクセスキーが発行されるのでメモするかCSVをダウンロードしておく。


    ※注意:シークレットアクセスキーはこの画面以降では確認できません。必ずメモするかCSVをダウンロードしてください。
    今回作成するユーザーはコンソールにログインする権限がない為、キーを紛失した場合はアカウントを作り直す必要があります。

  • Nextcloudのデータを保存するバケットをS3に作成する

    ・S3にアクセスして[バケット]→[バケットを作成]を選択

    ・任意のバケット名*を入力してリージョンを選択します。
    リージョンはNextcloudが稼働しているサーバーに近い地域を選択してください。
    東京と大阪のリージョン程度ではそこまで影響は出ないとは思いますが、バージニア北部など距離的に遠いリージョンを選択すると通信速度に影響が出ます。

    ※バケット名はパーティションという複数のリージョンの集合体の中でユニークな値である必要があります。
    ただそこまで厳密に考えなくても良いので全AWS上で重複しないようにする程度の認識でよいと思います。
    命名規則に関する詳細はこちらを参照してください。

    ・[このバケットのブロックパブリックアクセス設定]と[デフォルトの暗号化]はデフォルトのままで進めます
    [バケットのバージョニング]は必要に応じて設定します

    ・[バケットの作成]を押下してバケットを作成します

Nextcloudの設定

  • Nextcloudのconfig.phpを編集する

    https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html?
    設定方法は公式ドキュメントに記載があります。やったね。

    ・vimなどのテキストエディタでconfig.phpを開いて$CONFIG内に以下の配列を追加します。

    'objectstore' => [
            'class' => '\\OC\\Files\\ObjectStore\\S3',
            'arguments' => [
                    'bucket' => '<Bucket_name>',
                    'autocreate' => true,
                    'key'    => '<Access_Key>',
                    'secret' => '<Secret_Access_Key>',
                    'use_ssl' => true,
                    'region' => '<S3_region>',
                    // required for some non Amazon S3 implementations
                    'use_path_style'=> false
             ],
    ],

    arguments内の各keyのvalueは前述の操作で控えた内容に変更してください。
    [‘use_ssl’]についてはSSL利用有無によって変えてください。
    [‘autocreate’]はtrue/falseどちらでも機能していないようです。(参考
    [‘use_path_style’]はAWSを使う場合は基本的にfalseでいいとのことです。(参照

    入力して保存をするとこの時点でデータの保存先がS3に切り替わります。
    なお、上記設定前に保存していたデータに関しては見えなくなりますが既存の保存先に存在しており見えなくなっているだけです。
    上記追加内容をconfig.phpから削除すれば元に戻せます。

 

アラートの設定

S3のストレージ料金は安いので数百GBの規模感ならそこまで気にしなくてもよいのですが、ストレージ料金以外にもテータ転送料金やリクエスト料金なども発生します。
そして弊社の場合、社員それぞれがNextcloudの同期クライアントでローカルとサーバ上のファイルを同期している為、意図せず大容量のファイルをダウンロードして知らぬ間に転送料金が跳ね上がるリスクがあります。そこで一定期間にダウンロードしたファイル容量が閾値を超えた場合に管理者に対してメールなりSMSでアラームを送信する設定を行います。

手順としては

・S3でバケットのフィルターを作成してメトリクスを有効にする
・SNSでトピックを作成する(Email以外での通知を行う場合のみ)
・CloudWatchでアラームを作成する

の流れになります。

  • S3でバケットのフィルターを作成してメトリクスを有効にする

・S3にアクセスしてNextcloud用のバケット選択し、[メトリクス]→[その他のグラフを表示]を選択

・[リクエストメトリクス]→[フィルターの作成]を選択

・フィルター名を入力してスコープを[このフィルターは、バケット内のすべてのオブジェクトに適用されます]を選択して[フィルターの作成]を選択

今回フィルターの対象になるバケットは、基本Nextcloudからのデータしか入れないのでバケット内すべてのオブジェクトを対象にしています。この辺は運用に合わせて変更してください。

 

  • SNSでトピックを作成する(Email以外での通知を行う場合のみ)

アラームをEmailで飛ばす場合にはアラーム作成時にトピックを作成できるのですが、今回はSMSでメッセージを飛ばしたいのでSNSのコンソールからトピックを作成します。

・SNSから[トピック]→[トピックの作成]を選択

・[スタンダード]を選択して名前を入力。[表示名]はオプションとなっていますが送信されるアラームにも表示されるので入力した方がいいです。その他のオプションは必要に応じて変更して[トピックの作成]を押下

・ARNを控えてから[サブスクリプションの作成]を選択する

・プロトコルに[SMS]を選択して[電話番号を追加]からSMS受信可能な電話番号を入力する。設定後にトピックARNを入力、もしくはプルダウンから選択して[サブスクリプションの作成]を押下する。

 

  • CloudWatchでアラームを作成する

・CloudWatchにアクセスして[アラーム状態]or[すべてのアラーム]→[アラームの作成]を選択

・[メトリクスの選択]→[S3]→[各フィルターのメトリクスをリクエスト]→先程作成したフィルターの[BytesDownloaded]を選択して[メトリクスの選択]を押下

もしフィルターが表示されない場合は時間をおくか、対象のバケットにデータをアップロードするなりしてメトリクスを更新すると出てくるようです。

・各閾値を設定を設定する

[…よりも]の欄に入れる数値はバイト単位です。

・[既存のSNSトピックを選択]にチェックを入れて[通知の送信先]に先程作成したトピックを選択して[次へ]を押下する。
Emailで通知を行う場合は[新しいトピックの作成]を選択してアドレスを入力する。

・[名前と説明を追加]でアラームの名前を入力する
ここで入力したアラーム名は通知の本文にも記載されます

・プレビュー画面で設定内容を確認して[アラームの作成]を押下する

 

以上で設定は終了です

 

テスト

ダウンロード上限の閾値を10MB、アラーム名を[test]に設定してテストしてみます。

丁度デスクトップに放置してあったRaspberry Picoのデータシートです。彼に犠牲(?)になってもらいましょう。
ファイルサイズは16MBなので余裕でアウトですね。いざダウンロード。
そして待つこと2,3分後・・・

パターン赤!エラーです!!(ちゃんと動きましたね)
そしてSMSも届きました。

これでクラウド死を未然に防げるようになりました。
とはいっても閾値以下ギリギリで毎日転送されてたら気が付かないうちに請求が膨らむ可能性もありますので、請求ダッシュボードは数日おきくらいに確認した方がいいかもしれませんね。