動かしてみる
構築したStackStorm環境に対して、以下のようにAWSで発生したイベントを検知してアクションcore.local
を実行する環境を構築します(core.local
がどんな処理を行うかについては以降で解説します)。
ここではAmazon CloudWatchで検出されたAmazon EC2のリソース変更のイベントを検知し、core.local
アクションを実行させます。
core.localはWorkerノードにおいて任意のコマンドを実行するアクションになります。StackStormでは次のように、アクションを単体実行することもできます。
パラメータcmd
で受けたコマンドdate
を、ローカルノードst2-node
で実行しています。実行結果のresult.stdout
パラメータから、当該アクションで得られた標準出力の結果を確認できます。またstatus
から、当該アクションが正常終了(succeeded)したことが確認できます。
以下では、このアクションを冒頭の図で示したようにaws.sqs_new_message
トリガが引かれた際に実行する方法を解説します。
環境構築
ここでは以下の設定を行い、AWSのイベントが呼ばれた際にcore.localアクションが実行されるようにします。
- aws packのインストール
- aws packの設定
- Amazon SQS、CloudWatchの設定
- Ruleの設定
aws packのインストール
サードパーティのさまざまなpackがStackStorm Exchangeに登録されており、ここに登録されているpackを以下のコマンドでインストールできます。ここではawsの最新のpackをインストールします。
$ st2 pack install aws
インストールされたpackは以下のコマンドで確認できます。
$ st2 pack list
aws packの設定
インストールされたpackに関連するファイルは、通常/opt/stackstorm/packs
配下に展開されます。今回インストールしたaws packの場合は/opt/stackstorm/packs/aws
になります。
また各packの設定ファイルconfig.yaml
が、packのディレクトリのトップに配置されます。ここでawsの設定ファイルを次のように編集してください。
--- aws_access_key_id: "*****" aws_secret_access_key: "******" region: "ap-northeast-1" interval: 20 st2_user_data: "/opt/stackstorm/packs/aws/actions/scripts/bootstrap_user.sh" service_notifications_sensor: host: "localhost" port: 12345 path: "/my-path" sqs_sensor: input_queues: "notification_queue" sqs_other: max_number_of_messages: 1
冒頭のaws_access_key_id
,aws_secret_access_key
およびregion
で認証情報とリージョンを設定しています。aws_access_key_id
とaws_secret_access_key
の取得方法についてはAWSのドキュメントを参照してください。リージョンは東京リージョンap-northeast-1
を指定します。
またイベントメッセージが通知されるAmazon SQSのキュー名notification_queue
を指定します。ここで指定したキューはこの後でAWSマネジメントコンソールから作成します。
最後に、更新した設定を読み込ませるため、センサを再起動させます。
$ sudo st2ctl restart-component st2sensorcontainer
Amazon SQS、CloudWatchの設定
Amazon SQSはAmazonが提供するフルマネージのMQサービスで、CloudWatchはモニタリングサービスです。ここではCloudWatchにおいてEC2やS3などのリソースが変更された際に、Amazon SQSに通知メッセージを送るように設定します。
StackStormはSQSに送られたメッセージを取得することで、間接的にAWSのイベントをハンドリングできます。StackStormはSQSを利用する方法の他に、Amazon SNSを利用して通知を取得することもできます。後者の設定方法については、本稿では割愛します。
では、それぞれの設定を実施します。
まず以下のようにAmazon SQSのコンソールから、packの設定ファイルのsqs_sensor.input_queues
で指定した名前のキューを作成します。
続いてCloudWatchのコンソールでEC2のイベントをSQSのキューnotification_queue
に送るルールを作成します。
ここまでの設定でEC2のイベントをaws packのセンサAWSSQSSensor
で検知する準備が整いました。
Ruleの設定
次に、センサAWSSQSSensor
がトリガaws.sqs_new_message
を引いた際に、アクションcore.local
を実行するルールを定義します。
以下がルール定義の全文になります。ルール定義はYAML形式で記述します。これをホームディレクトリにec2_event_handling.yaml
という名前で保存します。
--- name: 'ec2_event_handling' description: 'A rule to get events on Amazon EC2' enabled: True trigger: type: aws.sqs_new_message action: ref: 'core.local' parameters: cmd: 'echo "{{trigger.body}}" >> /tmp/results' criteria: trigger.queue: pattern: 'notification_queue' type: 'equals'
冒頭のname
とdescription
は、それぞれルールのラベルと説明文を表します。enabled
パラメータは、当該ルールを有効化するかどうかを設定するためのもので、False
を指定した場合には、ルールで指定したトリガが引かれてもアクションを実行しません。
またtrigger
とaction
パラメータによって、トリガとアクションの紐付けを行っています。それぞれtrigger.type
とaction.ref
パラメータでどのトリガが引かれたら、どのアクションを実行するかを指定しています。
末尾のcriteria
では、アクションを実行する条件を記述することができます。StackStormのルールエンジン(RuleEngine)は、trigger.type
で指定したトリガが引かれ、かつcriteria
で指定した条件に合致した場合にaction.ref
で指定したパラメータを実行します。ここでは、以下で示すトリガパラメータのqueue
の値がnotification_queue
だった場合に、アクションを実行する設定を記述しています。
なおcriteria
パラメータは省略可能です。その際はtrigger.type
のトリガが引かれた場合にaction.ref
のアクションを実行します。
アクションの指定に関してもう少し詳しく解説します。action.parameters
では、トリガからの出力パラメータとアクションへの入力パラメータの変換設定を行っています。ここでは、トリガの出力body
パラメータをecho
コマンドの引数に指定しています。
トリガとアクションがそれぞれがどういったパラメータを持っているかについてはst2 action get
とst2 trigger get
コマンドで確認できます。以下は、それぞれのパラメータを確認した結果です。
トリガaws.sqs_new_message
の出力としてqueue
とbody
のパラメータがあり、そしてアクションcore.local
の入力としてcmd
とsudo
パラメータがあることが分かります。またアクションの入力パラメータのうちcmd
はrequired: true
となっており、必須パラメータであることを表しています。
動作確認
ここでいよいよルールを登録してEC2にインスタンスを作成し、そのイベントを検知できるか確認します。
まずは以下のコマンドで、先ほど作成したルールを登録します。
続いてEC2のコンソールから、インスタンスtest-instance
を作成します。
程なくして、ルールで記述したecho
コマンドのリダイレクト先のファイル/tmp/results
にCloudWatchの出力が表示されることが確認できます。
ここまでEC2のイベントをStackStormで受け取り、ユーザ定義のルールに沿って処理する方法について解説してきました。ここまでの内容を応用することで、さまざまなアプリケーションサービスと連携する処理を簡単に設定することができます。
なお、本章の内容を実際に動かして確認するにはクレジットカード登録を行ったAWSアカウントが必要になり、手軽に試すことができないユーザもいるかもしれません。そうした方はツチノコブログに別の例(GitHub
とRabbitMQ
を利用したイベントハンドリング)を示しましたので、併せてご参照ください。