Google App Engineが社内のWeb Appやちょっとしたツールを公開したいときにとても良さそうだったので紹介したいと思います。
問題点
社内でちょっとWebアプリを提供する環境が欲しいと言ったことはないでしょうか?
Amazon Web ServiceのEC2やGoogle Cloud PlatformのCompute Engine を使っていたり、オンプレミスの環境を用意したりしていますか?
このようなサービスや物理サーバーを使おうとすると、後々になって管理が大変になるだったことがよくあるかもしれません。特にクラウド上で共用で使用しているプロジェクトで、どのインスタンスが使われているかわからなかったり削除してもいいのかわからなくなるなどサーバー管理者にとってとても手間のかかる作業が増えると思います。また少し使うだけなのに、使っていない間も起動しっぱなしになってしまい課金が発生したりします。
社内に公開して外部には公開したくないので認証機能をいれないことも多いと思います。アカウント認証にActive Directoryを使っていることも多い思います。
App Engineを使うとどうなるの?
- 予算管理の時間を節約できます。リクエストがない間は課金が発生しません。
- 認証管理や構築の時間を節約できます。G Suiteの認証にActive Directoryを使用しているならApp Engineでも数ステップの設定でActive Directoryによる認証を使うことができます。
- インフラ管理の時間を節約できます。自動でスケールしてくれたりログをまとめてくれます。
事前に用意すること
- G Suiteと独自ドメイン
- Google Cloud Platformのアカウントと支払の設定
公開準備
公開までは
- App Engineを課金可能な状態にしておく
- ソースコードを書く
- アプリケーションを公開する
- App Engineの認証設定で特定のドメインのみ許可するように設定する
こんな感じです。
細かく見ていきましょう。
App Engineを課金可能な状態にしておく
App Engineのコンソールを開いて、以下の図のようになっていれば大丈夫です。
このような画面になっていなく初期設定が必要であればそれに従ってください。
ソースコードを書く
App Engineの画面右上に左から1番目のCloud Shellアイコンをクリックします。
ローカルで環境整えることも可能なのですがとりあえず手っ取り早くやるには、この方法が良いと思います。Cloud Shell上でアプリケーション作ってみたいと思います。
次に画面の下にクラウドシェルシェルの画面が現れるので、そこの画面の右上にあるCode Editorをクリックします。
Cloud Shellが開くので、ここにコードを書いていきます。ちなみにブラウザはSafariだとうまく動かなかったのでGoogle Chromeを使うのがいいと思います。
基本的にやっている事GitHubにあるGoogle Cloud Platformのサンプルと同じです。
必要なのは main.py、 requirements.txt と app.yaml の3つのファイルです。
main.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): """Return a friendly HTTP greeting.""" return 'Hello World!' if __name__ == '__main__': app.run(host='127.0.0.1', port=8080, debug=True)
requirements.txt
runtime: python37
app.yaml
runtime: python37
全てのファイルをコピペすると以下の図のようになると思います。
アプリケーションを公開する
後はクラウドする上でコマンドを実行するだけです。
まず初めにgcloudコマンドを使うために認証してアクセストークンを取得しておきます。
$ gcloud auth application-default login
このコマンドを実行するとURLが表示されてGoogleアカウントにログインするように言われるので、リンクをクリックしてG Suiteのユーザーとしてログインします。その後ブラウザにコードが表示されるのでそれをコンソール上に貼り付けます。これでデプロイするための設定が完了しました。
次に以下のコマンドでアプリケーションの作成します。
$ cd my_app
$ gcloud app create
以下のようなエラーが出た場合は既にアプリケーションを作成されている状態なので、特に何もしなくて問題ありません。
$ gcloud app create ERROR: (gcloud.app.create) The project [...] already contains an App Engine application in region [us-central]. You can deploy your application using `gcloud app deploy`.
次にアプリケーションをデプロイします。
$ gcloud app deploy
以下のように表示されてこの設定でデプロイしていいか聞かれるので、問題なければ実行します。
Services to deploy: descriptor: [/home/ysnr_tanaka/my_app/app.yaml] source: [/home/ysnr_tanaka/my_app] target project: [my-project] target service: [default] target version: [20190127t092337] target url: [https://my-project.appspot.com] Do you want to continue (Y/n)?
大丈夫です。実行しましょう!
デプロイには数分から10分程度お時間がかかるので、コーヒーを淹れて待ちましょう☕️。
デプロイが完了したら以下のような表示になります。
File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://my-project-123.appspot.com]
ブラウザで開いて確認してみます。
gcloud app browse
上記のコマンドを実行すると https://my-project-123.appspot.com のようにデプロイ先のリンクが表示されるのでクリックします。
Hello World!
が表示されていれば正しくアプリケーションが動いています!
App Engineの認証設定で特定のドメインのみ許可するように設定する
App Engine -> Settings -> Edit ボタンをクリックします。
以下の図のように Google authentication を Google Apps domain に変更して、下のフォームにG Suiteで使用しているドメインを設定します。Save ボタンで設定を保存します。
ちなみに英語が表示されていますが、日本語設定の場合は日本語が表示されると思います。
次にCloud Shell上でアプリケーションの認証設定を以下のように変更します。
app.yaml
runtime: python37 handlers: - url: /.* script: auto login: required
この設定を追加することですべてのURLパスに対して認証を有効にさせます。
設定を有効にするためにもう一度デプロイします。
$ cd my_app
$ gcloud app deploy
これで認証の設定をしたアプリケーションができました。もう一度ログインしていない状態でアプリケーションをブラウザで開いてみると、ログイン画面が表示されると思います。G Suiteのユーザーとしてログインした状態でアクセスすると前回と同じように Hello World!
が表示されます。
おわりに
アプリケーションの作成と公開、認証設定を説明しました。今回はPythonを使ってアプリケーションを作成しましたが、Node.jsやJavaなどのサポートされた言語やフレームワークも自由に使うこともできます。また、Dockerコンテナを動かすこともできるのでライブラリや言語に制限はなかったりします。
サーバーや課金、認証管理に多くの時間を使わなくなるといった点でGoogle App Engineは優れていると思います。