IBM Cloud Object Storage(ICOS)へのアップロードをIBM Cloud FunctionsでSlackに通知してみる


はじめに

IBM Cloudでは、AWSのS3に相当するオブジェクトストレージ「IBM Cloud Object Storage」(ICOS)、および、Lambdaに相当するFunction as a Serviceプラットフォームとして「IBM Cloud Functions」が提供されています。

当記事では、この2つのサービスを利用し、「ICOSにファイルがアップロード・削除されたときに、自動でSlackのチャンネルに通知する」処理を作成してみます。

処理の流れは以下のようになります。

ICOSにファイルがアップロードされたり、既存のファイルが削除されたりすると、IBM Cloud Functionsに対してトリガーが発行され、それを受けてSlackへの通知処理が起動するというものです。

なお、当記事の作成にあたり、IBM Cloud FunctionsでのSlack通知処理について、以下の記事を参考にしています。

IBM Cloud Functions からPythonで Slack にメッセージをPostする

SlackのIncoming Webhook URLの発行

まず、任意のSlackワークスペースで、通知したいチャンネルに対するIncoming Webhookを発行します。
Webhookの発行方法は以下を参考にしてください。

Slack での Incoming Webhook の利用
Sending messages using Incoming Webhooks

IBM Cloud Object Storageの作成

IBM Cloudにログイン後、画面上部の「カタログ」をクリックし、「カタログを検索...」フィールドで「Object Storage」と入力し、検索します。
以下の「Object Storage」が出てくるのでこれをクリックします。

無料の「ライト」プランを選択し、他はデフォルトのままで「作成」ボタンをクリックします。

「バケットの作成」をクリックします。

「カスタム・バケット」をクリックします。

「固有のバケット名」に任意の名前を入力し、「ロケーション」を「jp-tok」とし、他はデフォルトのままで「バケットの作成」をクリックします。

これでICOSのバケットが作成され、ファイルをアップロードできる状態になりました。

IBM Cloud Functionsの名前空間の作成

IBM Cloud Functionsのトリガー・アクションを作成する前に、それらを含める名前空間を作成します。

IBM Cloud Functionsのページにアクセスします。

「現在の名前空間」欄を展開し、「名前空間の作成」をクリックします。

「名前」に任意の名前、「デプロイするロケーションの選択」で「東京」を選択し、「作成」ボタンをクリックします。ICOSのバケットと、Cloud Functionsの名前空間は同じリージョンである必要があります。

Cloud Functionsの名前空間への通知マネージャロールの割り当て

ICOSからトリガーを発行するにあたり、Cloud Functionsの名前空間に権限を付与する必要があります。
IAMダッシュボードにアクセスします。

サービス許可の付与画面で、以下のように入力し、「許可」ボタンをクリックします。

  • ソース・サービス:Functions
  • ソース・サービス・インスタンス:上記で作成したFunctionsの名前空間
  • ターゲット・サービス:Cloud Object Storage
  • サービス・インスタンス:上記で作成したCloud Object Storageのインスタンス
  • サービス・アクセス:「Notification Manager」にチェックを入れる

Cloud Functionsのトリガー・アクションの作成

Cloud Functionsのトリガーのページにアクセスします。

「現在の名前空間」が上記で作成した名前空間であることを確認し、「作成」ボタンをクリックします。

「トリガー」をクリックします。

「Cloud Object Storage」をクリックします。

「トリガー名」に任意の名前を入力し、「COSサービス・インスタンス」「バケット」で上記で作成したICOSインスタンス、バケットを選択し、「作成」ボタンをクリックします。

トリガーが作成できたので、次は、トリガー発生により実行されるアクションを作成します。

「接続されたアクション」の右側にある「追加」をクリックします。

「アクション名」に任意の名前を入力し、「ランタイム」で「Python 3.7」を選択し、「作成&追加」ボタンをクリックします。

作成されたアクション(以下では「cos-update-slack-notify」)をクリックします。

アクションのコードが表示されるので、以下の内容に置き換えて、「保存」ボタンをクリックします。
urlの部分は、上記で取得したSlackのIncoming WebhookのURLに変更します。

import requests
import json

def main(dict):

 body={'username':'ICOS','icon_emoji':':donut:','text': "バケット=" + dict["bucket"] + ", ファイル=" + dict["key"] + ", 操作=" + dict["operation"]}

 url = "https://hooks.slack.com/services/xxxxxxxxxxxxxx" # 取得済みのSlack Incoming WebhookのURLに置き換える
 response = requests.post(url,data=json.dumps(body))
 return { "message" : "Slack notified" }

ファイルアップロードとSlack通知の確認

作成したICOSのバケットにファイルをアップロードし、Slackチャンネルに通知されることを確認します。

リソース・リストのページにアクセスします。

「Storage」以下に作成したObject Storageのインスタンスが表示されるのでクリックします。

作成したバケットをクリックします。

「アップロードするにはファイルまたはフォルダーをドラッグ・アンド・ドロップします」の箇所をクリックし、任意のファイルをアップロードします。

ファイルアップロードをトリガーとして、対象のSlackチャンネルに以下のようなメッセージが投稿されます。

以上、ICOSへのアップロードなどの通知をSlackに通知する方法でした。


なお、IBM Cloud Functionsのマニュアルでは、

Triggers created with /whisk.system/cos package have the following limitations.
- The trigger is available in the us-east, us-south, and eu-gb regions.

のように、jp-tokはトリガーの利用可能リージョンになっていませんが、2020年8月10日時点では上記のようにjp-tokでも利用できています。

以下のように、/whisk.system/cos パッケージも含まれているようです(sample-ns-3はjp-tokの名前空間)。

❯ ibmcloud fn namespace target sample-ns-3
ok: whisk namespace set to sample-ns-3

~
❯ ibmcloud fn package list /whisk.system
packages
/whisk.system/samples                                                  shared
/whisk.system/websocket                                                shared
/whisk.system/slack                                                    shared
/whisk.system/weather                                                  shared
/whisk.system/utils                                                    shared
/whisk.system/cloudant                                                 shared
/whisk.system/cos                                                      shared
/whisk.system/messaging                                                shared
/whisk.system/alarms                                                   shared