* この投稿は米国時間 8 月 4 日、Product Manager である Karolina Netolicka によって投稿されたもの(投稿はこちら)の抄訳です。

Google App Engine では通常、Google Cloud Platform Console かコマンドラインを使ってアプリケーションを管理します。ただし、場合によっては、プログラム内からアプリケーションを管理しなければならないことがあります。たとえば、独自に作成したカスタム ツール チェーンから App Engine にデプロイしなければならない場合や、独自の A/B テスト フレームワークを記述したい場合などです。

こうしたことはすべて、App Engine Admin API で可能になります。私たち Google はこのたび、この API を GA(一般公開)リリースしました。

Admin API は、アプリケーションの新バージョンのデプロイや、サービスのトラフィック管理だけではなく、インスタンス クラスなど、アプリケーションのさまざまな構成設定の変更にも使用できます。

さらに、App Engine Flexible Environment をゼロにスケールダウンするために個々のバージョンを止めることも可能です。この API によって複数の App Engine サービスを並列にデプロイできるので、デプロイのスピードもアップします。

なお、Google APIs Explorer を使用すれば、簡単に API を試し、どのような機能が得られるのかがわかります。


使い方の例


上で触れたシナリオに話を戻しましょう。アプリケーションの新バージョンをデプロイし、本番トラフィックの 50 % を使ってテストしたり、それ以外のトラフィックを少しずつ新バージョン向けに移行したりするスクリプトを書くことをイメージしてください。

以下は、その基本的な手順です。詳細は Getting Started ガイドを参照してください。

バージョンのデプロイは、一般に次のステップで進めます。

  1. Google Cloud Storage バケットにアプリケーションのリソースをステージングします。
  2. app.yaml ファイルを JSON マニフェストに変換します。
  3. Admin API に HTTP POST 要求を送って新バージョンを作ります。

この例では、ソースコードがすでにステージングされているバージョンをデプロイします。

最初に、次の内容で “helloworld.json” というファイルを作ります。

{
  "deployment": {
    "files": {
      "main.py": {
        "sourceUrl": "https://storage.googleapis.com/admin-api-public-samples/hello_world/main.py"
      },
    }
  },
  "handlers": [
    {
      "script": {
        "scriptPath": "main.app"
      },
      "urlRegex": "/.*"
    }
  ],
  "runtime": "python27",
  "threadsafe": true,
  "id": "appengine-helloworld",
  "inboundServices": [
    "INBOUND_SERVICE_WARMUP"
  ]
}

次に、Admin API に HTTP POST 要求を送って新バージョンを作ります。

POST 
https://appengine.googleapis.com/v1/apps/my-application/services/def
ault/versions helloworld.json

(実際にこの要求を送るためには、認証トークンをセットアップする必要があります。詳細は Getting Started ガイドを参照してください)

応答には長時間実行されるオペレーションの ID が含まれているので、それを使ってポーリングすれば、デプロイがいつ終わったかがわかります。

バージョン間でトラフィックを分割するには、少なくとも別のバージョンが 1 つ必要です。別バージョンは、バージョン ID を変更した同じアプリケーションをデプロイすることで作成できます。

たとえば、次の JSON マニフェストを使い、上と同じ手順に従って “appengine-goodbyeworld” バージョンをデプロイしてください。

{
  "deployment": {
    "files": {
      "main.py": {
        "sourceUrl": "https://storage.googleapis.com/admin-api-public-samples/goodbye_world/main.py"
      },
    }
  },
  "handlers": [
    {
      "script": {
        "scriptPath": "main.app"
      },
      "urlRegex": "/.*"
    }
  ],
  "runtime": "python27",
  "threadsafe": true,
  "id": "appengine-goodbyeworld",
  "inboundServices": [
    "INBOUND_SERVICE_WARMUP"
  ]
}


バージョンのデプロイに成功したら、次の要求でトラフィックの 50 % をこのバージョンにルーティングします。

PATCH 
https://appengine.googleapis.com/v1/apps/my-application/services/def
ault/?updateMask=split { "split": { "shardBy": "IP", "allocations { 
"appengine-helloworld": 0.5, "appengine-goodbyeworld": 0.5 } } }

それでは http://<your-project-id>.appspot.com にアクセスしてアプリケーションを見てみましょう。ページをリロードすると、要求がどちらのバージョンのアプリケーションにルーティングされたかによって表示内容が変わります。

バージョン間でトラフィックを移行するもう 1 つの方法は、App Engine の Traffic Migration 機能を使用することです。そうすれば、新インスタンスに十分なウォームアップのための時間を与えながら、次第にトラフィックを移して、できるだけ早く新バージョンに全面的に移行できます。

PATCH 
https://appengine.googleapis.com/v1/apps/my-application/services/def
ault/?updateMask=split&migrateTraffic=true {"split": { "shardBy": "IP", "allocations": { 
<"appengine-goodbyeworld": 1 } } }

その他の情報

App Engine Admin API ドキュメントには、API の認証獲得、特定のプログラミング言語から API を呼び出すためのクライアント ライブラリなど、Admin API の使い方が完全な形で掲載されています。

Admin API により、ご使用のツールで App Engine アプリケーションを管理できるようにして、日常のワークフローを単純化していただければと思います。


- Posted by Karolina Netolicka, Product Manager