Micorosft Azureで作るPython製SlackBot開発 ー第2回:Cosmos DBで簡単データ管理

IT技術 教養としてのテクノロジー入門

この記事について

この記事はプログラミング初心者をターゲットに、Microsoft Azureをつかって、WEBページの更新を検知したら、コミュニケーションアプリサービスのSlackにお知らせを出すBotの作り方を解説しています。

第2回はMicrosoft AzureのCosmos DBを利用して簡単なデータ管理を行って記事更新チェックを行っていきます。

前回はSlackの通知とBeautifulSoup4を使ったスクレイピング処理を作りました。前回記事を読んでおらず、これらの知識に不安がある方はよろしければ以下の前回記事もあわせて読んでいただけますと幸いです。

目次

Microsoft Azureとは

今回からMicrosoft Azureを利用します。Microsoft Azureを知らない方向けに説明しますと、Microsoft Azureとは、Microsoft社が提供するシステム運用のクラウド環境です。WEBシステムを開発運用するためのサーバ、データベースなどの環境が簡単に作れるサービスとなっており、今日においては様々なシステムで使われています。

同様のクラウドサービスをAmazonでAmazon Web Service(AWS)、GoogleでGoogle Cloud Platformとして提供しております。それ以外の他社も同様のサービスを提供していますが、便利さ・知名度の点からAWS、GCP、Azureが世界トップの3大クラウドとして君臨している状況です。

Microsoft Azureの無料利用アカウントを登録する

AzureにはF1プランというプランで契約することで無料利用が可能です。

今回のBot開発においてはCosmos DBとAzure Functionsという機能を使いますが、この2つについてもそれぞれ以下の条件の範囲であれば無料で利用することができます。

  • Cosmos DB:最初の400RU/秒分の通信と5GBのストレージ
  • Azure Functions:実行時間 :400,000GB/秒の通信と100万実行回数

有料プランにアップグレードしなければ、これ以上の利用があると自動停止されるだけですので課金される恐れはありません。

無料アカウントはhttps://azure.microsoft.com/ja-jp/free/から作成することができます。

 

なお上の画像のように無料アカウントでもクレジットカードの登録が必要です。もっともクレジットカード登録をする理由は公式のFAQに以下のように書かれておりますので、勝手に課金される懸念はありません。

クレジット カード番号や電話番号がなぜ必要なのですか。

低料金に抑える 1 つの方法として、アカウント所有者が実在する人間であり、ボットや匿名のトラブル メーカーではないことを確認しています。電話番号とクレジット カードは、ID の確認に使用します。お客様のクレジット カードに請求は発生しませんが、お客様のクレジット カード アカウントに 1 ドル認証が表示される場合があります。これは、3 から 5 日以内に削除されます。

このようにクレジットカード登録は本人特定のために利用されているようです。有料アカウントにアップグレードしない限り課金されることはありません。

Cosmos DBを設定する

Azureアカウントができたら、Cosmos DBの設定をしていきましょう。Cosmos DBとは、Azureが提供するデータベースの一つです。簡単に作成できるだけでなく、バックアップなが自動で行われ、とても便利に利用することができます。

コンソール画面からCosmos DBをクリックしてDBを作成しましょう。※トップページに出てない場合はこちらからアクセスできます。

 

Cosmos DBのコンソール画面に来たらCosmos DBアカウントの作成をしましょう。

 

以下の画面が出たら、リソースグループ(※初めて利用の場合は新規作成を押して新規作成してください)、アカウント名に任意の名前を入力してください。

なお、それ以外の設定は基本的にデフォルトで問題ありませんが、場所については必要に応じて日本に変えてもよいかもしれません。

日本に変えた場合、アクセス速度が速くなるメリットがある一方で従量課金制に移行した際にアメリカよりもやや課金額が高くなるなどのデメリットがあります。今回はWEBページのシステムではなく、SlackのBotであるためそれほどアプリケーションの速度は問題ないためアメリカでも問題ありません。

各種設定に問題がなければ「確認と作成」を押します。「確認と作成」を押すと入力内容にシステム面で問題ないかの確認が行われます。問題なければ「作成」ボタンが出ます。「作成」を押すとDBのリソース作成が開始されます。なお作成には10-30分ほど時間がかかりますので作成されるまでしばらく待ちましょう。

 

DBのリソース作成が完了すると、Cosmos DBのコンソールに作成リソース名が出ます。以下のnoticeというのが今回私が作成したリソースです。クリックしてDBの設定をしましょう。

 

現時点ではまだデータを登録したりすることはできません。まず以下の画像の画面にでているコンテナー作成を押してコンテナーを作成しましょう。

 

