CloudWatch cross-account observability で集めたメトリクスを NewRelic に連携してみる

本記事は [New Relic 使ってみた情報をシェアしよう！ by New Relic Advent Calendar 2023 シリーズ2](https://qiita.com/advent-calendar/2023/newrelic) 18日目の記事です。

# はじめに

[CloudWatch cross-account observability](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html) でモニタリングアカウントに集めた CloudWatch メトリクスを NewRelic へ転送したとき、

NewRelic 側ではどの AWS アカウントから転送されたメトリクスだと判別されるのか、

もしかしたら全部モニタリングアカウントのメトリクスと集約されてしまうのでは？と思い、

気になったため実際にやってみました。


# 結論

NewRelic に取り込まれたメトリクスの Dimension には、

- ソースアカウントのメトリクスには、ソースアカウントの AWS アカウント ID 
- モニタリングアカウントのメトリクスには、モニタリングアカウントの AWS アカウント ID 

が付与されていました。

![結論](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223769/664c151b-9d7e-b9ac-c572-794d868a1e36.png)
（Dimensions の aws.accountID の箇所に、モニタリングアカウントとソースアカウントの AWS アカウント ID がそれぞれ入っていました）


# やってみました

## 構成

![構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223769/912c93cc-3e08-71b7-d5b6-ca664b661068.png)

- ソースアカウントとモニタリングアカウントで1つずつ AWS アカウントを用意しました
- NewRelic へのメトリクス連携は [CloudWatch Metric Streams 統合](https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/aws-metric-stream/) を利用しました

https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/aws-metric-stream/

## 設定・確認

### モニタリングアカウント側の設定

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account-Setup.html#Unified-Cross-Account-Setup-ConfigureMonitoringAccount:~:text=%E8%A1%A8%E7%A4%BA%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,%E3%82%B9%E3%83%86%E3%83%83%E3%83%971%3A%20%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B,-%E3%81%93%E3%81%AE%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE

- 手順 5. の、連携するデータの選択では **[メトリクス]** を選択する
- terraform でやる場合は以下

```
resource "aws_oam_sink" "this" {
  name = "foo"
}

resource "aws_oam_sink_policy" "this" {
  sink_identifier = aws_oam_sink.this.id
  policy          = data.aws_iam_policy_document.oam.json
}

data "aws_iam_policy_document" "oam" {
  statement {
    effect = "Allow"
    principals {
      identifiers = [
        <ソースアカウントの AWS アカウント ID>
      ]
      type        = "AWS"
    }
    actions = ["oam:CreateLink", "oam:UpdateLink"]
    resources = ["*"]
    condition {
      test     = "ForAllValues:StringEquals"
      variable = "oam:ResourceTypes"
      values   = ["AWS::CloudWatch::Metric"]
    }
  }
}

```

### ソースアカウント側の設定

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account-Setup.html#Unified-Cross-Account-Setup-ConfigureMonitoringAccount:~:text=%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,URL%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E5%80%8B%E5%88%A5%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B,-%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E6%89%8B%E9%A0%86%E3%81%AF

- 手順 3. の、連携するデータの選択では **[メトリクス]** を選択する
- terraform でやる場合は以下

```
resource "aws_oam_link" "this" {
  label_template  = "$AccountName"
  resource_types  = ["AWS::CloudWatch::Metric"]
  sink_identifier = <前手順で作成した aws_oam_sink.this の arn>
}

```

### モニタリングアカウントおよび NewRelic アカウントで CloudWatch Metric Streams 統合を構成

https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/aws-metric-stream-setup/

- AWS 側には CloudWatch Metric Stream や Kinesis Firehose などメトリクス転送に必要なリソース等を作成
    - [NewRelic から提供される CloudFormation Template](https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/aws-metric-stream-setup/#setup-cloudformation) を利用可能

　

- NewRelic 側には対象の AWS アカウントとリンクする設定を実施
    - [Infrastructure] -> [AWS] の画面で "Set up Amazon Web Services integrations through the UI. " のリンクから、ガイド付きセットアップを実施可能

![AWS Integration](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223769/ec8019ec-df0b-fbcd-28e5-10e43ff3489c.png)

- 上記リソースの作成をまとめて terraform でやる場合はこちらの [module](https://github.com/newrelic/terraform-provider-newrelic/tree/main/examples/modules/cloud-integrations/aws) を利用可能


### 確認

上記の設定が完了したら、NewRelic にデータ連携が出来ていることを確認する

NewRelic の [Infrastructure] -> [AWS] の画面で、真ん中上部あたりのプルダウンリストで metric stream のものを選択し、

![スクリーンショット 2023-12-15 182018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223769/e86f6818-b744-5648-ba10-41725a8adfdf.png)

同画面の右部あたり Account status dashboard をクリックして以下の画面に遷移する

![確認２](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223769/0e223baa-17ec-05eb-32bb-f84c2202234f.png)

Metrics が 0 でなければ、メトリクスが連携されている

次に NewRelic の [Query Your Data] -> [Data explorer] -> [Metrics] の画面で、左側の Metric の一覧から CloudWatch のメトリクス（aws. で始まるもの）を選択し（画像では aws.ec2.CPUUtilization）、

![確認３](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223769/bb98e48e-1750-7589-2861-7068cc5cfe7a.png)

Metric 一覧の下部にある Dimensions を開いて id でフィルタリングすると以下のように、メトリクスに付与された AWS アカウント ID （aws.accountID）を確認できる

![確認４](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223769/664c151b-9d7e-b9ac-c572-794d868a1e36.png)

# おわりに

[CloudWatch Metric Stream では取得できないメトリクス](https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/aws-metric-stream/#cloudwatch%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%81%A7%E3%81%AF%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9) もいくつかあるため、注意が必要です。

それらについては、[API Polling](https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/connect-aws-new-relic-infrastructure-monitoring/) でのメトリクス取得が必要になりそうです。

　

以上、簡単な内容ではありましたが、お読みいただきありがとうございました。