edit-icon download-icon

MNS トピックトリガー

最終更新日: Mar 13, 2019

Message Service (MNS) は、効率的で信頼性があり、安全で便利なスケーラブル分散メッセージサービスです。MNS により、アプリケーション開発者は分散コンポーネント間でデータと通知メッセージを簡単に転送し、疎結合システムを構築できます。Message Service では、パブリッシャーは PublishMessage API を使用してメッセージをトピックに公開できます。その後、トピックサブスクライバーはこれらのメッセージを受信できます。MNS と Function Compute (FC) は、MNS トピックをイベントソースとして提供するために統合されました。これにより、関数をトピックサブスクライバーとして使用できるようになります。また、カスタム関数を使用してトピックに公開されたメッセージをタイムリーに処理できます。

mns-fc

上の図に示すように、MNS トピックでは特定のタイプのサブスクライバーをサポートしています。ただし、このサービスは次の高度な機能を提供していません。

  • メールを送信する前の高度な処理をサポートしていません。
  • HTTP エンドポイントを使用するにはバックエンドサービスが必要です。
  • カスタム処理オプションは限られています。たとえば、メッセージを Slack に直接送信したり、特定のタイプのメッセージを持続的に保存したりすることはできません。

上記の問題を解決するために、MNS トピックトリガーが導入されました。MNS トピックトリガーを初めて使用する場合は、次の制限事項にご注意ください。

リージョンの制限事項

以下の制限は、MNS トピックの使用にのみ適用されます。

MNS トピックトリガーを完全にサポートするリージョン

オーストラリア (シドニー)、インド (ムンバイ)、中国 (張家口)、米国 (バージニア)、インドネシア (ジャカルタ)

中国リージョンに関する注意事項

中国 (青島)、中国 (北京)、中国 (杭州)、中国(上海)、中国 (深セン)

現在、MNS トピックトリガーはベータテスト中です。サービスを利用するには、申請書を提出する必要があります。

Function Compute コンソールの MNS トピックトリガーページで [リージョン] を選択できます。選択したリージョンで MNS トピックトリガーがサポートされていない場合は、[MNS トリガーベータ版にサインアップ] をクリックして申請できます。

現在、中国 (香港)、日本 (東京)、シンガポール、ドイツ (フランクフルト)、および米国 (シリコンバレー) のリージョンでは MNS トピックトリガーをサポートしていません。

制限事項

  • MNS のトピックと関数に同じリージョンを選択することを推奨します。

    MNS トピックトリガーは、さまざまなリージョンのトピックと関数をサポートしています。ただし、 特にリージョンの一方が中国本土にあり、もう一方がそうでない場合は、リージョンの違いによりネットワークの待ち時間が長くなります。

  • 再帰呼び出しを避けることを推奨します。

    コード内で再帰呼び出しを避ける必要があることに注意してください。たとえば、トピック A が関数 B を起動する場合は、新しいメッセージをトピック A に発行するために関数 B を使用しないでください。

イベント定義

MNS トピックに発行されたメッセージは、イベントパラメーターとして関数のハンドラーに渡されます。

MNS トピックトリガーの設定

  • トリガーの例:mns_topic_trigger.yml

    1. triggerConfig:
  • トリガーパラメーターの説明:NULL

概要の例

MNS トピックトリガーは、Function Compute コンソールで、fcli を使用して、または SDK を使用して設定できます。次のセクションでは、各方法の例を示します。

例 1:コンソールで MNS トピックトリガーを作成する

この例では、コンソールで MNS トピックトリガーを設定する方法を示します。関数の作成中、または関数を作成した後にトリガーを設定できます。トリガー作成の詳細については、「トリガーの作成 」 および 「トリガーとイベントの設定」 をご参照ください。

Function Compute コンソールにログインし、リージョンとサービスを選択します。まだサービスを作成していない場合は、「サービスの作成」 をご参照ください。

関数の作成中にトリガーを設定する

  1. [関数の作成] をクリックし、[空の関数] を選択して、[次へ] をクリックします。

  2. [MNS トピックトリガー] を選択します。

  3. 関数を作成し、パラメーターを指定します。[インライン編集] を選択し、次の Python コード例を貼り付けて、[次へ] をクリックします。

  1. import logging
  2. def handler(event, context):
  3. # event is messages that posted on a topic
  4. logger = logging.getLogger()
  5. logger.info("mns topic trigger event = {}".format(event))
  6. return "OK"
  1. ニーズに基づいて許可を設定し、[次へ] をクリックします。設定を確認したら、[作成] をクリックします。

関数を作成した後にトリガーを設定する

  1. 作成した関数を選択し、[トリガー] > [トリガーの作成] をクリックします。

  2. [MNS トピックトリガー] を設定し、[OK] をクリックします。

    注意:承認プロセスをスピードアップするために [クイック承認] を使用できます。

例 2:fcli を使って MNS トピックトリガーを作成する

まず、Trigger Config を含む yaml ファイルを作成します。yaml ファイルは以下のとおりです。

  1. triggerConfig:

対応する関数のディレクトリ配下にトリガーを作成します。

  1. mkt triggerName serviceName/functionName -t mns_topic -c TriggerConfig.yaml -r acs:ram::$accountId:role/aliyunmnsnotificationrole -s acs:mns:cn-hangzhou:$accountId:/topics/$topicName
  • -r —invocation-role string トリガーロールを指定します。
  • -s —source-arn string イベントソースの ARN を指定します。(例:acs:mns:cn-hangzhou:123456/topics/test-topic)
  • -c —trigger-config string トリガー設定ファイルを指定します。
  • -t —type string トリガーのタイプを指定します。

fcli の詳細については、「ツール - fcli」 をご参照ください。

例 3:SDK を使って MNS トピックトリガーを作成する

次の例では、FC Python SDK を使用して MNS トピックトリガーを作成しています。Function Compute は Node.js SDK および Java SDK も提供しています。

トリガーの作成

  1. client = fc2.Client(
  2. endpoint='<Your Endpoint>',
  3. accessKeyID='<Your AccessKeyID>',
  4. accessKeySecret='<Your AccessKeySecret>')
  5. service_name = 'serviceName'
  6. function_name = 'functionName'
  7. trigger_name = 'triggerName'
  8. trigger_type = 'mns_topic'
  9. source_arn = 'acs:mns:cn-hangzhou:<Your Account ID>:/topics/<Your topicName>'
  10. invocation_role = 'acs:ram::<Your Account ID>:role/<Your Invocation Role>'
  11. trigger_config = {}
  12. client.create_trigger(service_name, function_name, trigger_name, trigger_type, trigger_config, source_arn, invocation_role)

関数の作成

  1. import logging
  2. def handler(event, context):
  3. # event is messages that posted on a topic
  4. logger = logging.getLogger()
  5. logger.info("mns topic trigger event = {}".format(event))
  6. # to do anything, for example, record event to tablestore
  7. return "OK"