データ・リトリーブおよび分析のためのサーバーレス Web アプリとイベント処理
このチュートリアルでは、費用が発生する場合があります。 コスト見積もりツールを使用して、予測使用量に基づいてコスト見積もりを生成します。
このチュートリアルでは、リポジトリーの GitHub トラフィック統計情報を自動的に収集し、トラフィック分析の基盤を提供するアプリケーションを作成します。 GitHub では、過去 14 日間のトラフィック・データのみにアクセスできます。 これよりも長い期間の統計情報を分析する場合は、データを自分自身でダウンロードして保管する必要があります。 このチュートリアルでは、IBM Cloud Code Engine プロジェクトにサーバーレス・アプリをデプロイします。 このアプリは、GitHub リポジトリーのメタデータを管理し、データ分析のための統計情報へのアクセスを提供します。 トラフィック・データは、アプリ内でオンデマンドで、または Code Engine イベントによってトリガーされたときに (例えば、毎日)、GitHub から収集されます。 このチュートリアルで説明するアプリは、シングル・テナント・モードをサポートする初期機能セットを使用してマルチテナント対応ソリューションを実装します。
{: caption="図
目標
- マルチテナントに対応し、保護されたアクセスを備えたコンテナー化 Python データベース・アプリをデプロイする
- アプリ ID を OpenID Connect ベースの認証プロバイダーとして統合する
- GitHub トラフィック統計情報の自動サーバーレス収集をセットアップする
開始前に
このチュートリアルでは、以下が必要です。
- IBM Cloud CLI
- IBM Cloud Code Engine プラグイン
- IBM Cloud® Container Registry プラグイン
- GitHub アカウント
IBM® Cloud Shell にある、シェルを必要とするセクションを実行することができます。
ご使用のオペレーティング環境でこれらのツールをダウンロードおよびインストールするための手順は、チュートリアルの概説ガイドに記載されています。
サービスと環境のセットアップ (シェル)
このセクションでは、必要なサービスを設定し、環境を準備します。 すべての作業はシェル環境 (端末) から行うことができます。
-
ログインしていない場合は、
ibmcloud login
またはibmcloud login --sso
を使用して対話的にログインしてください。 -
ibmcloud target
コマンドを実行して、リソース・グループとリージョンを指定します。RESOURCE_GROUP_NAME=Default REGION=us-south ibmcloud target -r $REGION -g $RESOURCE_GROUP_NAME
-
無料 (free) (ライト) プランで IBM Db2 SaaS インスタンスを作成し、ghstatsDB という名前を付けます。
ibmcloud resource service-instance-create ghstatsDB dashdb-for-transactions free $REGION
-
App ID サービスのインスタンスを作成します。 名前として ghstatsAppID を使用し、段階課金制 (Graduated tier) プランを使用します。
ibmcloud resource service-instance-create ghstatsAppID appid graduated-tier $REGION
-
新規名前空間 ghstats を IBM Cloud® Container Registry に追加します。 これは、コンテナー・イメージの参照のために使用します。 1 つのグローバル・レジストリーと、リージョン・レジストリーがあります。 グローバル・レジストリーを使用します。
ibmcloud cr region-set global NAMESPACE=ghstatsYourInitials ibmcloud cr namespace-add $NAMESPACE
Code Engine の準備 (シェル)
サービスのプロビジョニングと一般的なセットアップが完了したら、次に Code Engine プロジェクトを作成し、アプリ用のコンテナー・イメージを作成して、デプロイします。
- ghstats という名前の Code Engine プロジェクトを作成します。 これは、コマンドによって自動的に現行 Code Engine コンテキストとして設定されます。
ibmcloud ce project create --name ghstats
- Code Engine ビルド構成を作成します。つまり、コンテナー・イメージがビルドされるようにプロジェクトを設定します。 このチュートリアルでは GitHubからコードを取得し、登録ユーザー情報を使用して、以前に作成した名前空間でレジストリに画像を保存します。
ibmcloud ce build create --name ghstats-build --source https://github.com/IBM-Cloud/github-traffic-stats --context-dir /backend --commit master --image private.icr.io/$NAMESPACE/codeengine-ghstats
- ビルド作成コマンドには、プロジェクトによる IBM Cloud® Container Registryの書き込みと読み取りを許可するレジストリー・アクセス・シークレットを作成するという副次作用があったことに注意してください。
ibmcloud ce registry list
- 次に、実際のビルド・プロセスを実行します。
この出力は、ビルドの進行中にビルドの状況ログを追跡するために実行する追加のコマンドを示します。 例えば、次のようなものです。ibmcloud ce buildrun submit --build ghstats-build
ibmcloud ce buildrun logs -f -n ghstats-build-run-123456-123456789
アプリのデプロイ (シェル)
ビルドの準備ができたら、コンテナー・イメージを使用してアプリをデプロイし、その後、事前にプロビジョンしていたサービスをバインドすることができます。
-
アプリをデプロイするということは、 ghstats-app という名前の Code Engineを作成することを意味します。 指定されたレジストリーと名前空間からイメージをプルします。
ibmcloud ce app create --name ghstats-app --image private.icr.io/$NAMESPACE/codeengine-ghstats:latest --registry-secret ce-auto-icr-private-global
アプリがデプロイされたら、出力に表示される URL でアプリが使用可能であることを確認できます。 アプリはまだ構成されていないため、使用できません。 デプロイメントの状況は
ibmcloud ce app list
を使用して確認でき、ibmcloud ce app get --name ghstats-app
を実行することで、より詳しい情報を確認することができます。デフォルトでは、最小スケーリングはゼロ (0) です。 これは、アプリにワークロードがない場合、実行中のインスタンスを Code Engine がゼロにすることを意味します。 これによってコストは削減されますが、ゼロから再びスケールアップするときには、短時間でアプリを再起動する必要があります。 この問題は、アプリを作成または更新するときにパラメーター
--min 1
を使用することで回避することができます。 -
プロビジョンしたサービスを使用するには、それをアプリにバインドする必要があります。 まず、IBM Db2 SaaS をバインドし、それから App ID をバインドします。
ibmcloud ce application bind --name ghstats-app --service-instance ghstatsDB
ibmcloud ce application bind --name ghstats-app --service-instance ghstatsAppID
各
application bind
は、以下のリソースと関係を作成します。- IAM Service ID。
- IAM Service ID に IAM API キーが作成されます。
- リソース・サービス・キー。 これらは、 IBM Cloud コンソールではサービス資格情報 と呼ばれます。 以下のコマンドを試行して、 App ID エントリーを表示します。
ibmcloud resource service-keys --instance-name ghstatsAppID
サービスをアプリにバインドする代わりに、 シークレット または 構成マップ を使用することもできます。 これらは、ファイルに保管されている値から取り込んだり、リテラルとして渡したりすることができます。 このチュートリアGitHubに、秘密情報用のサンプルファイルと関連指示書が含まれています。
アプリ ID と GitHub 構成 (ブラウザー)
以下のステップはすべて、インターネット・ブラウザーを使用して行います。 最初に App ID を構成して、Cloud Directory を使用し、アプリと連携するようにします。 その後、GitHub アクセス・トークンを作成します。 これは、アプリがトラフィック・データを取得するために必要です。
-
IBM Cloud® リソース・リストで、サービスの概要を開きます。 「サービス」 セクションで App ID サービスのインスタンスを見つけます。 そのエントリーをクリックして詳細を開きます。
-
サービス・ダッシュボードの左側にあるメニューの 「認証の管理 (Manage Authentication)」 をクリックします。 使用可能な ID プロバイダー (Facebook、Google、SAML 2.0 Federation、Cloud Directory など) のリストが表示されます。 Cloud Directory を 「有効」 に切り替え、その他のプロバイダーを 「無効」 に切り替えます。
多要素認証 (MFA) と高度なパスワード・ルールを構成することがあります。 これについては、このチュートリアルでは説明しません。
-
同じダイアログ内で 「認証設定 (Authentication Settings)」 タブをクリックします。 「Web リダイレクト URL の追加 (Add web redirect URLs)」 で、アプリケーションの URL と
/redirect_uri
を組み合わせて入力します (https://ghstats-app.56ab78cd90ef.us-south.codeengine.appdomain.cloud/redirect_uri
など)。アプリをローカルでテストする場合のリダイレクト URL は
http://127.0.0.1:5000/redirect_uri
です。 複数のリダイレクト URL を構成できます。 アプリをローカルでテストするには、.env.local.template を .env にコピーして調整し、python3 ghstats.py
を使用してアプリを開始します。 -
左側のメニューで、「Cloud Directory」 を展開し、「ユーザー」 をクリックします。 Cloud Directory でユーザー・リストが開きます。 「ユーザーの作成 (Create User)」 ボタンをクリックし、自分自身を最初のユーザーとして追加します。 これで、App ID サービスの構成が完了しました。
-
ブラウザで Github.com にアクセスし、 設定 -> 開発者向け設定 -> 個人用アクセストークンを開きます。 新しいトークン(クラシック)を生成するボタンをクリックします。 「注」 に GHStats Tutorial と入力します。 その後、repo カテゴリーの下の public_repo と、admin:org の下の read:org を有効にします。 次に、そのページ下部にある 「Generate token」 をクリックします。 新しいアクセス・トークンが次のページに表示されます。 これは、以降のアプリケーション設定で必要になります。
GitHub アクセストークン
Python アプリの構成とテスト
準備が完了したら、アプリを構成してテストします。 このアプリは、人気の高い Flaskマイクロフレームワークを使用して Python で書かれています。 統計情報収集のためのリポジトリーを追加したり、削除したりすることができます。 トラフィック・データには表形式のビューまたは折れ線グラフでアクセスできます。
-
ブラウザーで、デプロイされているアプリの URI を開きます。 ウェルカム・ページが表示されます。
「ウェルカム画面」 -
ブラウザーで URI に
/admin/initialize-app
を追加し、そのページにアクセスします。 これは、アプリケーションとそのデータを初期化するために使用されます。 「Start initialization」 ボタンをクリックします。 これにより、パスワードで保護されている構成ページが表示されます。 ログインに使用した E メール・アドレスがシステム管理者の ID として取得されます。 以前に構成した E メール・アドレスとパスワードを使用します。 -
構成ページで、名前 (あいさつで使用されている場合)、GitHub ユーザー名、および以前に生成したアクセス・トークンを入力します。 「Initialize」 をクリックします。 データベース表が作成され、一部の構成値が挿入されます。 最後に、システム管理者とテナントのデータベース・レコードが作成されます。
最初のステップ -
完了すると、管理対象リポジトリーのリストが表示されます。 リポジトリーを追加できます。追加するには、GitHub アカウントまたは組織の名前とリポジトリーの名前を指定します。 データの入力が完了したら、「Add repository」 をクリックします。 リポジトリーと新規に割り当てられた ID が表に表示されます。 リポジトリーをシステムから削除できます。削除するには、リポジトリーの ID を入力して 「Delete repository」 をクリックします。
リポジトリーのリスト -
テストのために、「Administration」 をクリックしてから、「Collect statistics」 をクリックします。 これによりトラフィック・データがオンデマンドで取得されます。 それから、「Repositories」 をクリックし、「Daily Traffic」 をクリックします。 これにより、収集されたデータが表示されるはずです。
「トラフィック・データ」
データの日次取得のセットアップ (シェル)
アプリの導入と構成が完了したら、最後に GitHub トラフィック・データの日次取得のセットアップに入ります。 cron サブスクリプションを作成します。 cronジョブと同様に、アプリは指定したスケジュールでイベントを購読します(イベント駆動)。
-
cron サブスクリプション ghstats-daily を、UTC 午前 6 時の日次スケジュール、POST イベント、パス /collectStats で作成します。 SECRET_TOKEN_AS_IDENTIFIER を任意のシークレット値に置き換えます。 これは、アプリへのイベント提供者を識別するために使用されます。
ibmcloud ce subscription cron create --name ghstats-daily --destination ghstats-app --path /collectStats --schedule '0 6 * * *' --data '{"token":"SECRET_TOKEN_AS_IDENTIFIER"}' --content-type application/json
-
シークレット・トークンをアプリに認識させるために、アプリを更新します。 SECRET_TOKEN_AS_IDENTIFIER を、前のステップで選択した値に置き換えます。
ibmcloud ce app update --name ghstats-app --registry-secret usicr --env EVENT_TOKEN=SECRET_TOKEN_AS_IDENTIFIER
これにより、アプリのリビジョンが新規作成されます。 イベントがアプリで受信され、処理されたことは、アプリ内で 「Administration」 、「System log」 の順に移動することで確認できます。
上記のコマンドは、UTC 午前 6 時の日次スケジュールを作成します。 イベント処理が機能していることを直接確認するには、現在の時刻から数分後の時刻を UTC に換算して選択します。
まとめ
このチュートリアルでは、IBM Cloud Code Engine にサーバーレス・アプリをデプロイしました。 アプリ・ソースは GitHub リポジトリーから取得したものです。 Code Engine に、コンテナー・イメージをビルドして IBM Cloud® Container Registry に保管するように指示しました。 次に、そこからプルしてコンテナーとしてデプロイしました。 アプリは IBM Cloud サービスにバインドされています。
アプリとそれに関連するイベント処理により、GitHub リポジトリーのトラフィック・データを自動的に取得できます。 これらのリポジトリーに関する情報 (テナント固有のアクセス・トークンなど) は SQL データベースに保管されます (IBM Db2 Warehouse SaaS)。 このデータベースは、ユーザーとリポジトリーの管理と、トラフィック統計情報の表示のために Python アプリにより使用されます。 トラフィック統計情報は、検索可能な表に表示されるか、または単純な折れ線グラフで視覚化されます (以下の画像を参照)。 また、リポジトリーのリストとトラフィック・データを CSV ファイルとしてダウンロードできます。

セキュリティー: サービス資格情報のローテーション
このソリューションを実稼働環境で使用する場合は、サービス資格情報を定期的にローテーションする必要があります。 多くのセキュリティー・ポリシーでは、90 日ごとなどの頻度でパスワードと資格情報を変更する必要があります。
アプリにバインドされたサービスをアンバインドしてから再度バインドすると、このサービスに関する資格情報を再作成することによりローテーションを行うことができます。 サービス・バインディングの代わりにシークレットを使用する場合は、最初にサービス・キーを再作成し、次にシークレットを更新し、最後にアプリを更新することで、選択肢がさらに増えます。
リソースを削除する
このチュートリアルで使用したリソースをクリーンアップするには、関連するプロジェクトとサービスを削除します。
- プロビジョンされたサービスをアンバインドします。 最初にバインディングを表示してから、 サービス・バインディング名 によってそれらを削除します (以下の FIRST および SECOND は、出力の取得からのものです)。
ibmcloud ce application get --name ghstats-app
ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-FIRST
ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-SECOND
- プロジェクトとそのコンポーネントを削除します。
ibmcloud ce project delete --name ghstats --hard -f
- サービスを削除します。
ibmcloud resource service-instance-delete -f ghstatsDB
ibmcloud resource service-instance-delete -f ghstatsAppID
- Container Registry 名前空間を削除する
ibmcloud cr namespace-rm $NAMESPACE -f
- Github.com トークン を削除します。
リソースによっては、即時に削除されずに保持される場合があります (デフォルトでは 7 日間)。 リソースを完全に削除して再利用することも、保存期間内に復元することもできます。 リソースの再利用を使用する方法については、この資料を参照してください。
チュートリアルを発展させる
このチュートリアルに追加またはチュートリアルを変更する必要がありますか? 以下にいくつかのアイデアを示します。
- アプリを拡張してマルチテナント対応にする。
- ソーシャル・アイデンティティー・プロバイダーを使用する。
- 表示データをフィルタリングできるように、日付ピッカーを統計情報ページに追加する。
- App ID のカスタム・ログイン・ページを使用する。
関連コンテンツ
このチュートリアルで扱ったトピックに関する追加情報へのリンクを以下に示します。 このアプリ自体は GitHub のリポジトリで入手できます。
資料: