# 使用 Metricbeat 掌握 Infrastructure 的健康狀態 AWS 篇

### 本篇學習重點

* Metricbeat 能夠收集 AWS 哪些 Metrics
* 如何使用 Metricbeat 來收集 AWS 的 Metrics
* 在 Kibana 上有提供哪些方式，能查看 Metricbeats 所收集的 AWS Metrics

***

先前的幾篇文章，我們分別介紹了 Host, Docker, Kubernetes 這幾種不同的佈署環境中，如何透過 Metricbeat 來掌握 Infrastructure 的健康狀態，不過如果是使用像是 AWS 這樣的雲端服務供應商，Metricbeat 也有提供蠻不錯的資訊整合及建立好的 Dashboard，這篇將會針對 AWS 的支援部份來進行介紹。

## Metricbeat 在 AWS 環境中，能收集哪些 Metrics

由於使用 AWS 這樣的雲端服務，大部份我們會使用 SaaS 型式的服務，少部份才會是使用 EC2 當虛擬器，並且自行在裡面架設其他的服務，Metricbeat 因此有提供了 AWS module，針對 AWS 的各種服務進行整合，能取得這些服務的監控資訊，甚至可以從 AWS 的 Cloudwatch 取得所有在 AWS 使用的服務所產生並傳送到 Cloudwatch 的資訊。

我們這邊先列出一些在 AWS 環境中，你可能會要收集 Metrics 的情境，並且對應該用什麼方式來收集：

* **使用 EC2 虛擬主機：** 可以使用 System module 來收進系統 Metrics。
* **使用 EC2 虛擬主機安裝其他的服務：** 可以使用其他 Metricbeat 所支援的各種服務的 module，例如：Tomcat, Nginx, Apache, RabbitMQ, Kafka...等。
* **使用 ECS EC2：** 可以使用 Docker module。
* **使用 ECS Fargate：可** 以使用 AWS Fargate module。
* **使用 EKS：** 可以使用 Kubernetes module。
* **使用 AWS 其他提供的 SaaS 服務，並且是 AWS module 有支援的：** 使用 AWS module。
* **使用 AWS 其他提供的 SaaS 服務，但是 AWS module 沒有支援的：** 使用 AWS module 裡的 Cloudwatch metricset。

對於如何使用 System module、Docker module、Kubernetes module，請參考這系列前面的幾篇文章介紹。

### Metricbeat AWS Module

接下來我們針對 AWS module 來進行介紹，這邊先列出 Metricbeat 有支援的 AWS metricset 有哪些 \[1]：

* [billing](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-billing.html)
* [cloudwatch](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-cloudwatch.html)
* [dynamodb](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-dynamodb.html)
* [ebs](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-ebs.html)
* [ec2](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-ec2.html)
* [elb](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-elb.html)
* [kinesis](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-kinesis.html)
* [lambda](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-lambda.html)
* [natgateway](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-natgateway.html)
* [rds](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-rds.html)
* [s3\_daily\_storage](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-s3_daily_storage.html)
* [s3\_request](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-s3_request.html)
* [sns](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-sns.html)
* [sqs](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-sqs.html)
* [transitgateway](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-transitgateway.html)
* [usage](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-usage.html)
* [vpn](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-metricset-aws-vpn.html)

由於 AWS module 針對以上這些 metricset 所收集到的資訊，大部份都有建立好預設的 Dashboard 可以使用，所以這邊不一個個帶過，請大家有興趣直接點選上面的連結查看。

### Metricbeat AWS Fargate Module

而 AWS Fargate module 所支援的 metricset 就只有單純的 `task_stats` ，裡面其實就是 Docker stats 的回傳資訊，包含以下這些基本的 Metrics：

* CPU metrics
* Disk I/O metrics
* Memory metrics
* Network metrics
* Container metadata

## 使用 Metricbeat 監控 AWS 的 Metrics

