[新機能] CFnがサードパーティリソースをサポートしたので New Relic のアラートを設定してみた #newrelic

CloudFormationに機能追加があり、AWSだけでなくサードパーティのリソースまで作れるようになりました。実際にNew RelicのAlertを作成してみます
2019.11.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、IaC してますか?(挨拶

現地時間 11/18 の発表になるのですが、AWS のリソースを JSON ・ YAML で定義し構築できるという AWS CloudFormation に機能追加があり、AWS だけでなくサードパーティのリソースまで作れるようになりました!

CloudFormation Update – CLI + Third-Party Resource Support + Registry | AWS News Blog

現時点でサポートしているサードパーティリソースのひとつ、 New Relic の Alert 設定をさっそく試してみたので手順をご紹介します。
他のサードパーティのリソースを利用する場合にも、手順の流れ的には似た感じになると思われるので、 New Relic を使われていない方にも参考になるかと思います。

その前に:何の役に立つ?

まだ実装されたばかりの機能なので予断はできませんが、初期のラインナップをみると、AWS は「構築したインフラとライフサイクルが同じサードパーティ製品の設定」をコントロールすることを想定しているように思われます。インフラを構築したあと、セキュリティや運用上の要件からいっしょに設定をする必要がある場合に、おなじコードから設定できると便利だということだと思います。

なので、例えば監視 SaaS のダッシュボードを CFn で作るとか、そういうことは出来ません(少なくとも今は)。今後はわかりませんが、今はそのような認識でこの機能を検討するとよさそうです。

ちなみに初期ラインナップは、運用 SaaS の Atlassian OpsgenieSpotinst、セキュリティの Fortinet、監視/分析 SaaS の DatadogDensifyDynatrace、そして New Relic、となっています。

前準備 1 : CloudFormation サイド

まず最初に、サードパーティが公開している Schema Handler Package を自分の AWS アカウントの環境に登録する必要があります。

Schema Handler Package はたいてい各サードパーティ所有の S3 のバケットに置かれているようで、New Relic の場合は下記になります。

  • s3://nr-cloudformation-downloads/newrelic-alerts-nrqlalert.zip

このパッケージを追加することで、CFn テンプレート内で使えるリソースタイプが増えることになります。

現在のところ、パッケージの登録には AWS CLI を使用する必要があります。
また、パッケージはリージョン毎に登録する必要があるのでご注意下さい。New Relic 側にはリージョンは関係ないので、CFn を実行する AWS リージョンのことを考えて登録します。

ここではひとまず東京リージョン(ap-northeast-1)に登録してみます。権限のある状態で下記のコマンドを実行しましょう。

aws cloudformation register-type \
    --region ap-northeast-1 \
    --type-name NewRelic::Alerts::NrqlAlert \
    --schema-handler-package \
        s3://nr-cloudformation-downloads/newrelic-alerts-nrqlalert.zip \
    --type RESOURCE

ターミナル上に「"RegistrationToken": 〜〜」などと表示されたら、ひとまず成功です。すこし時間をおいてから下記を実行してみて下さい。

aws cloudformation list-types \
    --visibility PRIVATE

以下のような出力が返ってきたら成功です!
自分がためしてみたところだと、コマンド実行から登録されるまでに数十秒〜数分程度のラグがある感じでした。

{
    "TypeSummaries": [
        {
            "Type": "RESOURCE",
            "TypeName": "NewRelic::Alerts::NrqlAlert",
            "DefaultVersionId": "00000001",
            "TypeArn": "arn:aws:cloudformation:ap-northeast-1:247453804621:type/resource/NewRelic-Alerts-NrqlAlert",
            "LastUpdated": "2019-11-22T09:07:24.391Z",
            "Description": "Resource schema to create a NewRelic NRQL-based Alert"
        }
    ]
}

また、確認は AWS マネジメントコンソールからも可能です。下記リンクを開いてみて下さい。

下記スクリーンショットのように、NewRelic::Alerts::NrqlAlert が表示されれば成功です!

前準備 2 : New Relic サイド

続いて New Relic 側の準備をします。

  • API キーの用意
  • Alert を登録する Alert Policy の Policy ID の確認

順にご説明します。

API キーの用意

New Relic の場合、このリソースタイプを使って CFn から Alert を追加する場合、API キーは Admin 権限のものが必要です

ぼくはここで少しはまったのですが、通常 APM エージェントに埋め込んだりする REST API key (NRRA-ほげほげ)ではなく、Admin ユーザが発行できる Admin's API key (NRAA-ほげほげ)である必要があります。

New Relic のアカウントそのものの環境をいじるのですから仕方ないとはいえ、Admin's API key はユーザー毎にひとつしか作れないしちょっと怖いですねw
思いつきですが、このキーを発行するための専用の Admin ユーザを作ってしまうのもいいかもしれません。

もっともこの API キーの仕様は、New Relic 固有のものです。どのような権限が必要かは利用される SaaS のドキュメントを確認して下さい。

Policy ID の確認

CFn から作成される Alert は、予め作成されている Alert Policy に所属させることになります。もしまだひとつも Alert Policy がない場合は、サンプル的にとりあえずひとつ作ってしまいましょう。その際の INCIDENT PREFERENCE は適当で構いません。

Polidy Id は URL の末尾に書いてあるのでそれをメモしておきます。

これで準備は完了です!

Alert 追加

それではいよいよ、Alert を追加してみましょう。CFn のテンプレートはこのようになります。

---
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  NewRelicApiKey:
    Type: String
  NewRelicPolicyId:
    Type: String
Resources:
  LambdaNodeAlert:
    Type: NewRelic::Alerts::NrqlAlert
    Properties:
      ApiKey: !Ref "NewRelicApiKey"
      PolicyId: !Ref "NewRelicPolicyId"
      NrqlCondition:
        Name: Alert Condition Test
        RunbookUrl: http://example.com/runbook
        Enabled: true
        ExpectedGroups: 0
        IgnoreOverlap: true
        ValueFunction: single_value
        Terms:
          - Duration: "1"
            Operator: "equal"
            Priority: "critical"
            Threshold: "1"
            TimeFunction: "all"
        Nrql:
          Query: "SELECT count (*) FROM AwsLambdaInvocation WHERE provider.functionName = 'LambdaNode'"
          SinceValue: "1"

ほとんど New Relic が公開しているドキュメントからのコピペなんですが、若干インデントが狂ったりしていたところを直したりしています。
また API キーと Policy Id はパラメータとして外に出しました。本格的に使う場合は Systems Manager Parameter Store を使うなどしたほうが良いかと思います。Admin キーですし!
また、NameRunbookUrlQueryなども環境にあわせて適切に変更して下さい。

パラメータの詳細は↓のドキュメントを参照ください。NrqlConditionConditionと書いてあったりとちょっと不安になるところもありますが、必要な情報はそろっています。

またもちろん、他のリソースを構築する際のテンプレートに追加したり nest したりでも問題ありません。
ここではQuery 文に「LambdaNode」と Lambda 関数名が埋め込まれているので、ここはパラメータ化するか動的に生成する感じになるのかなと思います。

公式のこのドキュメントでは、Lambda 関数の作成と同時に Alert を作成する内容になっていますね。

ではこのテンプレートを流してみます。CLI からはこのような感じになります。

aws cloudformation create-stack \
  --region ap-northeast-1 \
  --template-body "file://cfn-template-file.yml" \
  --parameters \
      ParameterKey=NewRelicApiKey,ParameterValue=<API キー> \
      ParameterKey=NewRelicPolicyId,ParameterValue=<Policy ID> \
  --stack-name NewRelicAlert

もちろんこのコマンドライン内の<APIキー> <Policy ID>は、上で確認した情報に置き換えて下さい。
正常に作成されたでしょうか?

出来ていたら通常通り CloudFormation Stack はCREATE_COMPLETEになっているかと思います。New Relic 側の Alert Policy の画面を見てみて(リロードしてみて)ください。

もちろん、この Stack を削除したら New Relic の Alert も削除されます。

まとめ

CFn が進化してサードパーティのリソースまで扱えるようになった、というアップデートについてご紹介しました。これまでは例えば EC2 上の UserData でシェルスクリプトを実行していたような SaaS への登録作業が、CFn テンプレートでべき等性をもって実行できるのはいいですね!

いまはまだ全体的に、情報の整理が追いついていない感がありますが、便利に使える環境であれば活用してみて下さい。