広告

AWS WorkSpaces で急造テレワーク環境! 続き2(owncloud導入編)

Amazonアソシエイト

前回は環境の初段の整備を行いました。
続きで実際の機能の配備について書いていきたいと思います。
以下が実際の構成イメージです。主に、EC2配下の青枠のdocker部分、owncloudについて進めて行きます。

配置イメージ

今回はコンテナ間でのデータ連携は特に考えないのでdocker自体の設定には手を加えません。
前回整備した/volumeの配下にコンテナ毎のディレクトリを作成して作成します。
また、本来ならDockerfileをカスタマイズして対応するべきですが、急造が目的なので構築はかなり泥臭い方法で行いますのであらかじめご承知おきください。

・まずはディレクトリ作成※今後のお題の物も作っときます

[ec2-user@******* ~]$ mkdir /volume/rocketchat
[ec2-user@******* ~]$ mkdir /volume/redmine
[ec2-user@******* ~]$ mkdir /volume/owncloud

owncloudの作成
owncloud公式のdockerイメージを利用します。
owncloudのdockerの公式イメージはVer10.0.10でのイメージとなっています。
インストール版の最新はVer10.4.1なので若干古いバージョンとなっています。
今回はowncloudで利用するデータベースはAmazon RDSを利用したいと思います。
また、WebサーバとPHPアプリケーションのowncloudはインターフェイスとしては分けたいのでowncloudの本体イメージはApache同梱のイメージではなく、PHP-FPM(phpのCGIインターフェイス)が同梱されたfpmイメージを利用します。
当然、Webサーバは別にコンテナイメージを用意する必要がありますが、Webサーバの設定にowncloudへの接続設定が用意されているnginxのイメージ(raulr/nginx-owncloud)があるので利用します。

1.owncloud用 Amazon RDS postgreSQLの作成
owncloudはMySQL/MariaDB、PostgreSQL、Oracle(有償版のみ)が対応しています。
MySQL/MariaDBの方が扱いが楽だしAmazon RDSでもどちらも利用可能なんですがどうも例の買収からの派生という流れで個人的に抵抗感があるのでpostgreSQLを使います。

ここで事前にハマりポイントを上げておきます。
Amazon RDSではpostgreSQLが現在、11系が最新になります。(プレビューを入れると12系)
自分はredmine用のデータベースも含めて10系のRDS一つに集約しようと思ったんですが、owncloudのセットアップが失敗。調べてみるとGitHubにこんなスレッドが・・・
一応、対応バージョンとしてはpostgreSQL 9系以降という案内なんですがowncloudの10.0では9系までしか対応していない模様。owncloud自体に手を入れてpostgreSQL 10系でも導入可能っぽいですがトリッキーなことはしたくないのでowncloud用は個別にpostgreSQL 9.6のRDSで作成します。

最低限、デフォルトがUTCのタイムゾーンをJSTに変更したいのとあとでRDS個別にチューニングやカスタマイズしたくなってもR対応できるようパラメータグループを作成します。

パラメータグループ作成
1.選択するデータベースバージョンと同様のバージョンをパラメータグループファミリーに選択
2.任意のパラメータグループ名をグループ名に記載(英数字記号)
3.パラメータグループの説明を説明に記載(英数字記号)

パラメータグループの一覧から作成したパラメータグループを選択します。
timezoneで検索し、表示された一覧からパラメータを選択してパラメータの編集をクリックします。
下図は変更したあとなので Asia/Tokyo になっていますが初期ではUTCになっています。

編集画面で、以下のようにAsia/Tokyoと入力して変更の保存をします。
ちなみにlog_timezoneは変更できないみたいです。

この後、実際にRDS作成します。事前に以下も作成が必要ですので作っておきます。
DB サブネットグループの使用
セキュリティグループの基本

面揃えできたら、以下の「データベースの作成」からRDSを作りす。

データベース作成方法の選択
 標準作成を選択
エンジンのオプション
 エンジンのタイプ:PostgreSQLを選択
 バージョン:PorstgresSQL 9.6.x-R1
※9.6の最新は9.6.17-R1 ,自分の場合環境作成時最新が9.6.15-R1だったのでそれを選択しています。特に問題ないはずなので、最新を選択で良いと思います。
テンプレート
 無料利用枠 
※それほどのパフォーマンス求めてないのでこれで充分です。ただし9系では無償枠のインスタンスだとディスクの暗号化ができないです。(t3以上は可能)
設定
DB インスタンス識別子:【任意の名前】
 マスターユーザ名:【任意のユーザ名】
