使用 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]:

由於 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 [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_idsecret_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 裡面有個章節就在解釋這部份的算法。

啟動 Metricbeat

設置完成後,啟動 Metricbeat:

./metricbeat -e

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

在 Kibana 檢視 AWS 的 Metrics

Kibana Observability Metrics

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

  • EC2 Instances

  • S3 Buckets

  • RDS Databases

  • SQS Queue

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

其他 Inventory 的使用方式,可以參考先前的文章 09 - Metrics - 觀察系統的健康指標 (3) - 使用 Metricbeat 掌握 Infrastructure 的健康狀態 Host 篇 的介紹。

Metricbeat 內建的 AWS Dashboard

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


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

參考資料

Last updated