まだ書きかけです!
最終更新
AWS Beanstalk・Google App Engine など、アプリケーションを実行するためのプラットフォーム・基盤について解説します。
目次
アプリケーションPaaS・aPaaSとは
アプリケーション PaaS・aPaaS とは、Web アプリケーションやバッチアプリケーションなどを実行するためのプラットフォーム・基盤です。ここで言う「アプリケーション」とは自分で作ったプログラムでもいいですし、WordPress のような配布されている形態のものでもよいです。
そもそも、アプリケーションは Amazon EC2・Azure Virtual Machine・Google Compute Engine などの仮想マシンで動かすのが最もシンプルです。しかしながら、例えば Web アプリケーションを仮想マシンで動かす場合、下記のような環境設定が必要です。
- Apache・nginx 等 Web サーバのインストール・設定
- PHP・Java・Python 等、ランタイムのインストール
- SSL/TLS 証明書の設置
さらに、運用においては下記のような対応も必要です。
- (冗長化するのであれば) ロードバランサの設定
- (オートスケールしたいのであれば) インスタンスの自動生成・アプリケーションのデプロイ
- OS・ミドルウェアのアップデート・セキュリティパッチあて
アプリケーションPaaS は、上記のような典型的な作業を自動で行ってくれる便利なアプリケーション基盤です。
アプリケーションPaaS のデメリット
デメリットは結構あります。
環境のカスタマイズができない (ものもある)。
インスタンスにログインできない (ものもある)
ローカルディスクがない (ものもある)。
任意のファイルを配置できない (ものもある)。
外部コマンドを実行できない (ものもある)。
ネットワーク接続に制限がある (ものもある)。
対応言語・バージョンが限られる (ものもある)。
Web サーバのカスタマイズの制限がある。
実行時間の制限がある (ものもある)。
最大の問題は、仮想マシン (IaaS) では問題なく動いたアプリケーションが、そのままでは動かない場合がある、というものです。
WordPress を例に…
WordPress はWebサイト構築用のコンテンツ管理システムです。オープンソースで無料であるため、 世界の Web サイトの 3割は WordPress で構築されているとか。ちなみに本サイトも WordPress で構築しています。
WordPress は、シングル構成のサーバ前提のシステムです。具体的には下記のような構成になっています。
- ページのタイトルや本文等のデータは MySQL か MySQL 互換の MariaDB に格納する。フロントは DB から読み込み、コンテンツを表示する。管理画面では更新したコンテンツを DB に書き込む。
- WordPress のプログラム (PHP) やテーマ (外観を管理する HTML・CSS・PHP コード群)・サイト内の画像・プラグインはローカルファイルとして保存する。
MySQL・MariaDB にて管理するページのタイトルや本文については特に問題ありません。表示の際は DB から読む。複数のフロントサーバがあったとしても常に最新情報を DB から取得できますので問題ありません。
問題はローカルファイルとして管理しているプリグラムや画像についてです。(書きかけ)
アプリケーションPaaS一覧
AWS・Azure・GCP が提供するアプリケーションPaaS の一覧です。
- AWS: AWS Elastic Beanstalk
- Azure: Azure Web Apps
- GCP: App Engine (スタンダート環境/フレキシブル環境)
各サービスで思想や構成が異なるので、まずは概要を解説します。
Google App Engine とは
Google App Engine は、Google Cloud Platform のアプリケーションPaaS です。特徴は…すごく説明しづらいです。なぜならば、下記のようなことになっているため。おすすめは、標準環境の 2nd genration です。
- 標準環境 (Standard Environment)
- 1st generation:2008年発表。もともと App Engine と言えばこれ。内部構成は制限が厳しめ。sshログイン不可。ローカルファイル使用不可。外部ネットワークへのアクセスは制限あり。
- 2nd generation:2018年発表。gVisor というコンテナエンジンで稼働し、制限がゆるい。sshログイン不可。ローカルファイル /tmp のみ使用可。外部ネットワークアクセスは自由。
- フレキシブル環境 (Flexible Environment)
- 2017年GA(正式リリース)。実体は仮想マシン (Compute Engine)で、sshログイン可。Docker コンテナで任意環境を作成可能なため、任意の言語利用など、おおむねなんでも可能。欠点は、起動が遅いこと (7~8分かかる)。
Azure Web Apps とは
Azure Web Apps は Azure App Service というサービスの一つです。
Azure Web Apps は、Windows + IIS (Web サーバ) の基盤上でアプリケーションを動かすものでした。近年、App Service on Linux という Linux 環境での・・・コンテナも・・・
AWS Elastic Beanstalk とは
AWS Elasitc Beantalk は 2011年1月に発表された aPaaS サービスです。Azure Web Apps や Google App Engine とは思想が明確に異なります。Elastic Beanstalk を使うと、仮想マシンである EC2 と、ロードバランサ ELB が立ち上がります。Elastic Beanstalk が Apacheなどの初期設定、アプリのデプロイを行ってくれますが、実体は EC2 ですので sshログインして作業をすることも可能です。
Elastic Beanstalk は単体のサービスではなく、EC2 や ELB をまとめて設定してくれる環境設定用ツールと思っても構いません。ただし、オートスケールや環境の自動更新もできるので初期構築のみのツールではありません。
ただ Elastic Beanstalk さんは結構微妙な感じで、Elastic Beanstalk 内からRDS を作成すると RDSを削除することができない、Elastic Beanstalk環境を削除すると RDSも道連れ、など融通の効かないところがあります。
意識高い系エンジニアの中には「Elastic Beanstalk はアプリケーション PaaS ではない」と言う人もいます。
アプリケーションPaaS 比較表
機能比較表をまとめてみました。 詳細は後述。
以下、詳細解説です。
「料金・コスト」詳細説明
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
料金 (2019/04調査・東京) | Beanstalk 自体は無料。EC2・ELB 等は通常どおりの料金がかかる | B1インスタンス (CPU1コア・メモリ1.75GB): 7,235円/月 | $0.07/h |
料金上限設定 | (無料なので) なし | なし | ○ (1日あたりの上限。標準環境のみ。フレキシブル環境は不可) |
無料枠 | Beanstalk は無料なので無料枠はないが、EC2・ALB・RDS などそれぞれの無料枠が利用可能。 | F1 インスタンスは無料 (Windows・メモリ1GB・ストレージ1GB) | ・インスタンス時間 8/日(基本・手動) ・インスタンス時間 28/日(自動) ・ネットワークトラフィック (送信) 1GB/月 ・GCS 5GB 以内 |
停止時の無課金 | 少なくとも EC2 インスタンスはゼロに変更可能で、その場合は無課金となる。ALB は停止という概念がない (多分)。 | × (停止しても課金対象) | 停止すれば無課金。また、アクセスがなければインスタンス数が 0 になるので無課金 |
「CPU/メモリ/ディスク リソース」詳細説明
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
CPU | 選択する EC2 インスタンスタイプ次第 | 0.6GHz, 1.2GHz, 2.4GHz, 4.8GHz | |
メモリ | 選択する EC2 インスタンスタイプ次第 | 128MB, 256MB, 512MB, 1GB | |
ディスク | 選択する EBS 次第 | 標準環境(1st gen):使用不可 標準環境(2nd gen): フレキシブル環境 |
「OS・言語」詳細説明
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
OS | Linux, Windows | Windows, Linux | 標準環境:Google独自環境 フレキシブル環境:gVisor |
言語 | Go .NET Java 7, Java 8 PHP Node.js Ruby Python Tomcat + Docker で何でも | .NET Node.js PHP Java Python | 標準環境 1st gen: Python 2.7 PHP 5.5 Go 1.9 標準環境 2nd gen: Python 3.7 Java 8, Java 11 PHP 7.2 (beta) Node.js Go 1.11 (beta) |
「SSL/TLS・ドメイン・独自ドメイン」詳細説明
デフォルトドメイン
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
デフォルトドメイン | http://[environment-name].elasticbeanstalk.com | http://[mysite].azurewebsites.net | http://[myproject].appspot.com |
作成したアプリケーションにはデフォルトのドメインが割り当てられ、ブラウザでアクセス可能になります。
- AWS Elastic Benastalk の場合: http://[environment-name].elasticbeanstalk.com
- Azure Web Apps の場合:http://[mysite].azurewebsites.net
- Google App Engine の場合:http://[myproject].appspot.com
デフォルトドメインのSSL/TLS
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
デフォルトドメインのSSL/TLS | × | ○ (無料) https://[mysite].azurewebsites.net でアクセス可能。 | ○ (無料) https://[myproject].appspot.com でアクセス可能。 |
デフォルトのドメインは http ですが、これを SSL/TLS でのアクセスが可能かと言うと、Azure Web Apps・Google App Engine は可能です。証明書はマイクロソフトや Google がよきにはからってくれるので自動更新です。期限切れの心配はありません。無料です。デフォルト設定で https 化されているので、URL のスキーマを “https” に変えればそれだけで使えます。
一方、AWS Beanstalk は、デフォルトドメイン *.elasticbeanstalk.com を SSL/TLS 対応させることはできません (たぶん)。独自ドメインを取得し、ACM 設定を行い、ELB にて SSL/TLS 解決する必要があります (たぶん)。
「SSL/TLS」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
SSL/TLS (SNI) | ○ (ELBにて) | ○ | ○ (無料) |
SSL/TLS (IP) | ○ (有償) | ○ (有償) |
「独自ドメイン」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
独自ドメイン | ○ | ○ (外部ドメイン持ち込み または Web Apps にてドメイン有償取得) | ○ (外部ドメイン持ち込み または Google Domain にて有償取得) |
「独自ドメイン+SSL/TLS」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
独自ドメイン+SSL/TLS | ○ (ELBにて可能) | ○ (Basic以上) | ◎ (外部持ち込みドメイン・Google Domain 取得いずれでも無料) |
「SSL/TLSクライアント証明書 」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
SSL/TLSクライアント証明書 | ×? (別途 nginx 等では?) | ○ (clientCertEnabled ) | × |
「ネットワーク」詳細説明
「IPアドレス固定」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
IPアドレス固定 | EC2にEIP設定可能だが、インスタンス増減等で変わってしまう。 ALB の場合は… | ○ (Basic 以上で標準でIPアドレス固定) | 不可 (たぶん) |
「アウトバウンドIPアドレス固定」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
アウトバウンドIPアドレス固定 | 不可 ※IPアドレス範囲は公開 | 不可 (たぶん) ※IPアドレス範囲は公開 |
「IPアドレスによる接続制限」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
IPアドレスによる接続制限 | ○ | ○ | ○ |
「タイムアウト」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
タイムアウト | 設定可能 | 240秒 (言語ごとにさらに制限あり) |
「外部への接続」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
外部への接続 |
「ファイアウォール」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
ファイアウォール | セキュリティグループにて設定可能 | App Engineファイアウォールにて設定可能 |
「WAF」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
WAF | ○ (Application Gateway の WAF と連携可能) | △ (App Engineファイアウォール単体にはリクエスト検証などの機能はない模様) |
「Affinity/Sticky」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
Affinity/Sticky |
「WebSocket」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
WebSocket |
「HTTP/2」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
HTTP/2 |
「複数台構成・負荷分散・スケール」詳細説明
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
シングル構成 | ○ | ○ | ○ |
複数台構成 | ○ | ○ | ○ |
「オートスケール」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
オートスケール | ○ | ○ (Azure Monitor にて。指定日・定期・CPU・ディスク・メモリ・プロセス数など) | ○ (CPU使用率・同時リクエスト率) |
Azure Web Apps では、Azure Monitor と連携してオートスケールを実現します。Azure Monitor ではかなり複雑な条件を書くことができます。代表的な条件は下記です。
- 指定日 (2019年5月1日など)
- 定期 (毎日N時、毎週月曜日N時 など)
- CPU 使用率、メモリ使用率
- ディスクI/O
- HTTP キューの長さ (待ち状態になっているクライアントの下図)
GAE では下記の指標値でオートスケールが可能です。
- CPU使用率
- 同時リクエスト率
- 例:1インスタンスあたりの同時接続数上限を80とし、その 60% 以上の同時接続がある場合にインスタンスを増やす。
「手動スケールアウト・スケールイン」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
手動スケールアウト・スケールイン | ○ | ○ | ○ |
「管理機能」詳細説明
「内部へのログイン」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
内部へのログイン | ○ (中身は EC2) | 標準環境:× フレキシブル環境:○ |
「環境自動更新」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
環境自動更新 | △ (マイナーバージョンのみ自動更新可能) | ○ | ○ |
「環境自動更新の停止」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
環境自動更新の停止 | × |
「環境のカスタマイズ」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
環境のカスタマイズ | △ (フレキシブル環境ならカスタマイズ可能) |
「エラーページカスタマイズ」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
エラーページカスタマイズ | ○ |
「Sorry ページ」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
Sorryページ | ALB または Route53 で可能 | Traffic Manager を前段に配置し、別の Web Apps や Storage に振り分ける |
「デプロイ」詳細説明
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
デプロイ速度 | 標準環境:20秒ほど フレキシブル環境:7~10分 | ||
blue-green デプロイ | ○ (複数の Beanstalk を作成し、swap) | ○ | ○ |
ロールバック |
「CI/CD」詳細説明
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
CI | ○ | ||
CD |
「付加機能」詳細説明
「メール送信」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
メール送信 | △ (SES や SendGrid を利用) | △ (SendGrid) | ○ |
「定期実行・cron」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
定期実行・cron | ○ (ワーカー環境での cron.yaml) | ○ (Web Jobs) | ○ |
「検索」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
検索 | ○ (Elasticsearch Service や CloudSearch を利用) | ○ |
「環境変数管理」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
環境変数管理 | ○ | ○ | ○ |
「秘匿情報管理」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
秘匿情報管理 | Key Vault | Cloud KMS |
「キャッシュ」について
– | AWS Elastic Beanstalk | Azure Web Apps | GAE |
---|---|---|---|
キャッシュ | エッジキャッシュ・Staticキャッシュ(?) |