マスターパスワード:【任意のパスワード】
DBインスタンスサイズ
 db.t2.micro ※無償枠なのでいじらずこのまま
ストレージ
 ストレージタイプ:汎用(SSD)
 ストレージ割り当て:20GiB
ストレージの自動スケーリング:ストレージの自動スケーリングを有効にする※しきい値を超えると自動的に拡張されます。拡張に応じて料金がかかるのでご注意
 最大ストレージしきい値:1000 GiB
可用性と耐久性
 無料枠の場合選択不可
接続
 Virtual Private Cloud (VPC):【使用するVPCを選択】
 追加の接続設定(▼をクリックしてメニューを展開)
   サブネットグループ:【作成したDBサブネットグループを選択】
   パブリックアクセス:なし
   VPC セキュリティグループ:既存の選択
   ※作成したセキュリティグループを選択して、最初から登録されているdefaultは削除
   アベイラビリティーゾーン:【サブネットに属したAZから選択】
   データベースポート:5432
   ※上記はデフォルト。変更も可能
データベース認証
   データベース認証オプション:パスワード認証
追加設定(▼をクリックしてメニューを展開)
   最初のデータベース名:【owncloudで利用するデータベース】
   ※owncloudの初期設定で指定します。任意の名前で設定してください
DBパラメータグループ:【作成したパラメータグループ】
   自動バックアップの有効化:有効
   バックアップ保存期間:デフォルト7日
   ※自分は3日にしています
   バックアップウィンド:選択ウィンド
開始時間:19:00(UTC/JSTだとAM4:00) 期間:0.5時間
   スナップショット にタグをコピー:有効
   モニタリング
     拡張モニタリングの有効化:有効
     詳細度:デフォルト
     モニタリングロール:デフォルト
   ログのエクスポート
     Postgresql ログ:選択
     アップグレードログ:選択
   メンテナンス
     マイナーバージョン自動アップグレードの有効化:選択
    メンテナンスウィンド
     選択ウィンドウ:選択
     開始日:土曜日  開始時間:19:30 UTC  期間 0.5時間
     ※JSTでは日曜日 4:30 〜
削除保護
削除保護の有効化:選択

以上でデータベース作成を実行

作成が完了したら、作成されたデータベースの接続とセキュリティからエンドポイントを確認します。

確認したエンドポイントと設定したマスターユーザ/パスワード、データベースでEC2から接続確認をします。

▪️ psqlコマンドで接続確認
[ec2-user@******* ~]$ psql -h xxxxxxxx.xxxxxxx.ap-northeast-1.rds.amazonaws.com -U 【ユーザ名】 -d 【データベース名】

※ポート番号を変更している場合は -p 【ポート番号】も必要です

▪️接続したらついでに、マスターユーザとは別にDB作成可能な接続ユーザを作っておきましょう。
owncloud=> CREATE ROLE 【ユーザ名】 WITH PASSWORD '【パスワード】' LOGIN;
CREATE ROLE
owncloud=> GRANT 【ユーザ名】 TO 【マスターユーザ名】;
GRANT ROLE
owncloud=> \du
※\duの結果で作成したユーザが追加されていることを確認してください。

2.owncloudコンテナの作成
docker-composeで一括管理するため、作成したコンテナ用ディレクトリに移動してdocker-compose.ymlを作成します。
今回はowncloudnginxのイメージ(raulr/nginx-owncloud)の定義をします。それぞれのducket-hubのページに書き方が出ていますので参考にしてください。

▪️owncloud用ディレクトリへの移動
[ec2-user@********* ~]$ cd /volume/owncloud/
▪️ docker-compose.yml
version: '2'

services:
# owncloud
 owncloud:
   restart: always
   image: owncloud:fpm
   container_name: owncloud
   volumes:
     - "/volume/owncloud/owncloud:/var/www/html"
 nginx:
   restart: always
   image: raulr/nginx-owncloud
   container_name: nginx
   links:
    - owncloud
   volumes_from:
    - owncloud
   ports:
    - "******:80" #マッピングする外部通信用のホストのポートは適宜決めてください 

volumusの定義でコンテナ内のディレクトリをホスト側のディレクトリにマウントして永続化するので
ディレクトリを作成しておきます。

[ec2-user@********* ~]$ mkdir -p /volume/owncloud/owncloud/

owncloud用のディレクトリで以下のようにコマンドを実行します。

[ec2-user@********* owncloud]$ sudo docker-compos up -d

コンテナイメージをダウンロード後、コンテナが起動されます。
以下のコマンドで状態を確認できます。 xxxxxxの部分は設定したホストのポート番号が表示されます。

