本記事は Automate Configuration with Observability as Code の内容を抄訳した記事となります。
Observability as Code は、オブザーバビリティツールの設定をコーディングすることによって自動化するプロセスです。略して o11y as code と呼ぶこともあります。すでにインフラストラクチャをコードとして管理しているのであれば、ダッシュボードをはじめとしたオブザーバビリティツールも、同じ方法で管理することを検討してみてください。
この3部構成のブログシリーズでは、Observability as Code を活用して、オブザーバビリティツールの設定を自動化するためのヒント、導入のガイダンスやコードサンプルをご紹介します。第1部はダッシュボードから始めます。第1部では、Terraform の基本、サンプルアプリをプロビジョニングする方法、実際にコードを用いてダッシュボードを作成する方法について説明します。
このシリーズでは、New Relic と HashiCorp 社の Terraform を使用して、実際に5つの具体的な実装サンプル(ダッシュボード、アラート、外形監視、タグ操作、そしてコードによるワークロード管理)の操作を行い、Observability as Code について理解を深めることができます。なお、作業にあたっては、サンプルの FoodMe レストラン注文アプリのデータを使用します。
ブログシリーズ Observability as Code による設定の自動化 のコンテンツは、ワークショップとして提供されます。サンプルコード、Instruqt オンラインワークショップ、ブログ投稿の動画を使用して、いつでも誰でも「実際に操作」してみることができます。最高のエクスペリエンスを実現するために、可能であれば以下の3つすべてに触れてみてください。
- この3部構成のシリーズで説明する完全なコードを確認して実行する。
- Instruqt の実践的なワークショップに参加する。
- 埋め込み動画を含む、このブログ投稿を一読する。
Instruqt をまだ使用したことがない場合は、以下の2つの動画を見て、概要や使い方を確認してください。
私たちが歩んだ道のりとInfrastructure as Code
10年以上前に Infrastructure as Code(IaCとも呼ばれる)が登場して以来、コードを使用したプロビジョニングは、現代のクラウド時代のコア要件になっています。「as Code」(コードとして)という用語は、一般的なプログラムのコードを扱うのと同じようにインフラストラクチャ設定を定義し、設定ファイルをソース管理システムにプッシュし、変更をインフラストラクチャ層に慎重に適用する、一連のプロセスを意味します。
最新の分散システムの台頭に伴って、システム停止も増えており、何か問題が発生した際に問題の根本原因を見つけるのが困難な場合があります。分散されたシステムの出力からシステムの内部状態を判断することがますます重要となる、この新しいパラダイムにおいて、オブザーバビリティは強力なツールとなります。オブザーバビリティは、トレース、ログ、メトリクスなどのさまざまなシステム出力を使用して、分散コンポーネントの内部状態を把握し、問題箇所を診断し、根本原因を特定します。
一方で、私たちが依存している運用慣行はそれほど変わっておらず、開発者や運用エンジニアは依然として何百ものアラートやダッシュボードを確認していることにお気づきの方もいるかもしれません。このようなアプローチは、再現性が低く標準化されていないダッシュボードが乱立したり、あるいはシグナル疲れやチームのベストプラクティスからの逸脱を避けるために、しばしば手動で多くのアラート条件を調整することにつながります。
しかし、Infrastructure as Code について知っていることと同様の手法で、オブザーバビリティを自動化することができます。オブザーバビリティの設定をコードとして扱う、この新しいアプローチが、今回紹介する Observability as Code です。Observability as code で業務をシンプルにする でも説明していますが、Observability as Code は、設定のメンテナンスと開発に必要な作業を削減して、監査可能なコード管理ソリューションへ移行することを意味します。
Terraformの基本情報
Hashicorp 社が提供する Terraform は、Infrastructure as Code のツールで、人間が読み書きしやすい形式の設定ファイルを使用して、インフラストラクチャリソースを定義し、管理できます。サービスを宣言的に管理して、それらのサービスへの変更を自動化できます。
ほとんどの例では、Terraform モジュールは1つのディレクトリにあるTerraform設定ファイルの集合です。その1つのディレクトリから直接 Terraform コマンドを実行する場合、そのディレクトリはルートモジュールと見なされます。Terraform のドキュメントでは、以下のような構成が示されています。
このブログシリーズで使用するTerraformファイル
このブログシリーズの演習では、次の2つの重要なファイルに焦点を絞ります。
main.tf
ファイルには、モジュールの主な設定が含まれています。他の設定ファイルを作成すると、プロジェクトに適した方法で整理することもできます。-
variables.tf
ファイルには、モジュール内で参照する変数定義が含まれています。他のユーザーや異なるプロジェクト間でモジュールを共有するような場合には、モジュールブロックの引数でそれぞれの変数定義ファイルを指定します。
New Relic Terraformプロバイダーの例
ここでは、Terraform のドキュメントで公開されている New Relic Terraform プロバイダー設定 を例として使用します。
環境変数 を使用してプロバイダーを設定することもできます。これにより、provider ブロックを簡素化できます。各プロバイダーには、account_id
、api_key
、region
などのキースキーマ属性があります。
覚えておくべきTerraformコマンド
Terraform の利用を始めるにあたって、はじめに次の4つのコマンドを覚えておいてください。
terraform init
コマンドは、現在の作業ディレクトリを初期化して、Terraform で使用できるようにします。このコマンドは、後から構成を変更した場合など、作業ディレクトリを更新するために複数回実行しても安全です。terraform plan
コマンドは、構成ファイルを元に実行計画を作成し、Terraform がインフラストラクチャに加える変更をプレビューできます。このコマンドを使用すると、実際に変更を適用する前に、構文や変更内容に誤りがないかどうかを確認できます。terraform apply
コマンドは、構成ファイルを元に実行計画を自動的に作成し、その計画の承認を求めるプロンプトを表示し、指定されたアクションを実行します。プロンプトに従い、"yes" と答えて承認することで、Terraform によるリソースのプロビジョニングが開始されます。terraform destroy
コマンドは、特定の Terraform 構成ファイルによって管理されるすべてのリモートオブジェクトを一括で削除する便利な方法です。プロンプトに従いユーザーの承認を得たのち、Terraform がすべてのリソースを削除します。
Terraform コマンドの詳細については、Terraform のドキュメントを参照してください。
次のセクションでは、プロバイダー、データソース、リソースなど、Terraform の主要な概念について説明します。Terraform を使用して、サンプルの FoodMe レストランアプリのデータを表示するための New Relic ダッシュボードの作成を自動化してみましょう。
このブログ記事のデモでは、Terraform 構成ファイルで newrelic_one_dashboard
リソースを使用しています。もう一つの方法として、newrelic_one_dashboard_json
リソースを使用する場合は、TerraformとJSONテンプレートを使用したダッシュボードの作成を参照してください。
最初のTerraformモジュールのプロビジョニングを開始する前に
最初の Terraform モジュールをプロビジョニングする前に、New Relic アカウントIDとユーザーキーを取得し、正しいデータセンターを指定する必要があります。
このビデオチュートリアルでは、前提条件の作業について説明します。
サンプルアプリのプロビジョニング
Observability as Code を実装する前に、サンプルアプリのプロビジョニングから始めましょう。
1. このGlitchリンク(glitch.com/edit/#!/remix/nr-devrel-o11yascode)を使用して、FoodMe サンプルアプリの一意のURLを生成します。
2. 環境変数を設定します。.env
に移動し、以下の値を挿入します。
LICENSE_KEY
:New Relic にデータを送信するための Ingest API キーを挿入します。APP_NAME
:FoodMe-XXX
のように、自身の名前またはイニシャルなど、任意の文字列をアプリ名に挿入します(FoodMe-Jan
など)。
3. URIをプレビューします。
Tools (パネル下部)に移動し、Preview in a new windowを選択します。
5. ワークロードをいくつか生成します。ダッシュボードでデータを表示するためには、ある程度データが記録されれている必要があります。先程のURLにアクセスすると、サンプルアプリが表示されているので、任意の名前や配達先住所を入力し、"Find Restaurants!" を選択します。メインページに移動したら、ページ内のリンクをクリックして、サンプルアプリのワークロードをいくつか生成します。
Terraformを使用したダッシュボード作成
Observability as Code に関する最初のチュートリアルの準備が整いました。New Relic カスタムダッシュボードを使用すると、New Relic で表示したい特定のデータを収集して視覚化できます。Terraform を使用して、New Relic でダッシュボードの設定を自動化する方法を説明します。
主な手順は3つあります。このセクションで説明する内容をすべて確認するには、この動画をご覧ください。詳細については、New Relic と Terraform を使い始めるをご覧ください。これらの手順に沿って、GitHub のコードサンプルと Instruqt の実践的なワークショップを活用することもできます。
Terraform の各リソースブロックでは、ダッシュボード、アラート、通知ワークフロー、ワークロードなどの1つ以上のオブザーバビリティ・オブジェクトを記述します。Resource: newrelic_one_dashboardの例を使用します。
1. resource ブロックを作成し、名前(exampledash
)とリソースタイプ(newrelic_one_dashboard
)を宣言します。リソースのタイプと名前はリソースの識別子であるため、モジュール内で一意である必要があります。Resource: newrelic_one_dashboard に基づいて、New Relic にダッシュボードをデプロイする簡単な例を紹介します。
各ブロックに記載している属性の詳細については、Terraform New Relic プロバイダーのドキュメントを参照してください。
また、設定内で記述している New Relicのクエリ言語(NRQL)についての詳細は、NRQL リファレンスを参照してください。
次に、Terraform に variables.tf
ファイルを含めます。入力変数を使用すると、ソースコードを変更せずに、Terraform モジュールをカスタマイズできます。これにより、ユーザーやアカウントの異なる他の構成との間で、Terraform モジュールを簡単に共有したり再利用したりできます。このセクションの最後に、variables.tf
ファイルの例を記載します。
3. 最後に、New Relic プロバイダーの設定とリソース設定が記述された main.tf
ファイル、および対応する variables.tf
ファイルを組み合わせて、ダッシュボードをデプロイします。
次の2つの main.tf
ファイルと variables.tf
ファイルでは、Google 社の提唱するサイト信頼性エンジニアリングにおいて「4つのゴールデンシグナル」として説明されている概念( レイテンシ、トラフィック、エラー、スループット)を、ダッシュボードとして可視化するための例を示しています。これらの例は、Terraform New Relic プロバイダーのドキュメントに記載しているコードサンプルをベースとしています。
main.tfファイルの完全なコードの例
variables.tfファイルの完全なコードの例
最終的なデプロイ結果の確認
Terraform でダッシュボードをデプロイしたら、New Relic の UI 上でも確認してみましょう。以下のようなダッシュボードが作成されているはずです。
Next steps
Observability as Code の詳細については、ドキュメントおよびブログ記事TerraformとJSONテンプレートを使用したダッシュボードの作成を参照してください。
このシリーズの第2部以降では、第1部で学習したことを踏まえて、Observability as Code を実践し、堅固かつカスタマイズ性の高いアラートや、ウェブサイトのパフォーマンスを効果的に測定するための外形監視の設定を自動化する方法を説明します。
The views expressed on this blog are those of the author and do not necessarily reflect the views of New Relic. Any solutions offered by the author are environment-specific and not part of the commercial solutions or support offered by New Relic. Please join us exclusively at the Explorers Hub (discuss.newrelic.com) for questions and support related to this blog post. This blog may contain links to content on third-party sites. By providing such links, New Relic does not adopt, guarantee, approve or endorse the information, views or products available on such sites.