フリーランスとしてアリババクラウドにWebアプリケーションを導入する方法 

この記事を通して、私がクラウド上にWebアプリケーションをデプロイする際に使用しているベストプラクティスを共有したいと思います。

**本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/my-best-practices-for-deploying-a-web-application-in-alibaba-cloud_593826)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。**

この記事は[Medium Blogging Platform](https://medium.com/@liptanbiswas/best-practices-for-deploying-a-web-application-in-alibaba-cloud-ed37a6dc01?spm=a2c65.11461447.0.0.3a3757aaSRdB8Y)でも公開されています。

この記事では、私がウェブアプリケーションをクラウド上にデプロイする際に使用しているベストプラクティスを共有したいと思います。私はフリーランスとして働いていますが、最近、クライアントの一人から小さな組織のためにSuiteCRMのセットアップを依頼されました。私はAlibaba Cloudのチュートリアルを頻繁に書いているので、クライアントには同じクラウドプラットフォームを使うことを勧めました。100人近いユーザーと30人以上の同時使用ユーザーに対して、私が推奨した構成は以下の通りです。

1、PHP-FPMでNginxをインストールするためのvCPU2台、RAM4GBのECSインスタンス。
2、MySQL用のRDSインスタンスにApsaraDB for RDS、コア1GB、RAM1GB、ストレージ10GB。
3、メール送信用のDirect Mail。

私が行った手順は非常にシンプルで、ほぼ全てのPHPベースのアプリケーションに採用することができます。

初めてAlibaba Cloudを利用する方は、[こちらのリンクからAlibaba Cloudにサインアップ](https://account.alibabacloud.com/register/intl_register.htm?spm=a2c65.11461447.0.0.3a3757aaxK9yJs&biz_params=%7B%22intl%22:%22%7B%5C%22referralCode%5C%22:%5C%22fmj2og%5C%22%7D%22%7D)してください。300米ドル相当の新規ユーザークレジットを無料で取得することができ、これを使って様々なAlibaba Cloud製品を試すことができます。

###ECSインスタンスの作成
Alibaba Cloudでは、クラウドプラットフォームの利用を開始するために必要なほぼすべての情報を文書化しています。Alibaba Cloudの利用開始方法については、[Getting Started Tutorials](https://www.alibabacloud.com/ja/getting-started)や[Tech Share Blog](https://www.alibabacloud.com/blog?spm=a2c65.11461447.0.0.3a3757aazuE4B9)を利用することができます。最もわかりやすい手順は[クイックスタートガイド](https://www.alibabacloud.com/help/ja/doc-detail/25422.htm)に記載されており、ECSインスタンスを作成する際に使用するベストプラクティスを説明します。

Alibaba Cloudコンソールにログインし、Elastic Compute Serviceインターフェースに移動します。Create Instanceボタンをクリックすると、簡単にインスタンスを作成することができます。注意すべき点は以下の通りです。

1、リージョン：アリババクラウドは世界中にデータセンターを持っているので、アプリケーションのユーザーに地理的に近い地域を常に選択してください。データセンターがユーザーの近くにあると、ネットワークの遅延が少ないため、ウェブサイトの読み込みが非常に速くなります。私の場合、組織がムンバイに拠点を置いていたので、ムンバイ地域を選択しました。
2、課金方法：インスタンスを24時間365日継続的に運用する場合は、月額課金を選択すると、従量課金に比べて価格が半分以下になるため、常に月額課金を選択する必要があります。例えば、2つのvCPUと4GB RAMの共有タイプのECSインスタンスの月額サブスクリプションコストは23ドルですが、同じインスタンスをPay-As-You-Goで利用した場合、1時間あたりのコストは0.103ドルとなります。月間コストは、$0.103*24\*30 = $74.16 USDになります。

3、インスタンスタイプ：要件に応じてインスタンスタイプを選択します。必要に応じて後からリソースを増やすことができます。
4、イメージ：ECS インスタンスにインストールしたいアプリケーションを Marketplace イメージで見つけることができますが、常にクリーンな公式イメージで自分でインストールすることをお勧めします。後でアプリケーションにエラーが発生した場合、どこを見ればいいかわかるようになります。
5、ストレージ：システムディスクは ECS インスタンスがリリースされると削除されます。インスタンスが誤って削除されてもディスクは保持されるので、可能な限りデータディスクを使用してください。
私が使用した設定は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/93f25a1d-43ef-b38a-cda1-f0c036b5355f.png)

デフォルトで作成されるVPCを選択することができます。その中に4092個のインスタンスを追加することができます。私はECSインスタンスごとに異なるセキュリティグループを使用しているので、個別に設定することができ、未使用のポートが開かれていないことを確認します。

もう一つ重要なのは、パスワードを使うのではなく、キーベースの認証を使うことです。すでにキーペアを持っている場合は、公開キーをAlibaba Cloudに追加します。持っていない場合は、Alibaba Cloudを使って作成することができます。キーは非常に安全な場所に保管し、キー自体はパスフレーズで暗号化されていることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/eb231e9b-aa54-88b6-aada-71beb3e4984d.png)

ECSインスタンスを作成する際の注意点は以上です。

###ECSインスタンスの設定
インスタンスを作成してターミナルにログインしたら、ウェブサイトをセットアップする前に考慮すべきことがいくつかあります。

1、コマンドを実行するためにrootアカウントを使用するのではなく、最初の接続にsudoユーザーを設定し、常にコマンドを実行するためにsudoユーザーを使用します。また、あまりにもsudoユーザーのためにキーベースの認証を設定し、完全にrootログインを無効にすることができます。
2、ベースイメージは常に更新しておきましょう。例えば、Ubuntu Serverで以下のようなコマンドを実行します。
3、Alibabaのベースイメージは、必要のない余分なパッケージを持っていません。また、必要のないパッケージをインストールしないことに注意してください。
4、インストール中に調子が悪くなった場合は、システムディスクを変更することで、いつでもインスタンスをリセットすることができます。インスタンスを削除して再作成する必要はありません。

sudo ユーザーを作成し、その中で key based auth を設定しました。ベースイメージを更新し、無人システムのアップグレードを設定しました。Nginx web-serverをインストールするためのチュートリアルに沿って、Nginx web-serverをインストールし、さらに、PHP-FPMを使ってPHP 7.2をインストールしました。PHP 7.2は現時点で入手可能なPHPの最新バージョンです。最新のソフトを使うことで、バグもなく、処理速度も速くなり、安定した運用ができるようになります。最後に、SuiteCRMのアーカイブを公式サイトからダウンロードして、Nginxにデプロイしてみました。

アプリケーションのインストールは、[Getting startedのチュートリアル](https://www.alibabacloud.com/ja/getting-started/projects)や[Tech Shareの作者が書いたチュートリアル](https://www.alibabacloud.com/blog?spm=a2c65.11461447.0.0.3a3757aaPzSq8i)を参考にしてください。

###セキュリティグループルールの設定
ECS インスタンスのセキュリティグループでは、未使用のポートを開かないようにすることが非常に重要です。私がSuiteCRMインスタンスに使用したセキュリティグループのルールを見てください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f3f2f41f-c639-b7f6-418d-8dd1408e89d6.png)

すべての ICMP パケットと一緒にポート 22, 80, 443 だけを許可していることがわかります。22番ポートはSSH接続に使われています。ポート80は安全ではないHTTPポートで、私の場合はHTTPSの443番ポートにリダイレクトしています。ICMPパケットは、ホストが生きているかどうかを確認するためのpingに使われます。ICMPパケットを削除しても問題ありませんが、インスタンスへのpingができなくなります。

###RDSインスタンスの作成
RDSインスタンスを作成する前に頭に浮かぶ最初の疑問は、なぜそれが必要なのかということです。また、MySQL、MariaDB、PostgreSQL、MongoDBなどのオープンソースのデータベースサーバーをECSインスタンス自体にインストールすることもできます。

この質問に対する答えは、[RDSインスタンス用のApsaraDB](https://www.alibabacloud.com/ja/product/apsaradb-for-rds-mysql)は速度とセキュリティのために最適化されているということです。デフォルトでは、作成したインスタンスはホワイトリストに登録されたインスタンスのみがアクセス可能です。

ECSインスタンスを作成する際の注意点を見てみましょう。

1、リージョン：ECSインスタンスが作成されるデータベースインスタンスを作成する際には、必ず同じリージョンを選択してください。また、両者が同じVPC内にあることを確認してください。これにより、同じネットワーク内のホスト間で無料のイントラネットデータ転送を活用することができます。もう一つの利点は、ECSインスタンスのプライベートIPアドレスのみをホワイトリスト化する必要があることです。これにより、データベースのセキュリティが大幅に向上します。
2、課金：繰り返しになりますが、毎月のサブスクリプションのコストは、Pay-As-You-Go方式よりも低くなっています。ニーズに応じて選択してください。
3、容量：あなたは、1コア、1 GBのインスタンス、および5 GBのストレージなどのローエンドの構成で開始することができます。後で要件には、リソースを増やすことができます。
4、アカウント：MySQL 5.6 インスタンスのマスターアカウントは、必要な場合を除き、絶対に作成しないでください。データベースごとにデータベースとデータベースユーザを作成します。
以下は私がSuiteCRMで使用したRDSの設定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/002c9109-af32-073f-5c84-91dd4760558c.png)

MySQL RDSインスタンスが有効になったら、インスタンスのセキュリティタブからECSインスタンスをホワイトリストにしました。IPアドレスをホワイトリスト化するとすぐに、RDSインスタンスのホスト名とポート番号を取得しましたが、これはMySQLのデフォルトポート "3306 "でした。「suitecrm」という名前のデータベースと「suitecrm」という名前のデータベースユーザを作成し、そのユーザに読み書きのアクセス権を与えました。

###HTTPSの使用
インターネットの発達に伴い、毎日のように多くのウェブサイトが追加されています。Let's Encrypt証明書局がSSL証明書を無料で提供するようになってからは、すべてのWebサイトでSSLを利用することがトレンドになりました。セキュリティを確保するためには、WebアプリケーションでSSLを利用することは非常に重要です。やりとりされているデータが暗号化されていないと、ネットワークの中を盗み聞きされて機密情報を抜き取られてしまう可能性があります。

Alibaba Cloudも[SSL証明書](https://www.alibabacloud.com/ja/product/certificates)を提供していますが、私の感覚ではかなり高額です。しかし、高価なものには余分な保証がつきものです。Alibaba Cloudが提供するSSL証明書は、企業ユーザーに適しています。

SuiteCRMの導入では、SuiteCRMのWebアプリケーションのセキュリティを確保するために、Let's Encryptの無料SSLも利用しました。Let's Encrypt CAのクライアントアプリケーションであるCertbotで証明書を生成するには、ドメインをサーバーに向ける必要があります。

アリババクラウドでは、[ドメイン名](https://www.alibabacloud.com/ja/domain)を無料のwhois保護付きで非常にリーズナブルな料金で提供しています。私の場合、クライアントは既に他所から購入したドメイン名を持っていました。私はサブドメインを作成し、そのドメインをECSインスタンスに向けました。Certbotをインストールして、簡単に証明書を生成することができました。証明書の有効期限が3ヶ月ごとに切れているので、証明書を自動的に更新するためのcronジョブを設定することを忘れないでください。

###ダイレクトメールの設定
エンタープライズグレードのウェブサーバーを作成するには、専門知識と時間が必要であり、維持するためのコストが非常に高くなるため、自分でメールサーバーを設定することは避けるべきです。ちょっとした設定ミスでメールが直接スパムフォルダに入ってしまうこともあります。

アリババクラウド[ダイレクトメールサービス](https://www.alibabacloud.com/ja/product/directmail)は、SMTPを使用してアプリケーションからメールを送信する安価な方法を提供しています。毎日最初の200通までは無料です。私の場合は1日200通で十分で、無料枠を超えたメールも激安です。ダイレクトメールに新しいメールサブドメインを追加してみました。ドメインを追加した際に、DNSの更新を求められました。指示通りにやってみましたが、DNSの検証に時間がかかりました。一度完了したら、送信者アドレスを追加して、SMTPサーバをアプリケーションで使用できるようにしました。

###ウェブベースのインストール
ようやく、すべての準備が整いました。ECSでホストされているSuiteCRMアプリケーション。データベースサーバーはRDS用のApsaraDBでホストされています。ソフトウェアをインストールするためのウェブベースのインストールを簡単に行うことができました。

以下は、SuiteCRMのWebベースのインストール中にデータベースサーバーに提供した設定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6e549130-fa66-daf7-fb93-80d2d3495271.png)


同様に、必要な情報をすべて記入し、SMTPサーバの詳細を提供しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c1baca82-4998-189e-ae94-0ccaf1c70c41.png)

最終的に、私のアプリケーションはAlibaba Cloud上にデプロイされました。さらに、[ApsaraDB for Memcache](https://www.alibabacloud.com/ja/product/apsaradb-for-memcache)を使用してSuiteCRMのセッションキャッシュを保存し、[WAF](https://www.alibabacloud.com/ja/product/waf)を使用して侵入してくる脅威からアプリケーションを保護することをクライアントに提案しました。しかし、クライアントは、月々の請求額が増えることを理由に、これらの提案の実装を拒否しました。しかし、クライアントはアリババクラウドプラットフォーム上のアプリケーションのパフォーマンスを見て非常に満足していました。

私はAlibaba Cloud Tech Shareプラットフォームで技術ブログを頻繁に書いています。以下の[リンク](https://www.google.co.in/search?spm=a2c65.11461447.0.0.3a3757aat1Kh6f&q=site:alibabacloud.com/blog%20Liptan)にアクセスして、私が書いたチュートリアルを見つけてください。また、私はAlibaba Cloud Tech Shareプラットフォーム上のUbuntu 16.04にSuiteCRMをインストールするために私が従っている実行するための手順とコマンドの詳細なガイドを書きます。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*