新しい IBM Developer JP サイトへようこそ!サイトのデザインが一新され、旧 developerWorks のコンテンツも統合されました。 詳細はこちら

API サーバーと Cloudant を使用した CouchDB インスタンスをデプロイして、気候評価システムを作成する

人々が自宅でクリーン・エネルギーを使用するようになれば、気候は実際に改善されていくでしょう。けれども多くの場合、民間部門 (自宅など) での消費量を大きく上回っているのは商業部門でのエネルギー消費量です。商業部門でのエネルギーの多くは、私たちが購入する製品を製造するために消費されています。一部の製品には省エネ・ラベルが付けられているとは言え、その製品を製造するために使用されたエネルギーの量とタイプ (つまり、化石エネルギーまたは再生可能エネルギーのどちらであるか) を知る手掛かりは何もありません。さまざまな製造業者の製品をまたがって気候への影響を比較できるとしたら、さらにエネルギーだけでなく水消費量などについても影響を比較できるとしたら、気候の改善につながると思いませんか?今、何が必要とされているかと言えば、ある種のラベリング・システムとして消費者に表示できる、製品の包括的な気候に対する影響評価です。概念としては、既存の製品ラベリング・システムを拡張して、包括的な気候に対する影響評価 (CIR) を組み込み、販売場所 (POS) で CIR を (店内またはオンライン上の) 消費者の目に触れられるようにします。

このような CIR には、最終的に次のような項目を含めることが考えられます。

  • エネルギーの使用効率 (現在、多くの製品に表示されています)
  • おそらく二酸化炭素排出量として表記された、製品を製造するためのエネルギー (およびエネルギー混合)
  • 製品の予測寿命 (製造エネルギーと使用エネルギーを比較しやすくなります)
  • 製品の製造に伴うその他 (二酸化炭素以外) の温室効果ガスの排出量 (化学肥料から排出されるガスなど)
  • その他の消費資源 (製品の製造に使用された水など)
  • リサイクル可能性
  • 修理可能性 (Right to Repair (修理する権利) イニシアチブの一環として)

こうしたラベリング・システムに伴う重要な課題の 1 つとして、何よりもまず、ラベルを読む対象者がその内容を理解できるようにするとともに、記載される項目という点で包括的なものにしなければなりません。この CIR は (現在のほとんどの省エネ・ラベルや食品ラベルのように) 製品上に印刷されることになるでしょう。けれどもその前に、スマートフォンを使用した POS スキャンによって、バーコードを可視の評価に変換できるようにしたいと思います。

POS への製品の輸送が気候に与える影響の評価も記載すると、さらに有益な CIR になるでしょう。当然ながら、こうした影響評価が製品上に印刷される可能性はほとんどありませんが (POS によって影響が異なる可能性があるため)、これを検索して表示するためにスマートフォン (この場合、場所がわかります) またはオンラインを使用できるようにするのも一考です。

このようなラベリング・システムを作成する取り組みは大がかりで世界的な事業であり、基礎となる多くのコンポーネント、テクノロジー、協力への合意が必要になります。私たちは現在、エネルギーを対象とした Call for Code 2020 Challenge に向けて、このラベリング・システムを実現するために必要なコンポーネントをいくつか作成するよう、開発者を奨励しています。これらのコンポーネントは以下のカテゴリーに分類されます。

  • コア・アーキテクチャー
    付属のスターター・キットを使用して、消費者向け API をサポートする基本的なシステムを稼働させます。
  • 評価の表示
    CIR を (例えばモバイル・デバイス上の拡張現実を使用して、または検索エンジン内や製品リスト上などで) 表示する、新鮮で興味深い方法を開発します。
  • データ・サイエンス
    ロウ・データを選択されたラベルにマッピングする最良の方法を判断します。消費者に数字のリストを公開するだけでは、消費者はその内容を理解できません。ロウ・データをできるだけ少ない項目に集約するにはどうすればよいかを考える必要があります。例えば、エネルギーを二酸化炭素生成量 (エネルギー量と再生可能エネルギーの使用量の合計) として表す方法と、この 2 つを分けて表示する方法とでは、どちらが効果的でしょうか?製品の寿命は長くても、それを製造するために必要なエネルギー量が多い場合、エネルギー量を減らして製品の寿命を短くしたほうがよいでしょうか?アルゴリズムを試すには、サーバー・サイドにアルゴリズムを配置することも (つまり、アルゴリズムの出力を、API から返される製品情報に追加します)、クライアント・サイドでアルゴリズム実行することもできます。それとは別に、多数の製品に関する詳細情報の前に、集計データ (例えば、国別/地域別の二酸化炭素を基準とした集計) を記載する方法も考える必要があります。
  • ラベリングの設計
    包括的で、かつ消費者が理解できるラベルの設計を提案する前に、実験 (および、場合によってはユーザー・テスト) を行います。実験には、食品ラベルと既存の省エネ・ラベルを例として使用できます。
  • 追加のストーリーボード
    製造業者、管理者、監査員であるユーザーを対象とした追加のストーリーボード (およびインターフェース) を開発します。