[ec2-user@********* owncloud]$ sudo docker-compos ps
  Name               Command              State           Ports        
-----------------------------------------------------------------------
nginx      nginx -g daemon off;           Up      0.0.0.0:xxxxxx->80/tcp
owncloud   docker-entrypoint.sh php-fpm   Up      9000/tcp  

上記の場合、コンテナには【ホスト名 or IPアドレス】: xxxxxxx(コンテナの80番にマッピングしたホストポート)でアクセスします。ポートを意識するのは面倒臭いのでALB(Application Load Balancer)に紐付けてポートは意識しないようにします。

EC2サービスのメニューからロードバランサーを選択、ロードバランサの作成をクリックします。
以下のALBの作成を選択します。

名前の部分にはわかりやすい名前をつけます。
workspacesからの内部通信のみで利用するのでスキームは内部を選択します。
IPアドレスタイプはそのまま ipv4のままにしときます。

実際のところ、内部用のALBでもHTTPS通信をさせることはやり方あるんですが結構手間なので、とりあえず内部利用の割り切りと設定をするため用としてHTTP の 80通信のままにします。

利用するサブネットが含まれたVPCを選択し、プライベートサブネットが配置されるAZにチェックを付けサブネットを選択します。

手順 2: セキュリティ設定の構成はHTTPSを選択していないのでそのまま次に行きます
次にセキュリティグループの設定になります。Workspacesで適用しているセキュリティグループもしくは
許可していて、最低限必要なポートのセキュリティグループを適用します。
事前に作っていれば既存から選択、新規に作成する場合は新しいセキュリティグループを選択します。
今回は最低限、80ポートです。さらに硬く行くなら、ソースはプライベートサブネットのネットアドレスを指定するのが良いかと思います。

次にターゲットグループですが、以下にowncloudで利用している設定を例として上げます。
名前はわかり易ければなんでも良いです。ターゲットの種類はインスタンスを選択。
プロトコルはHTTPを選択しターゲットポートはnginxに定義したホスト側のマッピングポートを指定します。
そしてヘルスチェックですがデフォルトでは「/」ですが自分はこれだとALB認識してくれず、
ここで/chk.htmlを指定してコンテナ側にファイルを仕込んで回避しています。

chk.htmlですが、以下のように作成しておきます。
dockerホストのディレクトリにマウントしたowncloudの永続領域配下でホストから以下のように作成すればOKです。

[ec2-user@********* owncloud]$ cd /volume/owncloud/owncloud
[ec2-user@********* owncloud]$ sudo touch chk.html
[ec2-user@********* owncloud]$ sudo chown 33:nfsnobody chk.html

最後にターゲットの登録で、dockerホストのEC2を選択して登録します。登録後、確認画面で作成を選択しALBを作成します。
作成後、EC2のサービス画面のでロードバランシング>ターゲットグループを選択し、ALB作成時に合わせて作成したターゲットグループを選択します。
ターゲットタブの登録済みターゲットのステータスが「healthy」になっていれば正常にALBから正常に認識されている状態です。

合わせてロードバランシング>ロードバランサから作成したALBを選択し説明タブからDNS 名を確認します。
東京リージョンであれば、「******」部分にALBの固有の名前が入り以下のようになっています。
 「************.ap-northeast-1.elb.amazonaws.com」
これが、ブラウザでアクセスするURLとなります。
route 53などを利用すれば固有のFQDNなどにもできますが、まあとりあえずはこれで。

これでworkspacesを起動させブラウザから接続します。
以下のような画面が出れば接続されています。
管理者アカウントの作成の部分に任意のユーザ名/パスワードを入力します。
セットアップ終了後はここで指定したユーザを管理者ユーザとして設定変更や権限変更などするので
忘れないようにしましょう。

初期状態ではデータベースとしてSQLliteが指定されているので、ストレージとデータベースの▼をクリックし、
以下のようにPostgreQLを選択します。
データベースのユーザ名には作成した接続用ユーザ、パスワードには接続ユーザのパスワード、
データベース名には最初のデータベース名で指定したデータベースを入力します。
localhostの部分はRDSの【エンドポイント】:5432 とポート指定を付けて入力します。
※ポートを変更した場合は設定したポート番号を指定してください。
セットアップを完了をクリックすると、セットアップが開始されます。

正常に完了すると以下のようにログイン画面が表示されます。
管理者ユーザでログインできることを確認します。

思ったより長くなったので今回はここまでで、
次回はS3ストレージの追加を含めた設定を書いて行こうと思います。