接下來我們會舉一個簡單的例子，嘗試使用 Metricbeat 的 AWS module 來收集 metrics。

### Credential 的設定方式

首先要能存取 AWS 的服務，就是要先有權限，我們也會需要將對應的 credential 設定給 Metricbeat，指定的方式有幾種：

1. 什麼都沒有設定時，Metricbeat 會去抓主機上的 [AWS credential profile](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/create-shared-credentials-file.html) \[2] 設定來使用。

一般在電腦上的 AWS credentail 設定的路徑是在 `~/.aws/credentials`，設定如下：

```
# ~/.aws/credentials                                                                                          
[default]
aws_access_key_id = 
aws_secret_access_key = 
```

另外 region 的設定也是一樣，沒有特別指定，會抓機器上的預設配置，路徑在 `~/.aws/config`，設定如下：

```
# ~/.aws/config                                                                                                                                                                                                                        [default]
region = ap-southeast-1
```

1. 直接在 `metricbeat.yml` 設定檔中指定 `access_key_id` 和 `secret_access_key`：

最基本的做法，適合測試時使用，但正式環境不建議這樣用，你總不會想把這段有 credential 的 config 一起進 git 版控吧?

所以真的要在 config 設定，應該抽離出從環境變數設定，這樣的做法也便於使用容器化的佈署方式時，將參數帶入。

```
metricbeat.modules:
- module: aws
  period: 5m
  access_key_id: ${AWS_ACCESS_KEY_ID}
  secret_access_key: ${AWS_SECRET_ACCESS_KEY}
  session_token: ${AWS_SESSION_TOKEN}
  metricsets:
    - ec2
```

> 如果你使用的時有時效性的 Session Token 的話，`AWS_SESSION_TOKEN` 也是在這邊可以進行設定。

例如：使用 docker 佈署 metricbeat 時的 `-e AWS_ACCESS_KEY_ID=abcd` 這種環境變數指定方式。

```
docker run -e AWS_ACCESS_KEY_ID=abcd -e AWS_SECRET_ACCESS_KEY=abcd -d --name=metricbeat --user=root --volume="$(pwd)/metricbeat.aws.yml:/usr/share/metricbeat/metricbeat.yml:ro" docker.elastic.co/beats/metricbeat:7.15.0 metricbeat -e
```

1. 指定 AWS `role_arn`

`role_arn` 是針對 AWS IAM role 產生臨時性的 credentials 所使用的，有使用 `role_arn` 時，也要提供 Access Key，或是配合 AWS credential porfile。

例如下面的例子就是使用指定的 `role_arn` 並且透過 Shared credential file 裡面所定義的 credential 來驗證身份。

```
metricbeat.modules:
- module: aws
  period: 5m
  role_arn: arn:aws:iam::123456789012:role/test-mb
  shared_credential_file: /Users/mb/.aws/credentials_backup
  credential_profile_name: test
  metricsets:
    - ec2
```

這個 `credentials_backup` 就如我們前面介紹的 `~/.aws/credentials` 設定方式是一樣的。

### 啟用 AWS Module

接下來，我們就將 Metricbeat AWS module 啟用：

```
./metricbeat enable aws
```

### 設定 AWS Module 配置

接著針對我們要收集的 AWS Metrics 來進行對應的配置，以下是 Metricbeat 的 AWS module 啟用後的預設配置：

