DynatraceのLog Monitoring v2を使ってAWSのログを監視してみる

# はじめに

Dynatraceで新しく導入されたLog Monitoring v2を利用することで様々なテクノロジーからログを取り込むことができるようになります。
本記事では、このLog Monitoring v2を利用してAWS Cloudwatch Logsの取得を試してみます。
通常のホストのログやAWS以外にも以下のアーキテクチャに対応しています。

* オープンソースのフレームワーク（FluentDやLogstash）
* Kubernetesのログやイベント
* クラウドプロバイダ（AWS、GCP、Microsoft Azure、Red Hat OpenShift）
* その他

**様々なデバイスやクラウドプロバイダ自身がログを生成しますが、個別にログ監視するのは非常に手間がかかります。Dynatraceのような監視ツールを使うことで以下のようなメリットが生まれます**

* データを一元管理できる。わざわざ個別のデバイスにログインすることなくログの確認が可能
* 問題発生時に障害が発生したホストだけでなく周辺装置のログ情報も同時に確認可能

Dynatraceでは15日間の無料トライアルを利用することができるので、自分の環境でも簡単に試してみることができます。
[Dynatraceフリートライアル](https://www.dynatrace.com/ja/trial/)

## 参考URL
Dynatraceの公式サイトに必要な情報がまとまっています。

[Set up AWS log forwarding \| Dynatrace Documentation](https://www.dynatrace.com/support/help/technology-support/cloud-platforms/amazon-web-services/aws-log-forwarder/)
[Log Monitoring v2 \| Dynatrace Documentation](https://www.dynatrace.com/support/help/how-to-use-dynatrace/log-monitoring/log-monitoring-v2/)
[dynatrace\-oss/dynatrace\-aws\-log\-forwarder: AWS log forwarding allows you to stream logs from AWS CloudWatch into Dynatrace logs](https://github.com/dynatrace-oss/dynatrace-aws-log-forwarder)

# 前提条件
ログを転送するのに、ActiveGateを経由する必要があります。本手順ではActiveGateはすでに構築済みとして進めますが、インストールスクリプトを実行する際にActiveGateを自動で構築することも可能です。
また、LambdaからActiveGateへアクセスできる必要があるため、ActiveGateの`/var/lib/dynatrace/gateway/config/custom.properties`に以下の設定を追加し、プロセスの再起動を実施します。また、セキュリティグループで`TCP: 9999`をフルオープンにする必要がございます。

```/var/lib/dynatrace/gateway/config/custom.properties
[connectivity]
dnsEntryPoint = https://パブリックDNS名:9999
```

```bash:プロセス再起動
sudo systemctl restart dynatracegateway.service
``` 

# 設定手順

## API Token の発行

ログをアップロードするために必要なAPIの発行を行います。

Dynatrace GUI上の`Settings > Integration > Dynatrace API`を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/caecc99b-a813-555d-edeb-eea7abae045f.png)

`Type a token name`フィールドにトークン名を入力し、`Ingest logs`を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/8e019458-90a8-aa6a-999e-ab16392047df.png)

`Generate`ボタンをクリックすると、トークンが発行されるので、**忘れずに**パスワードマネージャなどに保存します。
再表示はできないため、保存を忘れた場合は、再度トークンを発行する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/a0bfb96d-0373-6e09-9da9-a86ff4dd97f8.png)

## デプロイ

### 必要なポリシーの確認

CloudFormationにより、ログ取得に必要な設定は自動で実行されますが、AWS CLIを実行する端末に以下のポリシーが割り当てられている必要があります。

<details><summary>CloudFormation実行に必要なポリシー</summary><div>

```json
{
  "Version": "2012-10-17",
  "Statement": [
	{
	  "Sid": "VisualEditor0",
	  "Effect": "Allow",
	  "Action": [
		"cloudformation:CreateChangeSet",
		"cloudformation:ExecuteChangeSet",
		"cloudformation:DescribeChangeSet",
		"cloudformation:DescribeStacks",
		"s3:CreateBucket",
		"s3:PutLifecycleConfiguration",
		"iam:GetRole",
		"iam:CreateRole",
		"iam:AttachRolePolicy",
		"iam:PutRolePolicy",
		"iam:GetRolePolicy",
		"iam:PassRole",
		"lambda:CreateFunction",
		"lambda:UpdateFunctionCode",
		"lambda:GetFunction",
		"lambda:GetFunctionCodeSigningConfig",
		"cloudwatch:PutDashboard",
		"cloudwatch:GetDashboard",
		"firehose:DescribeDeliveryStream",
		"firehose:CreateDeliveryStream",
		"firehose:ListTagsForDeliveryStream",
		"logs:DeleteSubscriptionFilter",
		"logs:DescribeLogGroups",
		"logs:PutSubscriptionFilter"
	  ],
	  "Resource": "*"
	},
	{
	  "Sid": "VisualEditor1",
	  "Effect": "Allow",
	  "Action": [
		"kms:Decrypt",
		"kms:Encrypt",
		"kms:DescribeKey",
		"kms:CreateGrant"
	  ],
	  "Resource": "*",
	  "Condition": {
		"ForAnyValue:StringEquals": {
		  "kms:ResourceAliases": "aws/lambda"
		}
	  }
	}
  ]
}
```

</div></details>

### 環境変数の設定

```bash
TARGET_URL=https://<ActiveGate のパブリックDNS名>:9999/e/<DynatraceのテナントID>
TARGET_API_TOKEN=<先ほど発行した_API_token>
REQUIRE_VALID_CERTIFICATE=false
```

### インストールスクリプトの実行

```bash
wget -O dynatrace-aws-log-forwarder.zip https://github.com/dynatrace-oss/dynatrace-aws-log-forwarder/releases/latest/download/dynatrace-aws-log-forwarder.zip \
 && unzip -qo dynatrace-aws-log-forwarder.zip \
 && ./dynatrace-aws-logs.sh deploy --target-url $TARGET_URL --target-api-token $TARGET_API_TOKEN --use-existing-active-gate true --require-valid-certificate $REQUIRE_VALID_CERTIFICATE
```

`dynatrace-aws-logs`というスタック名でCloudFormationが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/cae0619c-5eee-d989-f5cc-330e5080cb3a.png)

## ロググループの購読

CloudWatchのロググールプからDynatraceへ送りたいロググループを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/e998c664-e828-e65f-f9fd-ff3fac705875.png)

ここではテスト試しに`/aws/lambda/testFunc`のログを登録してみます。
以下のコマンドを実行することで、ロググループの購読が開始されます。

```bash
./dynatrace-aws-logs.sh subscribe --log-groups /aws/lambda/testFunc
```

## ログの確認

CloudWatchに新しいログが出力されるとDynatrace側にも該当ログが送られます。
**DynatracenのLog Viewer**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/9e3bc986-0bec-4ba7-7b8f-2320b66ccc2a.png)

**AWS CloudWatchログのログイベント**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/e0603b6c-4684-bed1-6f2e-6d73cb32a52e.png)

# まとめ

本記事ではDynatraceで新しく導入されたLog Monitoring v2を使用してAWSのCloudWatchのログをDynatrace側で取得できる方法についてまとめました。
コンテナ環境のログなども含めてログの管理を一元化できるのは大きなメリットがありますので、ぜひ試してみてください。