簡易的な社内向けAtlassian製品のクラウドサービスを構築してみた話



私の所属している[リックソフト株式会社](https://www.ricksoft.jp/)では、Atlassian製品をはじめとしたツール製品の販売を行っています。

今回、製品を購入検討中のお客様向け評価環境提供や、社内向けの検証環境として使える、簡易的な社内向けAtlassianサーバ製品のクラウドサービスを構築してみました。（当社が提供している[リッククラウド](https://www.ricksoft.jp/cloud/rickcloud/)とは別のものです）

社内では「インスタできる君」と呼ばれているもので、今回はこの社内向けクラウドサービスについて、技術的な内容を含めながらご紹介します。

## 概要
Atlassianのサーバ製品を、Web上から簡単に作成して利用できるシステムです。
本システムを利用することで、お客様への評価環境や、社内向けの検証環境を、数分で準備することが出来ます。
次より、具体的な環境作成の流れを説明していきます。

## アプリケーション環境作成の流れ

フロントエンド（管理画面）から「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e7007482-2c8a-fde2-9fc8-b6b7d6c20d57.png)

必要事項を記入のうえ「作成」をクリックすると、指定されたアプリケーション環境を作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/aaaeb5e1-cdc7-270e-4602-7ddfbc3a2706.png)

アプリケーション環境の作成開始と作成完了が、Slackへ通知されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/7c8db371-e1b2-57df-e698-b970b0140e13.png)

記載されたURLへアクセスすると、アプリケーションの画面が表示されます。設定後、アプリケーションが利用できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d3532853-ef63-de57-b7e1-511a7c3bdebb.png)

## システム構成

本システムはAWS上で構築されており、以下のような構成となっています。
構築に係るシステムでは、可能な限りAWSマネージドなサービスを取り入れ、コストの低減や高可用性を実現しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/46585119-2189-3d59-ce5f-cd11684ff6c5.png)

各構成について、次項でそれぞれ解説していきます。

### フロントエンド（管理画面）

フロントエンドは、PHPとCodeIgniter3フレームワークを利用して構築しています。
ユーザー（管理者）は、本画面よりアプリケーション環境の作成や、作成済みアプリケーション環境の確認を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/93cab5c5-ac94-5db8-15d8-75c34620c3c3.png)

フロントエンドの運用基盤は、AWS Fargateを利用しています。Fargateは、AWSマネージドなDockerコンテナ環境です。
このフロントエンドは、もともとEC2で動いていたものですが、Fargateを利用することで保守にかかるコストを削減することが出来ました。

Fargateを利用することで、VM（仮想マシン）やOS、ミドルウェアの管理が不要となります。
また、コンテナがシングル構成であっても、ヘルスチェックが行われ、障害時に新しいコンテナが自動的に作成され、自動復旧されます。
（数分間の停止を許容出来る環境であれば、シングル構成の運用でもこのようなメリットがありますのでお薦めです）
これらにより、運用・保守にかかる手間を大幅に削減することが出来ます。

そして、Fargateを利用するもう１つのメリットは、アーキテクチャの制限を受けないこと、学習コストが低いことです。
LambdaやAPI Gatewayによるサーバレスアーキテクチャでは、アーキテクチャに合わせたシステム構築やその前提としてのアーキテクチャの理解が必要となります。

これまでの技術、例えば使い慣れた言語やフレームワーク、ライブラリ、開発手法を活かすことができない場合があり、学習コストや構築コストは高くなりがちです。
しかし、Faragateの場合、DockerとFargateの理解は必要ですが、そのような制限はなく、使い慣れた技術を活かせるため、少ない学習コストで済みます。

### ワークフロー処理
インスタンス作成に関する一連のワークフロー処理には、AWS StepFunctionsを利用しています。

StepFunctionsでは、以下の図のようにフロントエンドからのリクエストを受けて、ステートマシンがワークフローに従い処理を進めていきます。ステートマシンの各タスクがLambda関数へリクエストを行い、インスタンス作成に必要な各種処理や、Slackへの通知等を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b038de0f-3c0c-9e18-a5ce-38979c969171.png)

