a brick tiled background in royal blue, with a large white arrow overlaid pointing to the right

はじめに

New RelicではAzureをはじめとするさまざまなパブリッククラウドと連携し、サービスのメトリクスを取得する機能を提供しています。
一方、インテグレーションを行う際には、New Relicとパブリッククラウド双方での設定が必要なため、Webから設定を行う際はサービス間で画面を往復したりと設定が煩雑になりがちです。 本記事ではインテグレーションのサンプルコードを通し、各機能に対しての解説及び、設定方法を紹介します。 

Terraformの実行環境を準備する

本記事ではTerraformがインストールされたことが前提となります。
インストールされていない方は、こちらからインストールを実施しています。

本記事執筆時点での確認は下記のバージョンで行っています。
今後の機能変更などにより掲載の設定が機能しなくなった場合はご了承ください。

Terraform v1.4.2
on darwin_arm64
+ provider registry.terraform.io/hashicorp/azuread v2.15.0
+ provider registry.terraform.io/hashicorp/azurerm v3.0.0
+ provider registry.terraform.io/newrelic/newrelic v3.20.2

サンプルコード実行環境の準備

それでは早速Azureインテグレーションのサンプルコードをダウンロードし、準備していきましょう。

├── azure
│   ├── main.tf
│   ├── providers.tf
│   └── variables.tf

サンプルコード実行にあたり、下記の設定を行います。

1. New RelicアカウントIDの確認とAPI Keyの準備
Azureと連携するNew RelicアカウントのIDを確認します。
また、terraformを実行するために必要なUSER API Keyも併せて準備します。
※USER API keyは先頭がNRAK-からはじまります。

2. Azure コマンドラインインターフェース(CLI)のインストールとサインイン
terraform実行時にAzureの認証情報が必要になるため、ドキュメントに従いご自身の環境に合わせてCLIをインストールのうえ、サインインを行なってください。

3. サンプルコードの確認と修正
準備したサンプルコードをダウンロードしたディレクトリに移動し、初期化を行います。

terraform init

初期化が正常に行えたら、次はplanを実行します。
planを実行した際に対話式でNew RelicのアカウントIDとAPI keyを要求されますので、手順1で準備したIDとKeyを使用してください。

$ terraform plan
var.newrelic_account_id
  Enter a value: *******

provider.newrelic.api_key
  Enter a value: NRAK-****************************

もしもplanに失敗した場合は、エラーの文言に従い対し修正を行います。

│ Error: Missing required attribute
│
│   on <input-prompt> line 1:
│   (source code not available)
│
│ The attribute "account_id" is required, but no definition was found.

このケースではattribute "account_id"が要求されているが、定義されていないためにエラーとなっています。
コード全体で providor "newrelic" が無い場合は、下記のコードをprovidors.tfに書き加え、variable "newrelic_account_id" を "newrelic_account_id" に与えるように修正します。

provider "newrelic" {
  account_id = var.newrelic_account_id
}

また、下記のようなエラーが発生するケースもあります。

│ Error: Insufficient features blocks
│
│   on <empty> line 0:
│   (source code not available)
│
│ At least 1 "features" blocks are required.

attributeに対し "features" ブロックが不足している際に起こるため、コード全体にprovidor "azurerm"が無いようであれば、providors.tfに下記コードを追記し修正してください。

provider "azurerm" {
    features {}
}

planまで正常に実行できた場合は、次の項目に移ります。

Applyを行いリソースを作成する

planまで実施し、問題ないようであればapplyを行いリソースを作成します。
以上が実行までの解説となります。引き続き、各項目について掘り下げていきます。

Azureインテグレーション設定の流れ

Azureインテグレーションは下記の操作によって実現しています。
本記事では、これらを順を追ってTerraformで実行します。

  1. Azure ADに対するNew Relicインテグレーションのアプリケーション登録
  2. Azure ADに対するロールの設定
  3. Azure ADに対する認証情報の設定
  4. New RelicとAzureとの連携
  5. 連携するAzureのサービスの設定
     

サンプルコード解説

Azureインテグレーション設定の流れに沿ってサンプルコードについて解説していきます。

インテグレーションでは設定の対象がAzureとNew Relicと2つのサービスにまたがります。
コード内のresource / dataのリソース名がazure〜ではじまるものはAzureの、newrelic〜ではじまるものはNew Relicのリソースに対し設定されます。

特に断りのない場合は、main.tfについての解説となります。

0. Azure CLIを通じたAzureの情報の取得

