Alibaba Cloudのプロダクトを組み合わせて「シャッフルランチの企画システム」を作る

## はじめに

普段、私はAWSやGoogleCloudを使用してサービスを構築することが多いのですが、
Alibaba Cloudのアドベントカレンダーをたまたま見つけ、面白そうだと思い試してみることにしました！

今回作るものは「シャッフルランチの企画システム」です。
社内でシャッフルランチを行う機会が多々あるのですが、毎回フォームを用意したり、組み合わせを組むのが大変なため、簡単にシャッフルランチを企画できるサービスを作ってみようと思います！

今回はAlibabaCloudにどんなサービスがあるかを把握するためにも、可能な範囲で組み合わせられるものを使って、贅沢なインフラ構成で「シャッフルランチの企画システム」を作っていきたいと思います！

## [無料枠](https://www.alibabacloud.com/ja/getting-started/introduction-to-alibaba-cloud-free-trial-for-ecs?spm=a3c0i.22593246.5297426520.1.6651470cqwbzlC&id=article_dir_9)

今回、サービスを使うにあたって、無料枠を可能な限り駆使していきたいと思います。
12ページにもわたる、かなり豊富な無料枠があり、試すのに物足りないということはなさそうです！
![スクリーンショット 2023-12-23 17.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/94d24fe3-9b39-7d69-0c9f-cf875a4e879d.png)

※無料枠を使う際に、フォームの申請が必要となり、承認が下りるまで時間がかかります

## 設計

本当は、職能や趣味などによってマッチングを変えるようなアルゴリズムを組み込みたいのですが、今回はAlibaba Cloudを試すのを優先し、最低限の機能を担保したシステムを設計します。

### 仕様

調整さんのようにログインは基本的にしなくとも誰でもすぐに企画できて使えるようなものを想定。

* 企画者は開く日程と最大参加人数、組み合わせ人数の最大数、締切日、概要を決める
* 参加者は空いている日程にニックネームの入力と参加ボタンを押すだけでOK
* 締切日のタイミングで組み合わせを確定させる
* マッチングは完全ランダムで、組み合わせ人数の最大数を元に組み合わせを作る
    * 足りない場合は余りの数ではなく、全体がバランスよくなるようにする(3人、3人,1人のようなグループを作らない)

ゆくゆくの構想でしたいこと

* 趣味や職能に応じたマッチング
* 定期開催機能
* コミュニティ機能 (ランチを通して知らない人と知見が交換できるような)

### ER図

今回はシンプルな設計にするため、テーブル構造は以下とします。
Groupは中間テーブルとして、ユーザーとイベントを多対多で紐付けします。

```mermaid
erDiagram
    User {
        id int
        nickname string
    }
    Event {
        id int
        title string
        description text
        max_participants int
        max_group_size int
        open_date date
        deadline date
    }
    Group {
        event_id int
        user_id int
        group_number int
    }

    User ||--o{ Group : "Belongs to"
    Event ||--o{ Group : "Belongs to"
```

### インフラ構成図

まず、日程やユーザーの管理にDBが必要になるのでPolarDBを使用します。
次にWebサーバーとして、ECSインスタンスを使用します。
ECSインスタンスの前段にはALBを置くことで、負荷を分散させ、WAFによってセキュリティの強化を行います。

![alibaba.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/b970276e-aa39-b203-4495-ccd85e7473ee.png)


一般的なWebアプリの構成になりました！


#### VPC
まずはVPC(Virtual Private Cloud)とvSwitchを作成します。
VPCとは仮想ネットワークで、同一VPC内ではECSのインスタンス同士は物理ネットワーク経由で通信できます。
vSwitchとはVPC内部に更に分割されるsubnetです。
冗長構成を取りたいため、同一ゾーンではなく複数ゾーンで作成しました。

![スクリーンショット 2023-12-24 6.16.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/62ae0228-d92d-bdca-2c47-0b123b9bea37.png)

続いて、NAT Gatewayを作成します。
![スクリーンショット 2023-12-24 6.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/418c9a1c-59e7-9450-60b3-28f9a7f03ddf.png)

#### [PolarDB](https://www.alibabacloud.com/help/en/polardb/polardb-for-postgresql/what-is-polardb)

MySQL, PostgreSQLと互換性のあるデータベースです。
料金的な問題で、今回はシングルクラスター構成にします。
サイズは一番安価なpolar.mysql.g2.medium($ 0.13 / 時間)を選択します。

![スクリーンショット 2023-12-24 6.49.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/cff15d4c-a0ab-e2a6-4858-2fbfb3f4078c.png)


#### ECS インスタンス

今回はテスト的に使うので、ecs.n1.small($0.041 USD /1 時間)を選択します。
イメージはせっかくなのでAlibaba Cloud Linuxを使用してみます。
セキュリティグループのHTTPポートの有効化と、MySQLの3306ポートを開けておくことを忘れないようにしましょう。
また、EIPの有効化とSSHで中に入って作業を諸々行うためにログイン認証の設定も行います。

![スクリーンショット 2023-12-24 6.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/45884e96-859e-8981-a120-42ab122f0d40.png)


#### ALB
負荷分散のために、ALBの設定を行います。
特に詰まるような設定はないかと思います！
![スクリーンショット 2023-12-24 6.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/193fb719-8afd-6af1-79ea-23b7869c38dc.png)


#### WAF
WAFはトラフィックによる課金なので、今回はほとんど心配ありませんね！

![スクリーンショット 2023-12-24 5.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/02709dc3-e4c6-c1a4-0176-2cd468174600.png)

Protection Ruleから必要なルールをつけて、設定します。
今回はデフォルトのBasicテンプレートのみ使用します！

![スクリーンショット 2023-12-24 6.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/c3681f8c-27ec-5afc-ed9d-1d0960c83c9c.png)

### 完成品

今回のために急ぎ作ったのもあり、デザインや機能はまだまだですが、問題なく動作させることができました！
締切のタイミングで、グループを作成する部分を、今回はcronのスケジュール実行により対応しています。

|home|イベント作成|参加登録|
|----|-----|-----|
|![スクリーンショット 2023-12-24 6.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/4b7a1b81-2640-c18e-3891-721fe5c5e1b1.png)|![スクリーンショット 2023-12-24 6.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/e17aed0e-0228-e24a-27d2-9d86ab91d545.png)|![スクリーンショット 2023-12-24 6.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/f05586da-a579-6244-0ef5-f683b8b505f9.png)|

## まとめ

* 日本語化や英語化されておらず中国語で頑張って読まないといけない部分がいくつかあるのが大変
* 使い勝手は他のクラウドサービスと比較しても、遜色なく使える！
* コストは柔軟な支払い方法があり、AWSより安く済ませられるものもある
    * 何よりその場で大体のコストがすぐにわかるのはありがたい！

## おわりに

今回、こういった機会を提供してくださったAlibaba Cloudさんには感謝します！
業務でももしかしたら使うことがあるかもしれないので、その際はお世話になります！


## 参考文献
* [Alibaba Cloudの中国版/国際版/日本版比較表（and AWS/Azure/GCP）](https://qiita.com/ohiro18/items/02c5da6d6590dfe3ed0d)