NewRelicでクローズドなAWSの監視をする


## はじめに
NewRelic Advend Callenderの記事を書く前に調査を始めたところ、
もっと参考になる記事がサーバワークスさんで作成されていたので、詳細を知りたい方は、末尾の参考文献をチェックしてみてください

## 社内ネットワークにNewRelicを入れる苦しみ
NewRelicは導入が簡単なツールですが、1つ不満がありました。
それは、インターネットとの接続が必須である点です。

私の所属している会社の社内ネットワークは、AWSとDirectConnectで閉域接続しています。
AWSの上にEC2が数百台稼働していますが、AWSからインターネットには直接出られず、必ずオンプレ側に設けた、プロキシサーバ＋Firewallを経由して、インターネットに出ることが求められます。

そのため、下記のような問題が生じています。
1. EC2にNewRelicInfraAgentを入れるとき、毎回社内プロキシの設定が必要
1. EC2のDockerの上に、NewRelicのPrivateLocationを作ろうとしても、社内プロキシを超えれない

とくに後者が問題で、NewRelicの外形検査機能（Synthetics)を利用して、社内ネットワークの中のサーバを監視するためには、PrivateLocationが必須なのですが、この問題のために、NewRelicの外形検査機能がずっと利用できませんでした。

## 解決方法として
公式ページにも記載がありますが、NewRelicとAWSの間では、AWS PrivateLinkの機能を使って、閉域で接続する機能が提供されています。しかし現時点(2024/12/16)では、下記のような問題があります。


 NewRelic公式の情報
https://docs.newrelic.com/jp/docs/data-apis/custom-data/aws-privatelink/


- 北米とEUのAWSリージョンでしか直接利用はできない。
 Newrelic社がそもそも北米とECでしかPrivateLinkを提供していません。そのため、日本などのAWSで閉域接続するためには、TransitGateway(TGW)や、VPCPeeringなどを間に介した複雑な設定が必要です。

- 作るものが多くて、自宅で簡単に試すということが難しい
 PriavteLink, Route53, EC2, VPC, InternetGateway, NAT Gatewayなどなど、作るものが多く、土日などにスクラップビルドを行って、実装を検証するということが難しいです。

- CloudFormationテンプレートなど公開されているものもあるが、試すと動作しない
 NewRelicの公式サイトの記事をもとに、CloudFormationテンプレートを公開してくれている方もいるのですが、構築して終わり、となっており、実際に閉域での動作検証をされている事例が見られない
 （実際試してみると、複数のはまりポイントがある）
 
## 今回試すこと
- なるべく手間をかけずに
- 繰り返し実験できるように、スクラップ＆ビルドができる方法で
- AWS上にNewRelicのプライベート接続環境を作って
- 実際に疎通を検証する

## 1.Amazon Q DeveloperでCloudFormation Templateを作る
スクラッチビルドできるようにするには、CloudFormationテンプレートを用意するのが常套手段ですが、
そもそもCloudFormationのJSON/YAML記法は癖が強く、自分で書くのは大変です。
幸い、AWS Management Consoleから、Amazon Q Developerを起動することで、
チャットの中で生成AIに指示をすることで、半自動で、CloudFormationのテンプレートを作成することが可能です


※自動生成されたCfnテンプレートを多少整理してまとめたものを置いておきます。
https://drive.google.com/file/d/1xJPLRWoLDU9IogD_12DiGoSltBsrGMEw/view?usp=sharing


``` : vpcを作る指示
please generate cfn code to create 
- region : us-east 
- az : us-east-1a 
- 1 vpc 
- 1 public subnet 10.0.100.0/24 named "public subnet1" 
- 1 private subnet 10.0.200.0/24 named "private subnet1" 
- 1 private subnet 10.0.201.0/24 named "private subnet for newrelic endpoint" 
```
うれしいことに、Publicサブネットを指定すると、自動的にInternetGatewayまで作るように、Cfnコードが生成されました。


``` : KeyPairと、EC2を作る指示
please generate cfn code to create 
- 1 key pair "key-for-ec2"
- define input paramater named "Your IP address" - security group that allow access from / to "Your IP address"
- 1 ec2 t2.small named "bastin" on "public subnet1" and assinged 1 public ip address and using keypair named "key-for-ec2"
- 1 ec2 t2.small named "nrcol1" on "private subnet1" and using keypair named "key-for-ec2"
```

