Datadogと外部サービスを連携し、EC2上のサービスを自動復旧してみた

    こんにちは、サイオステクノロジーのヒラオです。

    DatadogでEC2のサービスを監視し、障害検知したらサービスを再起動するとこまで自動にできたらいいのに、、、と思ったことはありませんか。

    SIOS AppKeeper(以下AppKeeper)という、Amazon EC2のサービス監視と再起動を自動で行ってくれるサービス(SaaS)があります。このサービスの再起動する機能とDatadogを連携して、サービスの異常検知から自動復旧までを自動化できないかやってみました。

    その結果、うまくいったのでその手順をご紹介します。

    既に利用中のDatadogと連携してぜひ試してみたい、という方がおられましたら、本記事の最後よりお申込みください。

    ということで、以降は、実際の手順を紹介いたします。

    システム構成

    Amazon EC2(以下EC2)上でWebサーバを動作させ、Synthetics(外形監視)をDatadogで行います。

    DatadogのアラートをAppKeeperが受け取り、動作異常となっているサービスを再起動してWebサーバーを復旧させます。

    前提条件

    下記は既に準備されているものとします。

    • Datadogのアカウント
    • AppKeeperのアカウント
    • EC2インスタンス(OS: Amazon Linux 2)

    手順

    1.AppKeeperの再起動APIのトークンを取得する

    フォームから、Datadog連携用の再起動APIの評価版トークンを申請します。
    https://mk.sios.jp/BC_AppKeeper_Datadog_api_application

    フォームで申請したメールアドレスに、評価版トークンが送信されます。

    2.Webサーバ(Nginx)をセットアップする

    今回は、Nginxを監視対象とします。

    Amazon Linux 2の場合、Nginxは amazon-linux-extras パッケージからインストールが可能です。

    sudo amazon-linux-extras install -y nginx1

    インストールが完了したら、Nginxを実行します。

    sudo systemctl start nginx

    WebブラウザからNginxが動作していることを確認します。
    WebブラウザのURL欄に下記URLを入力しページを開きます。

    http://xx.xx.xx.xx
    

    *(xx.xx.xx.xx)にはインスタンスのPublic IPが入ります。
    下記のようなページが表示されればセットアップは無事完了です。


    以上で、監視対象インスタンスの準備は完了です。

    3.AppKeeperでテナントを作成する

    監視対象インスタンスが所属するAWSアカウントを、AppKeeperに登録します。(AppKeeperでは、登録されたAWSアカウントを「テナント」と呼びます。)

    3.1.AWSで IAM Roleを作成する

    AppKeeperがインスタンスにアクセスするためのIAM Roleを作成します。
    IAM Roleの作成にはCloudFormationのテンプレートを利用します。

    AWS マネジメントコンソールの CloudFormationの画面から、 スタックの作成 > 新しいリソースの使用 を選択します。

    テンプレートの指定 に下記S3 URLを入力し、次へをクリックします。

    https://coati-cloudformation-template-product.s3-ap-northeast-1.amazonaws.com/coati_iam_role.template.yml

    「スタックの名前」「IAMRoleName」「PolicyName」欄に下記の値を入力し、「次へ」ボタンをクリックします。

     スタックの名前 : CoatiIAMRoleStack
     IAMRoleName : CoatiIAMRole
     PolicyName : CoatiRole

    「スタックオプションの設定」は変更せず「次へ」をクリックします。

    「レビュー {{ スタック名 }}」は 「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」にチェックを入れて「次へ」をクリックします。

    スタックのステータスが「CREATE_COMPLETE」になればIAM Roleの作成は完了です。

    3.2.AppKeeperでテナントを追加する

    AppKeeperにAWSアカウントの登録を行います。

    AppKeeperにログインしたら、左下の「テナントを追加」ボタンをクリックします。
    下記のような画面が出てくるので、入力フォームを埋めます。IAM Roleの欄には「(AWS)IAM Roleを作成する」で作成したロール名を入力します。

    テナント一覧から、上の手順で追加したテナントのパネルを開き、「リソース検出」ボタンをクリックします。
    一覧に「Webサーバ(Nginx)をインストールする」でセットアップしたインスタンスが表示されていれば、AppKeeperの準備は完了です。

    4.Datadogで外形監視を設定する

    さきほど設定したNginxサーバ(EC2インスタンス)に対して、Datadogの外形監視を設定します。

    Datadogのダッシュボードを開き、メニューから UX Monitoring > Synthetic Tests を開きます。
    右上の「New Test」ボタンをクリックし、「New API Test」を選択し外形監視ケースを作成します。

    外形監視の作成フォームに下記を入力します。

    1. Choose Request Type
      「HTTP」を選択します。
    2. Define Request:
      下記の値を設定します。

       URL     : GET http://{{ EC2のIPアドレス }}
       Name    : AppKeeper Datadog Integration Test (任意の名前)
       Locations  : Tokyo

    3. Specify test frequency
      変更なし
    4. Define assertion
      「New Assertion」をクリックし、下記の値を設定します。
       When : [status code] [is] [200]
    5. Define Alert Condition
      変更なし
    6. Notify Your Team
      変更なし

    上記の入力が完了したら、「Create Test」を押して外形監視のテストケースを作成します。
    作成が完了したら、「Run Test Now」からテストの実行結果を確認できます。Webサーバが正常に稼働していた場合、Test ResultセクションにOKが表示されます。

    以上でDatadogを用いた外形監視の設定は完了です。

    5.外形監視のアラートをAppKeeperで受け取る

    外形監視のアラートが発生した際に、AppKeeperに通知を送るように設定します。

    はじめに、通知先にAppKeeperを設定します。
    Datadogのメニューより、 Integrations > Integrations と進みます。

    検索ボックスに「Webhooks」を入力しWebhooksインテグレーションを検索します。「Available」をクリックし、DatadogアカウントでWebhooksインテグレーションを有効にします。(有効になると、Installed の欄に表示されるようになります)

    「Configure」をクリックし、Webhooksインテグレーションの設定画面を開きます。

    ページ下部の「Webhooks」欄で、「New +」をクリックし、新規のWebhooks通知先を作成します。パラメータには下記を入力します。

     Name : インテグレーションの名前(任意の名前)
     URL : https://api.appkeeper.sios.com/v2/integration/{{ AWSアカウントID }}/actions/recover
     Payload :

    {
      "instanceId": "{{ EC2のインスタンスID}}",
      "name": "nginx"
    }

    Custom Headers: チェックを入れ、下記を入力

    {
        "Content-type": "application/json",
        "accept": "application/json",
        "appkeeper-integration-token": "{{ AppKeeperの外部連携用トークンを取得 で取得したトークン }}"
    }

    入力が完了したら、Saveを押します。

    次に、外形監視のアラート発生時に、AppKeeper(登録したWebhooksインテグレーション)が呼び出されるよう設定を行います。
    メニューの UX Monitoring > Synthetic Tests より、「Datadogで外形監視を設定する」で設定した外形監視のテストケースを開きます。
    右上の歯車マークから、「Edit test details」を選択し、「5. Notify Your Team」に下記の値を入力し、変更を保存します。

    @webhook-{{ DatadogのWebhookインテグレーションの名前 }} 

    ※ renotify if the monitor has not been resolved. を設定することで、AppKeeperが初回の復旧に失敗した場合にリトライができます。今回は動作検証が目的のため必須の項目ではないですが、実運用下では [10 minutes] (再通知の最小間隔) の設定を推奨します。

    以上で設定は完了です。

    6.動作の確認

    Webページが見れなくなった場合に、障害が復旧されるかを確認してみます。

    Datadogの UX Monitoring > Synthetic Testsから先ほど設定した外形監視のテストケースを開きます。
    右上の Resume Test をクリックし、外形監視をオンにします。

    外形監視をオンにすると、Datadogが一定時間ごとに外形監視を実行します。
    Test Results を参照すると、サーバに正常にアクセスできていることがわかります。

    次に、Webサーバに擬似的な障害を起こしてみます。
    実際に障害を発生させるのは難しいため、今回はサービスを停止してWebページが見れない状態を再現します。
    NginxサーバをインストールしたEC2インスタンスにSSHで接続し、Nginxを停止してみます。

    sudo systemctl stop nginx

    少し待つと、Datadog側がWebサーバにアクセスできなくなったことを検知します。
    DatadogのSynthetic Testsのページにも、テストケースに失敗したことが表示されます。

    テストケースに失敗すると、DatadogはAppKeeperに外形監視で失敗したことを通知します。
    AppKeeperは通知を受け取ると、Nginxの再起動を自動的に試みます。
    そのため、少し待つとDatadogの外形監視のチェックが再び通るようになります。

    また、AppKeeperのダッシュボードにログインしてみると、リカバリが実行されたことがわかります。

     

    評価用トークンの申請

    今回は、Webサーバ(Nginx)を例にDatadogで障害を検知し、AppKeeperでサービスを復旧させるまでを自動化してみました。
    アラートを受け取り、特定のサービスを再起動させる一連の動作は、EventBridgeとLambdaを連携させたり、スクリプトを組めば実現できるものです。

    しかしながら、対象インスタンスの追加が頻繁に発生したり、再起動する対象サービスが多岐にわたると、EventBridgeとLambda又はスクリプトをメンテナンスするコストがかさんでいきます。

    Datadogとの連携実績もあり、対象インスタンスの追加も容易なAppKeeperを使い、費用対効果の高い障害対策の自動化を始めてみませんか。

    今お使いのDatadogと連携できるAppKeeperの再起動APIをお試し利用されたい方はこちらからお申込みください。弊社から利用開始までの手順と評価用トークンを無償で発行させていただきます。

     

    EC2で稼働するアプリケーションの自動監視と自動復旧を実現する、SIOS AppKeeperの詳細についてはこちらをご覧ください。
     → https://sios.jp/products/appkeeper/

    SNSでもご購読できます。