2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-04

はじめに

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 アプリを作成することができます。

アーキテクチャ

t_27.png

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 を作成します。

t_06.png

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

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

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

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

t_01.png

t_02.png

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

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

Container Registry の Repositories を選択します。

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

t_03.png

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

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

t_04.png

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

t_05.png

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

t_07.png

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

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

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

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

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

t_08.png

t_09.png

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 を選択します。

t_10.png

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

  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 を選択します

t_11.png

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

t_12.png

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

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

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

t_22.png

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

t_23.png

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

t_24.png

8. HTTP メソッドを編集

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

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

t_25.png

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

t_26.png

9. Web アプリにアクセス

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

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

t_13.png

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

t_14.png

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

t_20.png

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

t_17.png

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

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

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

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

t_21.png

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

t_19.png

おわりに

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

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

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

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

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?