Message Service (MNS) は、効率的で信頼性があり、安全で便利なスケーラブル分散メッセージサービスです。MNS により、アプリケーション開発者は分散コンポーネント間でデータと通知メッセージを簡単に転送し、疎結合システムを構築できます。Message Service では、パブリッシャーは PublishMessage API を使用してメッセージをトピックに公開できます。その後、トピックサブスクライバーはこれらのメッセージを受信できます。MNS と Function Compute (FC) は、MNS トピックをイベントソースとして提供するために統合されました。これにより、関数をトピックサブスクライバーとして使用できるようになります。また、カスタム関数を使用してトピックに公開されたメッセージをタイムリーに処理できます。
上の図に示すように、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
triggerConfig:
- トリガーパラメーターの説明:NULL
概要の例
MNS トピックトリガーは、Function Compute コンソールで、fcli を使用して、または SDK を使用して設定できます。次のセクションでは、各方法の例を示します。
例 1:コンソールで MNS トピックトリガーを作成する
この例では、コンソールで MNS トピックトリガーを設定する方法を示します。関数の作成中、または関数を作成した後にトリガーを設定できます。トリガー作成の詳細については、「トリガーの作成 」 および 「トリガーとイベントの設定」 をご参照ください。
Function Compute コンソールにログインし、リージョンとサービスを選択します。まだサービスを作成していない場合は、「サービスの作成」 をご参照ください。
関数の作成中にトリガーを設定する
[関数の作成] をクリックし、[空の関数] を選択して、[次へ] をクリックします。
[MNS トピックトリガー] を選択します。
関数を作成し、パラメーターを指定します。[インライン編集] を選択し、次の Python コード例を貼り付けて、[次へ] をクリックします。
import logging
def handler(event, context):
# event is messages that posted on a topic
logger = logging.getLogger()
logger.info("mns topic trigger event = {}".format(event))
return "OK"
- ニーズに基づいて許可を設定し、[次へ] をクリックします。設定を確認したら、[作成] をクリックします。
関数を作成した後にトリガーを設定する
作成した関数を選択し、[トリガー] > [トリガーの作成] をクリックします。
[MNS トピックトリガー] を設定し、[OK] をクリックします。
注意:承認プロセスをスピードアップするために [クイック承認] を使用できます。
例 2:fcli を使って MNS トピックトリガーを作成する
まず、Trigger Config を含む yaml ファイルを作成します。yaml ファイルは以下のとおりです。
triggerConfig:
対応する関数のディレクトリ配下にトリガーを作成します。
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 も提供しています。
トリガーの作成
client = fc2.Client(
endpoint='<Your Endpoint>',
accessKeyID='<Your AccessKeyID>',
accessKeySecret='<Your AccessKeySecret>')
service_name = 'serviceName'
function_name = 'functionName'
trigger_name = 'triggerName'
trigger_type = 'mns_topic'
source_arn = 'acs:mns:cn-hangzhou:<Your Account ID>:/topics/<Your topicName>'
invocation_role = 'acs:ram::<Your Account ID>:role/<Your Invocation Role>'
trigger_config = {}
client.create_trigger(service_name, function_name, trigger_name, trigger_type, trigger_config, source_arn, invocation_role)
関数の作成
import logging
def handler(event, context):
# event is messages that posted on a topic
logger = logging.getLogger()
logger.info("mns topic trigger event = {}".format(event))
# to do anything, for example, record event to tablestore
return "OK"