Function Compute でコンテナの Web アプリを作る


はじめに

Function Compute の Web アプリ機能でコンテナを起動できるようになったので、試してみます。

Migrate Web applications to Function Compute

https://www.alibabacloud.com/help/doc-detail/161884.htm

Function Compute では HTTP、OSS トリガーで起動する関数や、時間駆動で起動する関数を作成することができ、Web アプリ機能では、Python、Java 等の Web アプリを作成することができます。

アーキテクチャ

GitHub に Dockerfile 及びソースコードをプッシュすると、Container Registry が Webhook 経由でプッシュを検知し、Dockerfile からコンテナイメージをビルドします。

Build an image for a Java application by using a Dockerfile with multi-stage builds

https://www.alibabacloud.com/help/doc-detail/173175.htm

Function Compute は指定した Container Registry のイメージリポジトリからイメージを取り出し、コンテナをデプロイ及び起動します。デプロイ進捗を割合で指定することもでき、カナリアデプロイを実現できます。

Manage web applications

https://www.alibabacloud.com/help/doc-detail/162396.htm

Special Thanks

本記事を作成するにあたり、SB Cloud 様のブログを参考にさせて頂きました。

Alibaba Cloud Container Registry (ACR) でコンテナイメージのビルドパイプラインを実装する

https://www.sbcloud.co.jp/entry/2020/04/01/container_registry

では手順を説明していきます。

1. GitHub にユーザーを作成する

GitHub のソースコードリポジトリとソースコードリポジトリを読み取る Admin 権限を持つユーザーを作成します。

今回はソースコードリポジトリ alieaters-handson-serverless とユーザー xxx-develop を作成します。

2. Container Registry に名前空間を作成する

イメージリポジトリを設置する名前空間をまず作ります。

Alibaba Cloud コンソールにログインし、Container Registry の Namespaces を選択します。

上の写真は名前空間 tech4all を作成した状況です。

3. Container Registry にイメージリポジトリを作成する

イメージリポジトリを作成します。

Container Registry の Repositories を選択します。

写真はイメージリポジトリ tech4all を作成した状況です。

Function Compute からイメージリポジトリを使用するため、Public にします。

※公式ドキュメントには記載がないですが、Function Compute の画面に Public にする旨が記載されています。

GitHub のソースコードリポジトリとソースコードを読み取る GitHub ユーザーを指定します。

イメージリポジトリが作成されると、自動で GitHub の Webhooks に Container Registry のエンドポイントが追加されます。

4. Container Registry のイメージリポジトリにビルドルールを作成する

ソースコードリポジトリを起点とするビルドルールを作成します。

Container Registry の Repositories の tech4all を選択し、Build を選択します。

今回はソースコードリポジトリの master ブランチのルートディレクトリに Dockerfile があり、latest タグでコンテナイメージをビルドするルールを作成します。

上の写真はビルドルールを作成済みの状態です。

5. Web アプリを開発する

今回は Flask を使用した Web アプリを開発します。

ディレクトリ構成

/
├── app.py
├── Dockerfile
├── requirements.txt
└─app
    ├── __init__.py
    └── templates
        └── index.html
app.py
import os

from app import create_app

# 環境変数 APP_ENV, APP_KEY, DEBUG を使用
app = create_app(os.environ['APP_ENV'])
app.secret_key = os.environ['APP_KEY']

# 9000 ポートを開放する
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=9000, debug=bool(os.environ['DEBUG']))
Dockerfile.txt
FROM python:3.6
EXPOSE 9000
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
requirements.txt
flask
app/__init__.py
from flask import Flask, render_template


def create_app(env):
    app = Flask(__name__)

    @app.route('/', methods=['GET'])
    def index():
        return render_template('index.html')

    return app
app/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>close-clothes</title>
</head>
<body>
{% block content %}
    <form action="/user" method="post">
        <div>
            <input type="text" name="user_name" size="6">
            <select name="role_name">
                <option value="admin">admin</option>
            </select>
            <button>join us!</button>
        </div>
    </form>
{% endblock %}
</body>
</html>

6. Function Compute に Web アプリを作成する

Function Compute の Application Center を選択します。

Web アプリのフレームワークに Container を選択します。

注意点は以下の通りです。

  1. Container Image
    • イメージリポジトリ tech4alllatest タグを選択します
  2. Start Command
    • Docker の CMD コマンドにあたりますので、 Dockerfile には CMD を記載しないようにします
  3. Listener Port
    • Python は 9000 ポートでしか Function Compute が受け付けていませんので 9000 を指定します
  4. Environment Variables
    • Web アプリに渡したい環境変数を記載します
  5. Application Domain Name
    • Alibaba Cloud DNS を使用したカスタムドメインを使用する場合は Customize Domain Name を選択します

デプロイが始まるとログが流れ始めます。

7. 関数のポートを 9000 に指定する

関数が出来上がっているので、関数で受け付けるポートに 9000 を指定します。

Function Compute の Services and Functions の tech4all を選択します。

写真は既に 9000 に指定した状態です。

ポートは関係ないですが、Memory は 1024MB 以上でないと起動しないようになっています。

8. HTTP メソッドを編集

Web アプリで受け付ける HTTP メソッドを編集します。

Function Compute の Services and Functions の tech4all を選択します。

受け付ける HTTP メソッドを選択します。

9. Web アプリにアクセス

Web アプリの準備が整ったので、早速アクセスしてみます。

Function Compute の Application Center の tech4all を選択します。

Domain Name が出来上がっているのでアクセスします。

寂しい画面ですが、HTML が表示されました!

アクセスログ及びアプリログは Application Center で確認できます。

【appendix】カナリアデプロイを実現する

アプリのデフォルトバージョンに対するカナリアリリースバージョンの割合を設定し、カナリアデプロイを実現します。

Function Compute の Application Center の tech4all を選択します。

カナリアデプロイを実現したいバージョンの Set to Canary Release Version を選択します。

Canary Release Weight の割合をスライドします。

おわりに

Elastic Container InstanceKubernetes のコンテナ専用の実行環境を使用しなくても、Web アプリを作成することができました。

これらのサービスと Function Compute との使い分けは、アプリの規模であると考えられます。

互いに連携しあうコンテナが複数ある場合や、同一コンテナを複数起動する場合は、コンテナの管理が煩雑になるため、先に上げたコンテナ専用サービスを使用することが望ましいです。

Function Compute にはアプリの呼び出しを監視する機能やデプロイ機能もあるため、単一コンテナを起動させたい場合にお勧めです。