当初はRundeck（ジョブ管理ツール）を利用していましたが、可用性とコスト（インフラコスト、運用コスト等）が課題となっていました。
StepFunctionsにより大幅なコスト削減と高可用性を実現しました。

### バックエンド処理

システムの各種バックエンド処理は、AWS Lambda（Node.js）を利用しています。
主にStep Functionsのステートマシンから呼び出される関数群として使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/891e233d-b6d1-65e7-b921-e336ea7a3be9.png)


当初はPHPやシェルスクリプトで実装していましたが、ワークフロー処理と同様に、可用性やコストの問題が課題となりました。
Lambdaへ移行したことで、大幅なコスト削減と高可用性を実現することができました。

Lambdaへの移行は、コードの書き直しや、Lambdaや周辺ツールの理解等の移行コストが大きいのがデメリットです。
しかし、運用後のコストが大幅に削減できる上に、高可用性も確保出来ますので、非常に効果的であると言えます。

### マスタ、データ管理

アプリケーションのマスタや、セッションデータの管理など、各種マスタおよびデータの管理には、DynamoDBを利用しています。
DynamoDBを利用することで、低コスト、かつ可用性の高いデータ管理を実現することが出来ます。
また、AWS SDKを利用してAPIで操作を行えるため、Lambdaから利用しやすいというメリットもあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c0b9a3b4-0e95-b198-ebf8-71c61c7535de.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4bc08ea1-43c2-a389-39ae-625b1cf49f3f.png)

### アプリケーション環境

アプリケーション環境は、１アプリケーションごとにEC2インスタンスを作成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/34fcce73-9759-08bb-5c86-254c4e037d95.png)

作成されたEC2インスタンスにはDockerがインストールされており、docker-composeを利用してアプリケーションのデプロイとプロビジョニングを行います。

最近は、Atlassianがプロダクション環境として利用可能なDockerイメージを配布しています。
このDockerイメージを利用すると、非常に簡単に、良い感じでアプリケーションのデプロイとプロビジョニングを行うことが出来ます。

https://hub.docker.com/u/atlassian

デプロイとプロビジョニングが完了すると、指定されたサブドメインでアプリケーション環境へアクセス出来るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/2d10156f-02c6-8982-ef5e-cdff101f6e68.png)

サブドメインの割当ては、Application Load Balancer(ALB)を利用して行っています。
また、ALBはリバースプロキシやSSL/TLS終端として利用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/300c6ea0-bf0a-1f22-70b5-8395a02c8652.png)

ALBではロードバランサーの各リスナーにルールを設定することが可能ですので、この機能を利用してサブドメインの振り分けを行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/19e458aa-2268-2c23-8048-8592e27f5a53.png)

なお、ALBでサブドメインでの振り分けを行うため、Route 53等のDNSへワイルドカードのAレコードを定義しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e3ce9d2b-f624-5e73-03f1-a9a4f0dd2c89.png)

また、サーバ証明書はCertification Manager(ACM)より発行されたものをALBへ割当てて使用しています。
ALBではACMから発行された証明書を無料で利用することができます。
また、発行された証明書は自動更新に対応していますので、手間がかかりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/dfe900c2-c139-7bc3-cd63-7bc0017f911f.png)


## 最後に

Atlassianアドベントカレンダーのエントリと言いつつ、Atlassian色の薄い内容となってしまいました。
（そしてやや雑な感じの記事で申し訳ない・・・）

AWSのマネージドサービスを活用することで、保守性や可用性を考慮したサービス基盤を低コストで構築・運用することができます。また、最近はAtlassianのアプリケーションもDockerで簡単に作れるよということを知ってもらえれば幸いです。

最後に、リックソフトでは、現在エンジニアを募集しています！詳しくは以下のURLをチェックしてください。
https://www.ricksoft.jp/company/recruit.html

それでは。。。