CloudWatch LogsをNewRelicへログ連携する（大阪リージョン）

## はじめに
NewRelicはITシステムのモニタリングツールで、ログの監視や分析で使用する用途がありました。クラウドサービスとログ連携も当然サポートしています。
今回AWSの大阪リージョンのCloudWatch Logsのログを連携する時に、少し苦労したのでメモを残しておきます。

## ハマったこと
大阪リージョンでは、Serverless Application Repositoryに対応していないため、ログ連携するためのアプリケーションを、AWSのコンソールからウィザードで導入できませんでした。東京リージョンでは、下記のようにサーバーレスアプリケーションから選択することでウィザード画面へ遷移できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/9c17ae98-1891-faa2-4a63-c4896e28f027.png)

大阪リージョンでは、アプリケーションの作成ボタンがありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/292d9104-51a1-164e-1121-e0e4226ccbc7.png)

これは、Serverless Application Repositoryが大阪リージョンをサポートしていないためです。マイナーなリージョンを利用した場合によくあることなのかなと思いました。

## 行ったこと
Githubに記載されていたインストラクションに従って、マニュアルでインストールを行いました。

https://github.com/newrelic/aws-log-ingestion

Manual DeploymentのSAMの手順を参考にしました。

### SAMをビルドするための、EC2インスタンスをたてる
Gitのソースから、自分でアプリケーションをビルドし、Serverless Applicatonとして登録することになります。その操作用のEC2を用意します。

EC2にアタッチする下表のロールを作成します。今回は一時的なので、大雑把に権限設定します。

| ロール | 目的 |
|:-|:-|
| AmazonSSMManagedInstanceCore | マネジメントコンソールからEC2に接続するため |
| AmazonS3FullAccess | ビルドされたコードを格納するS3バケットを作成するため |
| AWSCloudFormationFullAccess | CFn操作のため |
| AWSLambda_FullAccess | Lambdaアプリケーションをデプロイするため |
| IAMFullAccess | Lambda用のロール作成のため |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/8c7610ad-e531-f672-204a-55a9029f2d6b.png)

```
sh-5.2$ bash
[ssm-user@ip-172-31-35-168 bin]$ cd ~
[ssm-user@ip-172-31-35-168 ~]$
```

### SAM Cli、Docker、gitをインストール
EC2にSAM Cliをインストールします。

```
curl -LO https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
sudo ./sam-installation/install
```
```
[ssm-user@ip-172-31-35-168 ~]$ sam --version
SAM CLI, version 1.131.0
```

DockerはSAMのビルド時に必要となるため、こちらの記事を参考にインストールしました。

https://qiita.com/ktamido/items/48aa6bfaf9146dbbaf45

$USERのところは、ssm-userにしました。
```
sudo usermod -aG docker ssm-user
```

続いて、Gitをインストールします。

```
sudo yum install -y git
```
ようやく、SAMの手順を実行できる準備が整いました。

### SAMのビルドとデプロイ
手順にしたがってコマンドを入力していきます。

```
git clone https://github.com/newrelic/aws-log-ingestion.git
cd aws-log-ingestion/
sam build -u --parameter-overrides 'ParameterKey=NRLicenseKey,ParameterValue=your-license-key-here'
```

ビルドが成功したことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/440e9c93-7339-dec3-7684-623b42458fc5.png)

つづいて、デプロイをガイドありモードで実行します。
```
sam deploy --guided
```

デプロイのガイドでは、Stack名やリージョンを聞かれますので、入力していきます。
NRLicenseKeyには、NewRelicのログ取り込み用のAPIキーの値を入力します。
ほとんどはデフォルトでOKでした。
```
        Stack Name [sam-app]: newrelic-log-ingestion
        AWS Region [us-east-1]: ap-northeast-3
        Parameter NRLicenseKey:
        Parameter NRLoggingEnabled [True]:
        Parameter NRInfraLogging [True]:
        Parameter MemorySize [128]:
        Parameter Timeout [30]:
        Parameter FunctionRole []:
        Parameter LogIngestionFunctionArnExportName [LogIngestionFunctionArn]:
        Parameter PermissionsBoundary []:
        Parameter DebugLoggingEnabled [false]:
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]:
        #SAM needs permission to be able to create roles to connect to the resources in your template
        Allow SAM CLI IAM role creation [Y/n]:
        #Preserves the state of previously provisioned resources when an operation fails
        Disable rollback [y/N]:
        Save arguments to configuration file [Y/n]:
        SAM configuration file [samconfig.toml]:
        SAM configuration environment [default]: test
```

デプロイ処理が成功したことを確認します。
```
Successfully created/updated stack - newrelic-log-ingestion in ap-northeast-3
```

大阪リージョンに、ログ連携用のアプリケーションが登録されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/d70455f8-7563-4357-173c-fcb95cce2a82.png)

あとは、NewRelicの公式のドキュメントにしたがって、Lambda関数のトリガーに、ログ転送したいCloudWatch Logsのロググループを指定するだけでログ連携が開始されます。

ビルドに使用したEC2は削除可能です。削除後も登録されたアプリケーションは利用できます。

## まとめ
SAMを使用してアプリケーションを直接登録することで、大阪リージョンでもCloudWatch LogsとNewRelicをログ連携するためのアプリケーションを利用できました。SAMについては、まだよくわかっていないことが多いので、あとで調べてみたいと思います。