Function Compute でコンテナの Web アプリを作る
はじめに
Function Compute の Web アプリ機能でコンテナを起動できるようになったので、試してみます。
Migrate Web applications to Function Compute
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
Function Compute は指定した Container Registry のイメージリポジトリからイメージを取り出し、コンテナをデプロイ及び起動します。デプロイ進捗を割合で指定することもでき、カナリアデプロイを実現できます。
Manage web applications
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
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']))
FROM python:3.6
EXPOSE 9000
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
flask
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
<!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 を選択します。
注意点は以下の通りです。
- Container Image
- イメージリポジトリ
tech4all
のlatest
タグを選択します
- イメージリポジトリ
- Start Command
- Docker の CMD コマンドにあたりますので、 Dockerfile には CMD を記載しないようにします
- Listener Port
- Python は 9000 ポートでしか Function Compute が受け付けていませんので 9000 を指定します
- Environment Variables
- Web アプリに渡したい環境変数を記載します
- 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 Instance や Kubernetes のコンテナ専用の実行環境を使用しなくても、Web アプリを作成することができました。
これらのサービスと Function Compute との使い分けは、アプリの規模であると考えられます。
互いに連携しあうコンテナが複数ある場合や、同一コンテナを複数起動する場合は、コンテナの管理が煩雑になるため、先に上げたコンテナ専用サービスを使用することが望ましいです。
Function Compute にはアプリの呼び出しを監視する機能やデプロイ機能もあるため、単一コンテナを起動させたい場合にお勧めです。
Author And Source
この問題について(Function Compute でコンテナの Web アプリを作る), 我々は、より多くの情報をここで見つけました https://qiita.com/kumiizoo/items/7dd4c2a762c017ba0f08著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .