はじめに
こんにちは。サービス開発室、新人エンジニアの笹川です。
先日、社内で開催された初心者向けAWSハンズオンセミナーに参加し、はじめてAWSの中に入りました。
弊社では「Backog助っ人サービス」を行っており、サービス開発室の先輩メンバーは日々バリバリとBacklogの環境構築等に励んでいるわけですが、私自身はというと、Backlogは日々のタスク管理には使用しているものの、APIなどはいじったことがありませんでした。そんな状況から今回、Backlogエンタープライズの環境構築に挑んでみることにしました。
間違いや、あまり良い手段ではない部分も多いと思いますし、とても長い記事になりそうですが、最後までお付き合いただければ嬉しいです。
参考までに、着手時のレベルはAWSコンソール内で過ごした時間が10時間くらい、その他のサーバー構築経験無し、です。
■全体の流れ
何が必要?
基本的には公式のインストールガイドに沿って進めていきます。(今回はプロフェッショナル版をインストールしました)
https://backlog.com/ja/enterprise/doc/professional/install-guide/install-guide.html
AWSにインストールするため、ガイドには無い設定も必要になってきますが、AWSの公式ドキュメントやGoogle先生に教えてもらいながら頑張ります。
最初にBacklogエンタープライズのトライアルに申し込みます。
https://enterprise.nulab.com/signup/backlog
申込後、Backlogエンタープライズのライセンスキーとインストーラーがダウンロードできるので、rpmを4つダウンロードしておきましょう。慣れている人は最初にガイドをサラッと読んで(私は熟読しましたが)必要なパッケージをローカル環境に揃えておくとスムーズに進むかもしれません。
結論を言うと、私がローカルから持って行って使用したパッケージは本体含めて以下の6つです。ガイドに配布元へのリンクがあるので、適切なバージョンをDLしておきます。
Backlogパッケージ
backlog-app-1.11.10-01.el7.noarch.rpm
backlog-api-1.11.10-01.el7.noarch.rpm
backlog-www-1.11.10-01.el7.x86_64.rpm
backlog-git-1.11.6-01.el7.x86_64.rpm
OracleJDK 8 最新版
jdk-8u341-linux-x64.rpm
Java言語用 MySQLデータベースドライバー バージョン 5.1
mysql-connector-java-5.1.49.tar.gz ⇒ mysql-connector-java-5.1.49-bin.jar
やってみよう、AWSの環境構築
インストールガイドを熟読してなんとなく流れが見えてきたので、とりあえず手を動かしていきました。
この時点で考えていたのは、まずVPCのパブリックサブネットにはEC2を立ててBacklogをインストール、DBはプライベートサブネットに立てて、使ったことないけどRDSインスタンスにしてみよう。そしてSMTPサーバーは全く分からないから後で考えよう、という感じです。
VPCとサブネット
さっそくVPC環境を作成していきます。
この辺りは社内セミナーで勉強したてだったので比較的スムーズに行きました。実際の構成は図の通り。
今のところ他の構成を知らないのでとりあえず知っている形の箱をこしらえてみようという感じです。
「Availability Zoneは障害に備えて必ず2つ以上使う」みたいなことも聞いた気がするのでちょっと迷った挙句プライベート・パブリックそれぞれ2AZ構成にしましたが、結局今回はパブリックサブネットを1つしか使用しませんでした。
ちなみに、ここまでの構成にはAWS料金が掛からないので安心してゆっくり作業できました。
それぞれのサブネットをプライベート・パブリックで分けてルートテーブルに関連付けし、パブリックルートテーブルはインターネットゲートウェイを作成してルーティングします。送信先は0.0.0.0/0。
本当はプライベート側にはNATゲートウェイを設定していましたが結局は不要でした。記事では一瞬ですが、実際は2週間くらい置いていたのでまあまあの金額になったのは内緒です。というか環境維持コストは7割くらいNATゲートウェイで発生していたものでした…
セキュリティグループ
VPCコンソールにいるついでにインスタンス起動時に必要になるセキュリティグループも作成しておきました。
EC2とRDSそれぞれ使用するため、2つ作成します。
以下のように設定しました。(タイプ/ポート範囲/ソース)
EC2インバウンド
・HTTP/80/Anywhare-IPv4
・SSH/22/マイIP
・カスタムTCP/8969 & 8972/Anywhare-IPv4
RDSインバウンド
・MySQL/Aurora/3306/EC2用に作成したセキュリティグループ
EC2/RDSアウトバウンド
・all traffic/all/Anywhare-IPv4
EC2のHTTPとSSHポートは、環境構築が終われば使用しないため、削除します。
実際はイン・アウト共にソースをもっと限定したほうが良いのだと思いますが、そのあたりを細かく詰めるのは実際に運用する機会まで取っておきます。
さて、次は図のように、パブリック側にアプリケーションサーバーとなるEC2を立ててOSをインストール、そしてプライベート側にはデータベースサーバーのRDSサーバーを立てていきます。
AMIカタログを眺める(EC2)
続いてEC2を起動していきます。また、インストールガイドとにらめっこです。
ハードウェアの要件がメモリ2.5GB以上なので、インスタンスクラスは t2.medium を選択。
有料インスタンスを立てるのは初めてなのでちょっと緊張しました。
OSはRed Hat Enterprise Linux 7またはCentOS 7。なにせLinuxのインストールもほぼ初めてなので、そのバージョンが他のアプリケーションと適合するのかとかが気になってしまい、今後の必要なプログラムをひとつひとつ調査するなどして時間を無駄にしたりもしましたが、結局AMIカタログの中で一番シンプルでミニマルな構成っぽかった CentOS 7 (x86_64) – with Updates HVM を選択しました。
続いてSSH接続で使用するキーペアを作成し、ネットワーク設定を編集してVPC、プライベートサブネットを選択し、事前に作成していたセキュリティグループを適用します。
最後に、高度な詳細のIAMインスタンスプロフィールには、 EC2FullAccess と SSMManagedInstanceCore を適用したIAMロールを作成し、適用しました。
インスタンスを起動してみると、パブリックIPv4アドレスが割り当てられます。Apache等のWebサーバーソフトが入っているわけではないので、ブラウザからアクセスしようとしても何も表示されませんがコンソールからは起動を確認できました。
これだけでは起動のたびにパブリックIPが変わってしまうため、ElasticIPアドレスを取得してインスタンスに関連付けます。このElasticIPアドレスは、Backlogのアドレスそのものになります。ちなみに、ElasticIPアドレスは、未使用で保持していると料金が掛かり、インスタンスやインターネットゲートウェイなどの有料サービスにアタッチされ、アタッチしたサービスが稼働していれば無料という仕組みになっています。
以下の図がここまでのインスタンス構成です。
SSMエージェント
EC2起動後、インスタンスを選択 ⇒ 接続 ⇒ セッションマネージャーを開くと、SSMエージェントがインストールされていないという警告が表示されました。ここからはAWSコンソールのSSMを使用して操作していくつもりなので、まずはSSH接続でエージェントをインストールしていきます。
余談ですが、SSMAgentはSystems Manager Agentの略称です。なぜSが二つ?と思ったら、AWS Systems Managerは、もともとAmazon Simple Systems Managerという名称で、その名残でSSMなんですね。もはやSimpleでは無いということなんでしょうか。
SSH接続は、PCのコマンドプロンプトから行いました。接続コマンドは起動したインスタンスを選択 ⇒ 接続 ⇒ SSHクライアントからも確認できます。
コマンドをコピーして、キーペアが格納されているディレクトリで実行すれば一瞬で接続完了です。
ssh -i "backlog-ec2.pem" centos@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
ちなみに、SSHで接続したときは、SSMで接続した時とユーザーが異なるので、ホームディレクトリのアクセス権なんかが違います。普段Linuxを触っている人には当然のことかもしれませんが、SSHで置いたファイルのある場所にSSMから移動できなかったりで最初はなかなか戸惑いました。
うまく接続できたら早速SSMエージェントをインストール。
$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
さあこれでSSM接続の準備が整いました。もう一度接続 ⇒ セッションマネージャーを選択してみると、右下にオレンジ色の「接続」ボタンが表示されました!
接続すると、別タブでターミナルが開き、ここからEC2の操作が可能となりました。
タイムゾーンの設定
インストールガイドによると、Backlogでは全てのサーバーのタイムゾーンがJSTに設定されている必要があるとのことですが、AWSは基本的にUTCで動いているのでタイムゾーンの変更が必要です。
$ sudo timedatectl set-timezone Asia/Tokyo
はじめてのRDS
EC2の準備も整い、このあとドライバ等をインストールしていきますが、ここで一息。
RDSも立ち上げてみましょう。
RDSは私にとっては完全に初めて使うサービスです。EC2がAMIを選択して起動するのに対してDB専用のサーバーであるRDSはDBを選択して起動します。このDBのアップデートなどの保守をAWSが行ってくれるそうです。
つまり、VPC内のアプリケーションからのアクセスしか行わなければインターネットと接続する必要も無いんですね。となるとパブリックIPアドレスも使用しないため、より安価に運用ができそうです。
まず初めに、設定の中で必要になってくるグループをいくつか作成しておきます。サブネットグループ、DBパラメータグループそしてオプショングループです。
サブネットグループ
サブネットグループは、二つ以上のサブネットを選択し、バックアップ先として使用されます。始めにプライベートサブネットを2AZで作成したのがここで役に立ちました。
実際にインスタンスを立てるAZもこのサブネットグループの中から選択することになります。
パラメータグループ
パラメータグループは、MySQLで言うとmy.cnfの中身であるDB固有の設定を操作できます。作成後、インストールガイドのMySQLのデータベース設定に従って max_allowed_packet、default-character-set、sql_mode を設定しました。time_zone もここから設定できるので、Asia/Tokyoになっていなければ変更しておきます。
オプショングループ
オプショングループも、パラメータグループ同様にDB固有の設定を行うもののようですが、特に設定は行わず今回使用した範囲では、EC2インスタンス、スナップショットの情報が関連付けられているようです。
それではRDSを起動していきます。
選択したDBは MySQL 5.7.38。最新の8.0はBacklogが対応していません。今回は本番環境ではないため、無料利用枠テンプレートを選択して設定していきました。任意のマスターユーザー情報を入力し、インスタンスは db.t2.micro を選択。ストレージは汎用SSD/20GB(最小)、自動スケーリングはオフにします。
接続設定で作成したサブネットグループを指定し、以前作成しておいたRDS用のセキュリティグループを適用、Availability Zoneをサブネットグループから選択します。
ポートはデフォルトの3306。
パブリックアクセスを「あり」にすると、DBインスタンスにパブリックIPアドレスが割り当てられ、ローカルのMySQL Workbench等から接続して設定ができるようになります。私も初めはそのつもりでアクセス設定をしていました。もちろんNATやセキュリティグループなども開放して。ですが、どうしてもこうしても、MySQL Workbenchからの接続がうまくいかず、結局は全ての設定をEC2から行いました。
そもそも外からアクセスようとしたのは私がLinuxもDB構築もほぼ未経験で絶対的に自信が無いためでしたが、結果的にはEC2からのみのアクセスで十分でした。
どのみち避けては通れぬ道。
ということで、パブリックアクセスは最終的に「なし」にしました。
追加設定では、作成したパラメータグループ、オプショングループを選択し、最初のデータベース「backlog」を作成しました。
本番環境ではないので自動バックアップを1日に変更し、いざ起動!
少し時間が掛かって、ステータスが起動中になりました。EC2のSSMに戻って接続してみます。
その前にEC2にMySQLをインストール。
$ sudo yum install mysql
エンドポイント・ポート番号・ユーザー名を指定して実行。
$ mysql -h backlog-mysql.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p
パスワードを入力すると・・・・・・接続できました!
MySQLの設定
少しSQLを叩いてDBの中身や設定を見ていくと、インスタンスと一緒に作ったbacklogという名前のDBもちゃんとできていました。
あとはBacklogのためにユーザーを作成してあげます。インストールガイドを参考に設定しました。
MySQL > GRANT ALL PRIVILEGES ON backog.* TO 'backlog'@'%' IDENTIFIED BY 'Backlog@1' WITH GRANT OPTION;
ポイントは、backlog.* でbacklogDB内のみの全権限にしたことと、今回はRDSを使用しているのでホストに ‘localhost’ ではなく ‘%’ を指定したことです。実際はRDSのパブリックアクセス設定でVPC内からしかアクセスできません。
これでDBの準備完了です。
AWSだけでだいぶ長くなってしまいましたね…後編ではいよいよインストール作業を開始します!
ピンバック: 初心者がAWSでBacklogエンタープライズの環境構築してみました ② ~インストールとSMTP構築~ | Backlog助っ人サービス
ピンバック: 【最速!?】 Docker化された Backlogエンタープライズ 2.0.0 をAWSにインストールしてみました!!! | Backlog助っ人サービス