エネルギーを対象とした Call for Code 2020 Challenge に向けて、このチュートリアルに付属のスターター・キットを詳しく調べ、消費者向け API をサポートする基本的なシステムを稼働させてください。さらに有効なアーキテクチャーを開発できる可能性も、上記のコンポーネントのいくつかを追加できる可能性もあります。

注: このソリューション・スターターは当初、スイスのジュネーブにある国連人権事務所で 2020年2月27~28日に作成され、その後 4 週間にわたって構築されたものです。この取り組みには、JPMorgan Chase、Persistent Systems、IBM、および Red Hat の科学技術者が貢献しました。

学習の目的

このチュートリアルでは、ソリューション・スターターとして、消費者向け API をサポートする、気候への影響を評価するプロトタイプ・システムをプロビジョニングする方法を説明します。また、基本的なアーキテクチャーについても説明します。このアーキテクチャーを実験台に、気候評価システムの追加コンポーネントを作成できます。このチュートリアルで説明するコンポーネントは以下のとおりです。

  • 個々の製品評価を格納する CouchDB NoSQL データベース層。
  • データベースにデータを挿入し、データベースからデータを抽出するために使用できる、基本的な API サーバー。この API は OpenAPI (Swagger) ドキュメントとして公開されているので、独自のクライアントを作成できます。
  • 上記のコンポーネントを IBM Cloud にデプロイするためのツール (無料枠のプランで使用できます)。

データベースには初期のサンプル・データが入力されるので、すぐに使用を開始できます。

アーキテクチャー図

  1. ユーザーがアプリ内で製品のバーコードをスキャンします。これによって Climate Impact Rating API が呼び出され、バーコード ID が渡されます。
  2. Climate Impact Rating API が、渡されたバーコード ID に対応する評価データを取得します。
  3. Climate Impact Rating API がアプリに評価データを返します。アプリは受け取ったデータをフォーマット設定して表示します。
  4. 製造業者が (おそらく予約されたポータルを介して) Climate Impact Rating API を使用して、製品データと評価データをアップロードします。
  5. 将来的には、API で幅広い評価クエリーに対処できるよう、Climate Impact Analyzer がバックグラウンドで稼働して集計データを生成することになります。

前提条件

HTTP を使用した API 呼び出しの基本を理解している必要があります。その理解を基に、このチュートリアルで OpenAPI (Swagger) の使用方法を詳しく学ぶことができます。 さらに、IBM Cloud アカウントと、ローカル・マシン上で最新の IBM Cloud ツールを使用できる必要もあります。

所要時間

このチュートリアルの所要時間は約 30 分です。

手順

ステップ 1: リポジトリーのクローンを作成する

リポジトリーのクローンを作成して、ローカル・マシン上に API サーバーのコピーを用意します。

git clone https://github.com/Call-for-Code/Solution-Starter-Kit-Energy-2020.git

上記のコマンドにより、Solution-Starter-Kit-Energy-2020 という名前のディレクトリーが作成されます。このディレクトリー内に、API サーバーのソースを格納する example ディレクトリーがあります。

ステップ 2: Cloudant を使用して CouchDB インスタンスをプロビジョニングする

IBM Cloud にログインし、Cloudant を使用して CouchDB インスタンスをプロビジョニングします。カタログから「Databases (データベース)」を選択し、「Cloudant」パネルを選択します。

Cloudant インスタンスを示す画面のスクリーンショット 1

「Cloudant」パネルを選択すると、Cloudant プランを選択できるようになります。単純なテストには、無料枠を使用できます。この CIR サンプルを実行するには、この無料枠のプランで十分です。該当する地域を選択し、サービス名に名前を付けます。「Available authentication methods (使用可能な認証方式)」としては、「Use only IAM (IAM のみを使用)」を選択することをお勧めします。他の設定はデフォルト値のままでかまいません。準備ができたら、青色の「Create (作成)」ボタンをクリックします。

Cloudant インスタンスを示す画面のスクリーンショット 2

Cloudant インスタンスが作成されたら、CIR API サーバーがこのインスタンスと通信するために使用する、サービス資格情報を作成する必要があります。実行中の Cloudant インスタンスを選択すると、左側のメニューから「Service credentials (サービス資格情報)」を選択できるようになります。

Cloudant 資格情報を示す画面のスクリーンショット

新しいサービス資格情報を作成し、名前を付けます (任意の名前にできます)。

Cloudant 資格情報を示す画面のスクリーンショット 2

資格情報が作成されたら、次のステップで API サーバーのコードに貼り付けられるよう、「View service credentials (サービス資格情報を表示)」を選択し、表示された資格情報をコピーします。

Cloudant 資格情報を示す画面のスクリーンショット 2

ステップ 3: API サーバーを準備する

