CodeZine(コードジン)

特集ページ一覧

StackStormで始める運用自動化 ~入門編~

StackStorm入門(1)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

目次

動かしてみる

 構築したStackStorm環境に対して、以下のようにAWSで発生したイベントを検知してアクションcore.localを実行する環境を構築します(core.localがどんな処理を行うかについては以降で解説します)。

構築する環境
構築する環境

 ここではAmazon CloudWatchで検出されたAmazon EC2のリソース変更のイベントを検知し、core.localアクションを実行させます。

 core.localはWorkerノードにおいて任意のコマンドを実行するアクションになります。StackStormでは次のように、アクションを単体実行することもできます。

アクション「core.local」の実行結果
アクション「core.local」の実行結果

 パラメータ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_idaws_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のイベントをSQSに通知
EC2のイベントをSQSに通知

 ここまでの設定で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'

 冒頭のnamedescriptionは、それぞれルールのラベルと説明文を表します。enabledパラメータは、当該ルールを有効化するかどうかを設定するためのもので、Falseを指定した場合には、ルールで指定したトリガが引かれてもアクションを実行しません。

 またtriggeractionパラメータによって、トリガとアクションの紐付けを行っています。それぞれtrigger.typeaction.refパラメータでどのトリガが引かれたら、どのアクションを実行するかを指定しています。

 末尾のcriteriaでは、アクションを実行する条件を記述することができます。StackStormのルールエンジン(RuleEngine)は、trigger.typeで指定したトリガが引かれ、かつcriteriaで指定した条件に合致した場合にaction.refで指定したパラメータを実行します。ここでは、以下で示すトリガパラメータのqueueの値がnotification_queueだった場合に、アクションを実行する設定を記述しています。

 なおcriteriaパラメータは省略可能です。その際はtrigger.typeのトリガが引かれた場合にaction.refのアクションを実行します。

 アクションの指定に関してもう少し詳しく解説します。action.parametersでは、トリガからの出力パラメータとアクションへの入力パラメータの変換設定を行っています。ここでは、トリガの出力bodyパラメータをechoコマンドの引数に指定しています。

 トリガとアクションがそれぞれがどういったパラメータを持っているかについてはst2 action getst2 trigger getコマンドで確認できます。以下は、それぞれのパラメータを確認した結果です。

トリガ「aws.sqs_new_message」の詳細情報
トリガ「aws.sqs_new_message」の詳細情報
アクション「core.local」の詳細情報
アクション「core.local」の詳細情報

 トリガaws.sqs_new_messageの出力としてqueuebodyのパラメータがあり、そしてアクションcore.localの入力としてcmdsudoパラメータがあることが分かります。またアクションの入力パラメータのうちcmdrequired: trueとなっており、必須パラメータであることを表しています。

動作確認

 ここでいよいよルールを登録してEC2にインスタンスを作成し、そのイベントを検知できるか確認します。

 まずは以下のコマンドで、先ほど作成したルールを登録します。

ルール「ec2_event_handling」を登録
ルール「ec2_event_handling」を登録

 続いてEC2のコンソールから、インスタンスtest-instanceを作成します。

EC2にインスタンスを作成
EC2にインスタンスを作成

 程なくして、ルールで記述したechoコマンドのリダイレクト先のファイル/tmp/resultsにCloudWatchの出力が表示されることが確認できます。

EC2イベントの通知結果
EC2イベントの通知結果

 ここまでEC2のイベントをStackStormで受け取り、ユーザ定義のルールに沿って処理する方法について解説してきました。ここまでの内容を応用することで、さまざまなアプリケーションサービスと連携する処理を簡単に設定することができます。

 なお、本章の内容を実際に動かして確認するにはクレジットカード登録を行ったAWSアカウントが必要になり、手軽に試すことができないユーザもいるかもしれません。そうした方はツチノコブログに別の例(GitHubRabbitMQを利用したイベントハンドリング)を示しましたので、併せてご参照ください。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:StackStorm入門

著者プロフィール

  • 大山 裕泰(株式会社DMM.comラボ)(オオヤマ ヒロヤス)

    DMM.com ラボ所属ソフトウェアエンジニア。アリエル・ネットワーク株式会社、グリー株式会社を経て現在に至る。最近は主にインフラ基盤の構築、運用、機能開発を行う。共著書に「次世代ネットワーク制御技術 OpenFlow入門」がある。

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5