Terraform は HashiCorp 社が OSS として公開しているクラウドなどの設定をコードで管理するための IaC のツールとして多くの開発者から利用されています。

New Relic でも provider を公開しておりアラートやダッシュボードの作成などを Terraform から行うことができるようになっております。
今回は New Relic One と AWS アカウントをTerraform を利用して連携させる方法をご紹介したいと思います。

今回のサンプルコードは Github にて公開しておりますのでこちらのブログを読む際の参考にして頂ければと思います。
https://github.com/newrelickk/terraform-cloud-link-account/tree/master/aws_integration

動作環境

今回は以下の環境で動作の検証を行いました。

  • Terraform 1.1.6
  • hashicorp/newrelic 2.41.1
  • hashicorp/aws 4.6.0
  • macOS 12.2.1

Terraform 本体のバージョンや provider のバージョンは常に更新されています。
今回はサンプルのコードをご用意致しますが今後アップデートが入った際はアップデートされたものに合わせてご利用頂ければと思います。
https://registry.terraform.io/namespaces/newrelic

Set Up

まずは provider の設定などを行います。
以下にサンプルの設定を用意致しますので皆様の環境に合わせてセットアップを行ってください。

providers.tf

terraform {
  required_providers {
    newrelic = {
      source  = "newrelic/newrelic"
      version = "2.41.1"
    }
    aws = {
      source  = "hashicorp/aws"
      version = "4.6.0"
    }
  }
  required_version = "1.1.6"
}

provider "newrelic" {
  account_id = var.account_id
  api_key    = var.api_key
  region     = "US"
}

provider "aws" {
  region = "ap-northeast-1"
}

今回は newrelic のアカウントIDと api_key を環境変数経由で渡せる形にしています。
account_id と api_key という環境変数を定義したファイルを作成します。

variables.tf

variable "newrelic_account_id" {}

variable "api_key" {}

IAM Role の作成

先に AWS の IAM Role の作成を行います。
こちらがサンプルのコードになります。

iam_role.tf

resource "aws_iam_role" "newrelic_integrations" {
 name               = "NewRelicInfrastructure-Integrations"
 assume_role_policy = data.aws_iam_policy_document.newrelic_integrations.json
}

data "aws_iam_policy_document" "newrelic_integrations" {
 statement {
   actions = ["sts:AssumeRole"]
   effect  = "Allow"

   condition {
     test = "StringEquals"
     // NewRelic AccountID
     values   = var.newrelic_account_id
     variable = "sts:ExternalID"
   }

   principals {
     identifiers = [var.another_aws_account_id]
     type        = "AWS"
   }
 }
}

resource "aws_iam_role_policy_attachment" "read_only_access" {
 policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
 role       = aws_iam_role.newrelic_integrations.id
}

resource "aws_iam_role_policy" "view_budget_access" {
  name   = "view-budget-access"
  policy = data.aws_iam_policy_document.budget_access.json
  role   = aws_iam_role.newrelic_integrations.id
}

data "aws_iam_policy_document" "budget_access" {
 statement {
   actions   = ["budgets:ViewBudget"]
   effect    = "Allow"
   resources = ["*"]
 }
 version = "2012-10-17"
}

ここで another_aws_account_id という環境変数が登場してきましたが、 AWS 連携のドキュメントを参考にして頂いくと Another AWS Account という項目がありますので表示されたアカウントを環境変数に設定してください。

https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/connect-aws-new-relic-infrastructure-monitoring/

先程環境変数を定義したファイルと同じファイルに another_aws_account_id の環境変数を追加します。
もちろん直接 var.another_aws_account_id の部分を置き換えてしまっても問題ありません。

variable "another_aws_account_id" {
  type     = string
  default = <Another AWS Account ID>
}

最後に New Relic と AWS の連携を行うための設定を行います。

newrelic_cloud_aws_link_account のリソースを使用して連携を行います。
以下がサンプルのコードになります。

link.tf

resource "newrelic_cloud_aws_link_account" "example" {
  account_id             = <連携する New Relic のアカウントID>
  arn                    = aws_iam_role.newrelic_integrations.arn
  #PULL の場合は API polling になり PUSH の場合は Metric Streams での転送設定になります。
  metric_collection_mode = "PULL" or "PUSH"
  name                   = "<set your name>"

  # IAM Role や Policy を先に作成しないと実際に連携する際に権限不足になってしまうので作成するまで待つようにします。
  depends_on = [
    aws_iam_role.newrelic_integrations,
    data.aws_iam_policy_document.budget_access,
    data.aws_iam_policy_document.newrelic_integrations,
    aws_iam_role_policy_attachment.read_only_access
  ]
}

New Relic One と AWS の連携

ここまでセットアップできれば後は Terraform を実際に適用させるだけですので実際に Terraform のコマンドを実行してみましょう。

$ terraform init

$ terraform plan

$ terraform apply 
# 以下の実行を許可するコメントが出てくるので yes と入力して実行してください。
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

New Relic の画面から連携ができているかを確認しましょう。

メニュー上の 「Infrastructure」を選択するとメニューバーが表示されますので 「AWS」を選択して頂くと AWS 連携の画面へと遷移が出来ます。
AWS の項目を選択した後では連携に成功していた場合 API polling と Metic Streams で画面が異なりますが以下のようになっていれば連携は成功です。

最後に

最後に AWS との連携はこれで完了ですが API で取得するリソース、Metrics Streams の場合は別で firehose などを利用し New Relic に対して CloudWatch のメトリクスを転送する必要がありますがまた別のブログで Terraform で Metic Streams を設定する方法をご紹介したいと思います。

Terraform を始めとする IaC ツールを活用することはこれからクラウドを活用していく上で必須のツールになっていきますので是非 New Relic のリソースをコードで管理するファーストステップとしてご活用して頂ければと思います。