codingecho

日々の体験などを書いてます

Google App Engineを使って運用が辛くならない社内向けWebアプリを作る

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のアカウントと支払の設定

公開準備

公開までは

  1. App Engineを課金可能な状態にしておく
  2. ソースコードを書く
  3. アプリケーションを公開する
  4. App Engineの認証設定で特定のドメインのみ許可するように設定する

こんな感じです。

細かく見ていきましょう。

App Engineを課金可能な状態にしておく

App Engineのコンソールを開いて、以下の図のようになっていれば大丈夫です。

f:id:ytanak:20190127085606p:plain
App Engineのコンソール画面

このような画面になっていなく初期設定が必要であればそれに従ってください。

ソースコードを書く

App Engineの画面右上に左から1番目のCloud Shellアイコンをクリックします。

f:id:ytanak:20190127090027p:plain
左から1番目のCloud Shellをクリックする

ローカルで環境整えることも可能なのですがとりあえず手っ取り早くやるには、この方法が良いと思います。Cloud Shell上でアプリケーション作ってみたいと思います。

次に画面の下にクラウドシェルシェルの画面が現れるので、そこの画面の右上にあるCode Editorをクリックします。

f:id:ytanak:20190127085938p:plain
左から2番目のCode Editorを選択する

Cloud Shellが開くので、ここにコードを書いていきます。ちなみにブラウザはSafariだとうまく動かなかったのでGoogle Chromeを使うのがいいと思います。

基本的にやっている事GitHubにあるGoogle Cloud Platformのサンプルと同じです。

必要なのは main.pyrequirements.txtapp.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

全てのファイルをコピペすると以下の図のようになると思います。

f:id:ytanak:20190127091819p:plain
必要なファイルを用意した状態

アプリケーションを公開する

後はクラウドする上でコマンドを実行するだけです。

まず初めに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 ボタンで設定を保存します。

f:id:ytanak:20190127094936p:plain
認証設定を Google Apps domain に変更する

ちなみに英語が表示されていますが、日本語設定の場合は日本語が表示されると思います。

次に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は優れていると思います。