フォーム読み込み中
2023年1月18日掲載
サーバレスサービスは非常に便利です。
仮想コンピューティングを準備しなくても、開発者は好きな言語による関数コードを綴るだけで、サーバレスがHTTP Requestやタイマートリガー、APIアクセス等に応じて自動処理し、その結果を返答するため、仮想コンピューティングのランニングコストを削減しつつ、さまざまな組み合わせやシナリオを実現することができます。
今回はそのシナリオの一つとして、Alibaba Cloudのサーバレスプロダクトサービス Function Computeがタイマートリガーをベースに外部からJSONデータを取得、その結果をSlackへ通知する仕組みを作ってみます。
サーバレスってなに?Alibaba Cloud, AWS, Azure, Google Cloud のサーバレスサービスを比べてみました
クラウド利用料の削減方法とツールを紹介 (Alibaba/AWS/Azure/Google)
サーバレスとサーバレスコンテナ、サーバレスKubernetesを活用する理由ってなに?Alibaba, AWS, Azure, Google Cloudで比較してみました【前編】
Alibaba Cloud Function ComputeにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)
Alibaba Cloud FunctionComputeをCLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)
Serverless Devsを使ってNode.js/PythonコードをコンテナイメージにしながらAlibaba Cloud FunctionComputeへデプロイしてみた
全体構成図は次の通りになります。ゴールは一定時刻になると天気予報を通知するものです。
上記は非常に簡単な例ですが、この流れら基本を抑えておけば、次のようなシナリオを実現することができます。
Slackは対話型チャットベースでさまざまなサービスと連携できるため、上記を含め、さまざまなシナリオを簡単に実現することができます。コツは、Slack入力を検知するPythonスクリプト、およびSlackへ通知するPythonスクリプトを上手く生かすことです。今回はその一歩として、サーバレスからPythonスクリプトによって通知する簡単な仕組みを作ってみます。
今回はSlack上にBotを作成しますので、Slackアカウント、利用したいサービスのワークスペース、およびslack連携には Slack AppとIncoming webhook URL の発行が必要です。
もし、Slackアカウント、利用したいサービスのワークスペース、Slack AppとIncoming webhook URLを持っている場合は、「4. FunctionComputeサービスの準備」へお進みください。
Slackアカウントを準備します。
https://slack.com/
Slackアカウントの準備が出来たら、以下のリンクを開き、ワークスペースを作成します。
https://slack.com/get-started#/createnew
今回はワークスペース名を「ServerlessToSlack」という名前にします。
表示された指示に従い、ワークスペースを作成し、起動します。
チャンネルを作成します。チャンネル名は何でもよいので、今回は「weatherchannel」にします。
ワークスペースが完成したら、今度はそのワークスペースとFunctionComputeを連携するための、Slackアプリ設定をします。
https://api.slack.com/apps にアクセスし、「Create an APP」をクリックしてSlackアプリを作成します。
「From scratch」をクリックします。
AppNameを設定し、ワークスペースを選択します。
「Incoming Webhooks」を選択します。
「Incoming Webhooks」をオンにします。
「Incoming Webhooks」をオンにすると、メニューの表示内容が変わります。
Webhooksをワークスペースに追加します。
チャンネルを選択し、「許可する」ボタンをクリックして許可します。
Incoming Webhooksを保存します。
これでSlack App設定は完了です。
最後に、Slack App設定にてWebhook URLがありますが、こちらはサーバレス側から通知するために必要なURLなので手元に置くようにします。
Slack側の準備は完了したので、今度はサーバレス側の準備を進めます。
Alibaba Cloudコンソール画面から、FunctionComputeを開きます。Function Computeサービスが現在のアカウントですでにアクティブ状態になっていることを確認します。もしまだアクティブ状態になってない場合はこの際アクティベーションにします。FunctionComputeを開き、Node.jsをデプロイする専用のサービス・リソースを新規で作成します。流れとして、①「Create Service」で新規サービスを立ち上げ、②サービス名やロギング、Tracing Analytsisなど作成に必要な情報を入力、③サービスに必要な情報の入力が完了すればOKボタンを押すと、サービスが作成されます。以降はこのサービス・リソース配下にてFunctionという名のリソースでさまざまな関数らコードをデプロイすることができます。
ランタイムとしてPythonを使用して新しいFunctionを作成します。ランタイムはコードを実行するために必要な言語設定等環境のことを指します。特にRequest Type(ここではEvent Requestsを使用)の設定が正しいことを確認します。
新しいFunctionが完成したら、「Code」タブをクリックして、インラインエディタ画面に遷移します。
初期状態として、「Hello world」を返却するサンプルの関数ソースコードがありますが、これを全部消して、次の関数ソースコードを入力します。
Webhook URLは上記slack app設定で入手したWebhook URLを使用します。
import base64
import urllib3
import json
http = urllib3.PoolManager()
slack_endpoint = "<Slack App設定から入手したWebhook URL>"
weather_endpoint = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json"
def handler (event, context):
# get weather result
weather_result = get_weather()
if weather_result["success"]:
# compose weather info to markdown message
weather_msg = compose_weather_message(weather_result["data"])
forward_slack_message(weather_msg)
else:
weather_msg = weather_result["error_message"]
forward_slack_message(weather_msg)
def forward_slack_message(message_content):
msg = {
"channel": "#weatherchannel",
"username": "nancy",
"text": message_content,
"icon_emoji": ""
}
encoded_msg = json.dumps(msg).encode('utf-8')
resp = http.request('POST', slack_endpoint, body=encoded_msg)
print({
"message": "test message: {0}".format(message_content),
"status_code": resp.status,
"response": resp.data
})
def compose_weather_message(weather):
return "*{0} _{1}_ {2} 地域の天気情報です*\n{3}\n{4}".format(
weather['publishingOffice'],
weather['reportDatetime'],
weather['targetArea'],
weather['headlineText'],
weather['text']
)
def get_weather():
result = {"success": True, "error_message": "OK"}
try:
resp = http.request(method="GET", url=weather_endpoint, headers={"Content-Type": "application/json"})
if resp.status == 200 and resp.data:
weather = json.loads(resp.data)
print(weather)
result["data"] = weather
else:
msg = "Failed get weather, response code: {0}, response: {1}".format(resp.status, resp)
print(msg)
result["success"] = False
result["error_message"] = msg
return result
except Exception as e:
result["success"] = False
result["error_message"] = str(e)
print("Failed getting weather information.")
return result
ソースコードの入力が完了したら、インラインエディタ画面の右にある「Save」をクリックして保存します。
デプロイする関数コードをインラインエディタでチェックし、コンソールでテストします。「TestFunction」ボタンをクリックし、関数コードを実行します
その結果、FunctionCompute側は「Successful Execution.」、Slackは天気予報情報が表示されたので、テストはいったんOKです。
この関数コードを一定時刻にて実行し、slackへ天気予報情報を通知するように設定したいので、FunctionCompute側でタイマートリガーを設定します。
この設定によって毎日朝9時に天気予報情報を自動的に発信できるようになります。
SlackとFunctionComputeの組み合わせにより、天気予報情報を自動で通知する方法をご紹介しました。本記事は非常に簡単かつ10分もしないで作り上げることができるので、サーバレスを始める方にはちょうどよいハンズオントレーニングかもしれません。また上記関数コードは天気予報情報を取得して通知する処理ですが、このコードをアレンジして、ニュースを通知したり、近所スーパーのセール情報を通知したり、クラウドの障害を通知したり、などなどさまざまなシナリオを満たすことができますので、ご参考になれば幸いです。
サーバレスってなに?Alibaba Cloud, AWS, Azure, Google Cloud のサーバレスサービスを比べてみました
クラウド利用料の削減方法とツールを紹介 (Alibaba/AWS/Azure/Google)
サーバレスとサーバレスコンテナ、サーバレスKubernetesを活用する理由ってなに?Alibaba, AWS, Azure, Google Cloudで比較してみました【前編】
Alibaba Cloud Function ComputeにZIPファイル化したNode.jsおよびPythonのコードをデプロイしてみた(GUI編)
Alibaba Cloud FunctionComputeをCLIベースでNode.jsおよびPythonそれぞれをデプロイしてみた(CLI編)
Serverless Devsを使ってNode.js/PythonコードをコンテナイメージにしながらAlibaba Cloud FunctionComputeへデプロイしてみた
条件に該当するページがございません