データベースID、コンテナーID、PartitionKeyを入力してください。基本的に任意の値で問題ありませんが後々プログラムコードで指定するものですので指定しやすいIDを設定してください。なお、私は今回に関してはミニマムな利用しかしないためすべてnoticeという名前に統一しています。

 

コンテナーの作成ができたら左のメニューの「データエクスプローラー」を開いて初期データを作成しましょう。先ほど作成したコンテナ名のItemsのところから「New Item」を押してデータを作成します。

 

Cosmos DBの一つ一つのデータ(Item)はIDをキーにしたJSONで表示されます。今回はこのCosmos DBのItemで最新記事のタイトルを管理します。「latest-entry」という値を持つidともに、最新記事のタイトル保管エリアとして「title」というkeyも設定してください。なお、titleの中身は現状Pythonでブログ本体にアクセスして取得していないので任意の値で問題ありません。


{
    "id": "latest-entry",
    "title": "no-title",
}

データを作成したらSaveを押します。これで初期データが登録されました。なお、タイムスタンプを表す_tsなどのパラメータが自動で追加されます。

 

最後に左のメニューから「キー」を開き、読み取り/書き込みキーを確認してください。ここのURI、プライマリーキーをこの後Pythonコードで記載しますのでメモしておくようにしましょう。

 

PythonアプリからCosmos DBを利用する

Cosmos DBの設定が完了したのでPythonアプリを修正していきましょう。まずCosmos DBにアクセスするためのライブラリをインストールします。azure-cosmosという名前のライブラリをインストールします。


$ py -m pip install azure-cosmos  

インストールが完了したら前回書いたソースコードを以下のように修正しましょう。


# coding: UTF-8
import requests
import json
from bs4 import BeautifulSoup
from azure.cosmos import exceptions, CosmosClient, PartitionKey

#スクレイピング 最新記事タイトルを取得
blogResponse = requests.get('https://miyau5555.info/')
beautifulSoup = BeautifulSoup(blogResponse.text, 'html.parser')
latestEntry = beautifulSoup.find_all("a", class_="blog-entry")[0].find("h2").get_text()

#COSMO DBにアクセス

#コンソールで確認したURIを指定
endpoint = "https://xxxxx.documents.azure.com:443/"

#コンソールで確認したプライマリーキーを指定
key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=="

#接続
client = CosmosClient(endpoint, key)

#コンソールで作成したデータベースIDを指定して取得
database = client.get_database_client("DB-ID")

#コンソールで作成したコンテナーIDを指定して取得
container = database.get_container_client("CONTAINER-ID")

#latest-entryのIDを持つItemを取得。取得にはSQLを使います。
query = "SELECT * FROM c WHERE c.id = 'latest-entry'"
items = list(container.query_items(query, enable_cross_partition_query=True));
item = items[0]

# 取得したIDのItemには現在格納されている最新記事のタイトルが入っています。
# 最新記事が変わったかどうか確認。以下最新記事が変わった場合のみ処理させます。
if item.get("title") != latestEntry:
    # COSMODBの最新記事名を更新
    item["title"] = latestEntry
    container.replace_item("latest-entry", body=item)

    #Slack 通知
    slackApi = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    data = {"text": "最新記事 " + latestEntry + " が投稿されました。"}
    headers = {"Content-Type": "application/json"}

    response = requests.post(slackApi, headers=headers, data=json.dumps(data))
 

コードの修正ができたら実行してみましょう。以下のように最新記事投稿の通知がSlackに通知されたら成功です。

 

また、コンソールのデータエクスプローラーから「latest-entry」のIDのItemを見てみましょう。最新の記事タイトルに変更されています。

 

これ以降Pythonのスクリプトを実行してもSlack通知はされません。しかしながら、上記コンソールから「latest-entry」のIDのItemの「title」のkeyに保管されたタイトル名を変更すると再度Slack通知が行われて、Itemの「title」の値も書き換わります。

このようにして最新投稿記事の確認と、最新記事投稿の検知がされたときはSlack通知ができるようになりました。

終わりに

Cosmos DBを利用したデータ管理ができたところで第2回は終わりです。ここまでで最新記事の投稿検知の基本処理は一通りできました。しかしながら今の状態ではご自身のPCを起動しているときに手動でPythonのスクリプトを実行しないと検知ができません。

最終回である第3回ではこれまで開発したPythonスクリプトをAzureクラウド環境で実行できるAzure Functionを利用して、定期実行できるようにしていきます。是非第3回も読んでいただけますと幸いです。

Photo by Javier Garcia Chavez on Unsplash

 みやうデジタルラボ - にほんブログ村