API サーバーを準備するには、上記のステップで作成したサービス資格情報をサーバーのコード内に貼り付ける必要があります。リポジトリーのクローンに含まれる、API サーバーのコードを格納するディレクトリー内にある example/server.py ファイルを開きます。ファイルの上のほうに定義されている古い資格情報を見つけてください。

古い API 資格情報を示す画面のスクリーンショット

この資格情報を、前のステップで作成した資格情報で置き換えます。以下に例を示します。

置換後の API 資格情報を示す画面のスクリーンショット

ファイルを保存します。これで、API サーバーを実行する準備が整いました!

ステップ 4: API サーバーを実行する

この API サーバーは、マシン上でローカルに実行することも、Docker コンテナー内で実行することもできます。このサーバーには Python、Flask、Flask-RESTX が必要なので、コンテナー内で実行するほうが簡単かもしれません (Docker ファイルが提供されています)。

API サーバーを Docker コンテナー内で実行する

マシン上に Docker がセットアップされていれば、API サーバーの Docker イメージをビルドして実行できます。その場合、リポジトリーのクローンに含まれている example ディレクトリーから、以下のコマンドを実行します。

docker build . -t cir-api-server
docker run -p 8080:8080 cir-api-server

Docker コンテナー内の Flask サーバーが以下のようなエコー出力を表示すれば、コマンドは正常に実行されたことになります。

 * Serving Flask app "./server.py"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

API は http://0.0.0.0:8080 上で使用可能になります。

API サーバーをローカルで実行する

API サーバーをローカルで実行するには、ローカル・マシン上にすべての依存関係がインストールされて揃っている必要があります。pipenv で特定の依存関係をインストールできるように、Pipefile が提供されています。まず、Python (3.6.x を推奨) と pipenv がインストールされていることを確認してください。以下に、MacOS 上で依存関係をインストールする例を示します。

brew install python
pip install --user pipenv
pipenv install

これで依存関係が揃ったので、API サーバー自体を実行できます (リポジトリーのクローンに含まれている example ディレクトリーから) 以下のコマンドを実行します。

pipenv run python ./server.py

Flask サーバーが以下のようなエコー出力を表示すれば、コマンドは正常に実行されたことになります。

 * Serving Flask app "server" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

ステップ 5: API エンドポイントをテストする

初めて API が実行されると、API サーバーが製品 CIR データベースを作成して、そこに少量のダミー・データをアップロードします。このダミー・データを使用して、AP エンドポイントをテストできます。

前述のとおり、API はローカルで実行される場合は 127.0.0.1:5000 で公開され、Docker によって実行される場合は http://0.0.0.0:8080 で公開されます。API サーバーもこのルート URL で、API の Swagger/OpenAPI 仕様をレンダリングします。

Swagger の例を示す画面のスクリーンショット

画面の上部に示されている swagger.json の URL をクリックすると、Swagger 仕様を抽出できます。Swagger/OpenAPI ツールではこの仕様を使用して、任意の言語でクライアントを生成できます。

curl を使用して、簡単なアクションを実行することもできます (ローカルで実行している場合、以下のコマンドでは、URL エンドポイントを 127.0.0.1:5000 で置き換えてください)。

所定のバーコードに対応する製品 CIR を取得するには、クエリー・パラメーターを設定した GET を実行します (ローカルで実行している場合、URL エンドポイントを 127.0.0.1:5000 で置き換えてください)。

curl "http://0.0.0.0:8080/v1/product?barcode_id=0125551234508"

このコマンドにより、以下の応答が返されるはずです。

[{"id": "0125551234508", "barcode_id": "0125551234508", "type": "AIR CONDITIONER", "category": "SPLIT AIR-CONDITIONER", "model": "A-890AM", "brand": "Brand - A", "rating_data": {"efficiency": 4, "energy": 44.66160323, "CO2": 46.61812622, "otherGG": 61.61812622, "water": 241.0, "plastic": 1327.42056, "lifetime": 20.0, "recyclability": 9, "repairability": null}}]

すべての製品を取得するには、単純な GET を実行します。

curl "http://0.0.0.0:8080/v1/product"

このコマンドにより、製品リストが返されるはずです。

新しい製品エントリーを作成することもできます。

curl -d '{"barcode_id": "1125761234500", "type": "REFRIDGERATOR", "category": "FRIDGE_FREEZER", "model": "F-13876", "brand": "Brand - F", "rating_data": {"efficiency": 4, "energy": 44.66160323, "CO2": 46.61812622, "otherGG": 61.61812622, "water": 241.0, "plastic": 1327.42056, "lifetime": 20.0, "recyclability": 9}}' -X POST "http://0.0.0.0:8080/v1/product" -H "Content-Type: application/json"

まとめ

このチュートリアルでは、ソリューション・スターターとして、消費者向け API をサポートする基本的なシステムを稼働させる方法を説明しました。また、気候評価システムを構築するための実験台として使用できる、基本的なアーキテクチャーについても説明しました。