```
# Module: aws
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/7.x/metricbeat-module-aws.html

- module: aws
  period: 1m
  metricsets:
    - elb
    - kinesis
    - natgateway
    - rds
    - transitgateway
    - usage
    - vpn
- module: aws
  period: 5m
  metricsets:
    - cloudwatch
  metrics:
    - namespace: AWS/EC2
      #name: ["CPUUtilization", "DiskWriteOps"]
      resource_type: ec2:instance
      #dimensions:
      #  - name: InstanceId
      #    value: i-0686946e22cf9494a
      #statistic: ["Average", "Maximum"]
- module: aws
  period: 5m
  metricsets:
    - dynamodb
    - ebs
    - ec2
    - lambda
    - rds
    - sns
    - sqs
- module: aws
  period: 24h
  metricsets:
    - billing
  cost_explorer_config:
    group_by_dimension_keys:
      - "AZ"
      - "INSTANCE_TYPE"
      - "SERVICE"
      - "LINKED_ACCOUNT"
    group_by_tag_keys:
      - "aws:createdBy"
- module: aws
  period: 24h
  metricsets:
    - s3_daily_storage
- module: aws
  period: 1m
  latency: 5m
  metricsets:
    - s3_request
```

這邊要注意到，有些 Metrics 的收集頻率會需要較密集，但有些會要較寬鬆，像是下面這幾類 metrics 適合 1 分鐘取得一次數據：

```
- elb
- kinesis
- natgateway
- rds
- transitgateway
- usage
- vpn
```

其他的部份會依照實際的需求，並參考 metricset 裡面的描述說明，像是 `s3_daily_storage` 就會建議 `period` 至少要設定 1 天，因為這個值是一天更新一次，另外這個 daily metrics 一天存取一次也不需要額外的費用。

> 注意：因為 Metricbeat 是透過 CloudWatch API 去取得 AWS 的 Metrics 數據，這部份使用量會要去計算一樣，量大的時候也會是一筆費用。
>
> [官方文件 - Metricbeat AWS Module - AWS API Requests](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-module-aws.html#aws-api-requests) 裡面有個章節就在解釋這部份的算法。

### 啟動 Metricbeat

設置完成後，啟動 Metricbeat：

```
./metricbeat -e
```

接著就可以來查看所收集到的資料了。

## 在 Kibana 檢視 AWS 的 Metrics

### Kibana Observability Metrics

在 Kibana Observability 的 Metrics Inventory 中，我們可以從 **Show** 選擇 AWS，裡面有四種預先定義好所支援的服務：

* EC2 Instances
* S3 Buckets
* RDS Databases
* SQS Queue

![12-kibana-metrics-aws](https://i.imgur.com/HJah3eV.png)

針對這些服務，Kibana 也有先預設定義好這些服務較常會看的 Metrics，例如 RDS 會關注的 `CPU usage`、 `Connections`、`Queries executed`、`Active transactions`，另外也可以自行從 **Add metric** 中，選出我們所指定的 metricset 收集的其他數據。

![12-kibana-inventory-metrics](https://i.imgur.com/MSiVFSA.png)

其他 Inventory 的使用方式，可以參考先前的文章 [09 - Metrics - 觀察系統的健康指標 (3) - 使用 Metricbeat 掌握 Infrastructure 的健康狀態 Host 篇](https://ithelp.ithome.com.tw/articles/10271438) 的介紹。

### Metricbeat 內建的 AWS Dashboard

由於 Metricbeat 預設為 AWS 所建立的 Dashboard 非常的多，如先前介紹 metricset 時所描述，建議大家針對你所指定收集的 metricset，可以先查看是否有預先建立好的 Dashboard，或是從 Kibana Dashbard 中，使用 `Metricbeat AWS` 關鍵字進行搜尋。

![image-20210927235613649](https://i.imgur.com/zkMIU6s.png)

***

以上是『Metrics - 觀察系統的健康指標』系列的介紹，希望能協助大家對於 Elastic Observability 中針對 Metrics 的部份有更多的了解，針對 Metricbeat 的使用上，其實還有不少值得挖掘的功能以及較進階的設定配置，建議有興趣的讀者可以從官方的文件深入了解。

## 參考資料

1. [官方文件 - Metricbeat AWS module](https://www.elastic.co/guide/en/beats/metricbeat/7.14/metricbeat-module-aws.html)
2. [AWS credential profile](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/create-shared-credentials-file.html)