``` : PrivateLinkを作る指示１
please generate cfn code to create 
- And create following private links (source / destination) on "private subnet for newrelic endpoint" 
collector.newrelic.com / destination: com.amazonaws.vpce.us-east-1.vpce-svc-084f1583d1a7afdaf 
insights-collector.newrelic.com / destination: com.amazonaws.vpce.us-east-1.vpce-svc-0ec0af01ab096419c 
metric-api.newrelic.com / destination: com.amazonaws.vpce.us-east-1.vpce-svc-085e8fb87d5493160 
log-api.newrelic.com / destination: com.amazonaws.vpce.us-east-1.vpce-svc-03408b499252a02a7 
trace-api.newrelic.com / com.amazonaws.vpce.us-east-1.vpce-svc-095f88345b701aaae
```

``` : PrivateLinkを作る指示2
please generate cfn code to create 
- And create following private links (source / destination) on "private subnet for newrelic endpoint" 
cloud-collector.newrelic.com / com.amazonaws.vpce.us-east-1.vpce-svc-0ba6e1d02e7cbbccb 
infra-api.newrelic.com / com.amazonaws.vpce.us-east-1.vpce-svc-007e743510dc46024 
identity-api.newrelic.com 
infrastructure-command-api.newrelic.com / com.amazonaws.vpce.us-east-1.vpce-svc-05adda8aa9c23eaa3 
otlp.nr-data.net / com.amazonaws.vpce.us-east-1.vpce-svc-07d529b1d0f6d417d 
api.newrelic.com / com.amazonaws.vpce.us-east-1.vpce-svc-05adda8aa9c23eaa3 
synthetics-horde.nr-data.net / com.amazonaws.vpce.us-east-1.vpce-svc-05adda8aa9c23eaa3
```

※Route53については、最大のはまりポイントなので、手動で作ることを推奨します。



## 2.CloudFormationでAWSを構築する
Amazon Q Developerで生成したCloud Formation Templateを、CloudFormationで実行して、Route53以外の必要なリソースを作成します。


## 3.EC2にログインして、NewRelicInfraAgentをインストールする
割愛

## 4.Route53を設定して、PrivateLink経由の通信に切り替える
この記事の一番の肝です。
Route53を作成するときに、２つだけPrivate Hosted Zoneを作っている記事を見るのですが、これは間違いです。

- 間違いの例
1. newrelic.com
1. nr-data.net


正しくは、下記のように６つのPrivate Hosted Zoneを作成する必要があります。
- 正しい例
1. newrelic.com
1. nr-data.net
1. api.newrelic.com　（この中で api.nwerelic.comへのAレコード登録を追加する）
1. identity-api.newrelic.com（この中で identity-api.newrelic.comへのAレコード登録を追加する）
1. infrastructure-command-api.newrelic.com（この中で　infrastructure-command-api.newrelic.comへのAレコード登録を追加する）
1. synthetics-horde.nr-data.net（この中で  synthetics-horde.nr-data.netへのAレコード登録を追加する）

※これは、NewRelicさんの公式記事にも、一応記載はあるのですが、あまりにもあっさり書かれていて、わからないと思うので、試そうとすると必ず、はまると思います。

>公式記事の抜粋
api.newrelic.com 、 identity-api.newrelic.com 、 infrastructure-command-api.newrelic.com 、およびsynthetics-horde.nr-data.netのエンドポイント サービスには、関連付けられた DNS プライベート名がありません。
これらのサービスへのアクセスを構成するには、各サービス エンドポイントへの PrivateLink 接続を作成します。
上記のホスト名ごとに、対応するプライベート ホスト ゾーン (PHZ) を作成します。


## 5. Privatelocationを構築する
こちらについては、すいませんが時間が足りませんでした。。。後日別途記事を作れればとおもいます

## 参考文献
https://blog.serverworks.co.jp/monitoring-with-new-relic-over-a-private-network

https://blog.serverworks.co.jp/newrelic-private-url-monitoring-with-docker-container