データソースを使用し、Azure CLIで設定したIDなどの情報を通じてAzure ADの設定、サブスクリプション、アプリケーションの情報を取得します。

data "azuread_client_config" "newrelic_client_config" {}
data "azurerm_subscription" "newrelic_subscription" {}
data "azuread_application_published_app_ids" "well_known" {}

1. Azure ADに対するNew Relicインテグレーションのアプリケーション登録

AzureとNew Relicとの連携では、Azure ADを通じてアプリケーションとして登録する必要があります。
本項ではNewRelic-Integrationsをアプリケーションとして登録し、サービスプリンシパルを設定しています。

Web UIでは Azure Active Directory > アプリの登録 に相当します。

resource "azuread_service_principal" "msgraph" {
  application_id = data.azuread_application_published_app_ids.well_known.result.MicrosoftGraph
  use_existing   = true
}

resource "azuread_application" "newrelic_application" {
  display_name     = "NewRelic-Integrations"
  owners           = [data.azuread_client_config.newrelic_client_config.object_id]
  sign_in_audience = "AzureADMyOrg"

  web {
    redirect_uris = ["https://www.newrelic.com/"]
  }
}

resource "azuread_service_principal" "newrelic_service_principal" {
  application_id = azuread_application.newrelic_application.application_id
}

2. Azure ADに対するロールの設定

対象となるサブスクリプションに対し、アプリケーションに閲覧者権限を与えます。

Web UIでは サブスクリプション > アクセス制御(IAM)  > ロールの割り当て に相当します。

resource "azurerm_role_assignment" "newrelic_role_assignment" {
  scope                = data.azurerm_subscription.newrelic_subscription.id
  role_definition_name = "Reader"
  principal_id         = azuread_service_principal.newrelic_service_principal.object_id
}

3. Azure ADに対する認証情報の設定

アプリケーションに対し、認証情報を設定します。
サンプルコードでは執筆時点のデフォルトである2年間が期限として設定されます。
必要に応じて end_date より証明書期限を設定してください。

Web UIでは アプリケーションの管理 > 証明書とシークレット > 新しいクライアントシークレットを追加 に相当します。

resource "azuread_application_password" "newrelic_application_password" {
  application_object_id = azuread_application.newrelic_application.object_id
}

以上でAzure側の設定は完了です。引き続き、New Relic側の設定を行います。

4. New RelicとAzureとの連携

Azure側で設定した ApplicationID、Client Secret、Subscriptuion ID、TenantIDを指定し、連携を実施します。
New Relic側で作成されるアカウント名は、variables.tfよりvariable "name"から設定します。
サンプルコードのまま変更しない場合はproductionに設定されます。

resource "newrelic_cloud_azure_link_account" "newrelic_cloud_azure_integration" {
  account_id      = var.newrelic_account_id
  application_id  = azuread_application.newrelic_application.application_id
  client_secret   = azuread_application_password.newrelic_application_password.value
  subscription_id = data.azurerm_subscription.newrelic_subscription.subscription_id
  tenant_id       = data.azurerm_subscription.newrelic_subscription.tenant_id
  name            = var.name

  depends_on = [
    azurerm_role_assignment.newrelic_role_assignment
  ]
}
variable "name" {
  type    = string
  default = "production"
}

5. 連携するAzureのサービスの設定

連携するサービスを設定します。
必要に応じて追加・削除を行ってください。

select Azure services
resource "newrelic_cloud_azure_integrations" "foo" {
  account_id        = var.newrelic_account_id
  linked_account_id = newrelic_cloud_azure_link_account.newrelic_cloud_azure_integration.id

  api_management {}
  app_gateway {}
  app_service {}
  containers {}
  cosmos_db {}
  cost_management {}
  data_factory {}
  event_hub {}
  express_route {}
  firewalls {}
  front_door {}
  functions {}
  key_vault {}
  load_balancer {}
  logic_apps {}
  machine_learning {}
  maria_db {}
  mysql {}
  postgresql {}
  power_bi_dedicated {}
  redis_cache {}
  service_bus {}
  sql {}
  sql_managed {}
  storage {}
  virtual_machine {}
  virtual_networks {}
  vms {}
  vpn_gateway {}
}

おわりに

以上、各スタックに対しての作成方法となります。
Azureをはじめとするパブリッククラウドとの連携では設定項目が多く作業が煩雑になりがちです。
コードで連携することにより日頃から多数のパブリッククラウドやアカウントを駆使してサービスの提供をされている方の一助になりますと幸いです。