Available solutions
AWS Cost Explorer by HTTP
Overview
The template to monitor AWS Cost Explorer by HTTP via Zabbix, which works without any external scripts. Most of the metrics are collected in one go, thanks to Zabbix bulk data collection.
Note: This template uses the Cost Explorer API calls to list and retrieve metrics.
For more information, please refer to the Cost Explorer pricing page.
Requirements
Zabbix version: 7.4 and higher.
Tested versions
This template has been tested on:
- AWS by HTTP
Configuration
Zabbix should be configured according to the instructions in the Templates out of the box section.
Setup
Before using the template, you need to create an IAM policy for the Zabbix role in your AWS account with the necessary permissions.
Required Permissions
Add the following required permissions to your Zabbix IAM policy in order to collect metrics.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ce:GetDimensionValues",
"ce:GetCostAndUsage"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
Access Key Authorization
If you are using access key authorization, you need to generate an access key and secret key for an IAM user with the necessary permissions:
- Create an IAM user with programmatic access.
- Attach the required policy to the IAM user.
- Generate an access key and secret key.
- Use the generated credentials in the macros
{$AWS.ACCESS.KEY.ID}and{$AWS.SECRET.ACCESS.KEY}.
Assume Role Authorization
For using assume role authorization, add the appropriate permissions to the role you are using:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::{Account}:user/{UserName}"
},
{
"Effect": "Allow",
"Action": [
"ce:GetDimensionValues",
"ce:GetCostAndUsage"
],
"Resource": "*"
}
]
}
Trust Relationships for Assume Role Authorization
Next, add a principal to the trust relationships of the role you are using:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{Account}:user/{UserName}"
},
"Action": "sts:AssumeRole"
}
]
}
Set the following macros: {$AWS.ACCESS.KEY.ID}, {$AWS.SECRET.ACCESS.KEY}, {$AWS.STS.REGION}, {$AWS.ASSUME.ROLE.ARN}.
Note: If you set the {$AWS.ASSUME.ROLE.AUTH.METADATA} macro to true and set the macros {$AWS.STS.REGION} and {$AWS.ASSUME.ROLE.ARN}, the Zabbix server or proxy will attempt to retrieve the role credentials from the instance metadata service.
This means that the Zabbix server or proxy must be running on an AWS EC2 instance with an IAM role assigned that has the necessary permissions.
This approach is recommended when running Zabbix inside an AWS EC2 instance with an IAM role assigned, as it simplifies credential management.
Role-Based Authorization
If you are using role-based authorization, add the appropriate permissions:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::<<--account-id-->>:role/<<--role_name-->>"
},
{
"Effect": "Allow",
"Action": [
"ce:GetDimensionValues",
"ce:GetCostAndUsage",
"ec2:AssociateIamInstanceProfile",
"ec2:ReplaceIamInstanceProfileAssociation"
],
"Resource": "*"
}
]
}
Trust Relationships for Role-Based Authorization
Next, add a principal to the trust relationships of the role you are using:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"ec2.amazonaws.com"
]
},
"Action": [
"sts:AssumeRole"
]
}
]
}
Note: Using role-based authorization is only possible when you use a Zabbix server or proxy inside AWS.
Set the macros: {$AWS.AUTH_TYPE}. Possible values: access_key, assume_role, role_base.
For more information about managing access keys, see the official documentation.
Also, see the Macros section for a list of macros used in LLD filters.
Additional information about metrics and used API methods:
Macros used
| Name | Description | Default |
|---|---|---|
| {$AWS.AUTH_TYPE} | Authorization method. Possible values: |
access_key |
| {$AWS.ASSUME.ROLE.AUTH.METADATA} | Add when using the |
false |
| {$AWS.ACCESS.KEY.ID} | Access key ID. |
|
| {$AWS.SECRET.ACCESS.KEY} | Secret access key. |
|
| {$AWS.ASSUME.ROLE.ARN} | ARN assume role; add when using the |
|
| {$AWS.PROXY} | Sets HTTP proxy value. If this macro is empty, then no proxy is used. |
|
| {$HTTP.TLS.VERIFY} | TLS certificate verification for script items: "none" - disabled, "peer" - verify the certificate chain and expiration, "full" - full verification. Any other value enables full verification. To override the setting for this template only, define the macro with the context "AWS Cost Explorer", e.g. {$HTTP.TLS.VERIFY:"AWS Cost Explorer"}. |
full |
| {$AWS.STS.REGION} | Region used in assume role request. |
us-east-1 |
| {$AWS.BILLING.REGION} | Amazon Billing region code. |
us-east-1 |
| {$AWS.BILLING.MONTH} | Months to get historical data from AWS Cost Explore API, no more than 12 months. |
11 |
| {$AWS.BILLING.LLD.FILTER.SERVICE.MATCHES} | Filter of discoverable discovered billing service by name. |
.* |
| {$AWS.BILLING.LLD.FILTER.SERVICE.NOT_MATCHES} | Filter to exclude discovered billing service by name. |
CHANGE_IF_NEEDED |
Items
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| Get monthly costs | Get raw data on the monthly costs by service. |
Script | aws.get.monthly.costs Preprocessing
|
| Get daily costs | Get raw data on the daily costs by service. |
Script | aws.get.daily.costs Preprocessing
|
LLD rule AWS daily costs by services discovery
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| AWS daily costs by services discovery | Discovery of daily blended costs by services. |
Dependent item | aws.daily.services.costs.discovery Preprocessing
|
Item prototypes for AWS daily costs by services discovery
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| Service [{#AWS.BILLING.SERVICE.NAME}]: Blended daily cost | The daily blended cost of the {#AWS.BILLING.SERVICE.NAME} service for the previous day. |
Dependent item | aws.daily.service.cost["{#AWS.BILLING.SERVICE.NAME}"] Preprocessing
|
LLD rule AWS monthly costs by services discovery
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| AWS monthly costs by services discovery | Discovery of monthly costs by services. |
Dependent item | aws.cost.service.monthly.discovery Preprocessing
|
Item prototypes for AWS monthly costs by services discovery
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| [{#AWS.BILLING.SERVICE.NAME}]: Month [{#AWS.BILLING.MONTH}] Blended cost | The monthly cost by service {#AWS.BILLING.SERVICE.NAME}. |
Dependent item | aws.monthly.service.cost["{#AWS.BILLING.SERVICE.NAME}", "{#AWS.BILLING.MONTH}"] Preprocessing
|
LLD rule AWS monthly costs discovery
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| AWS monthly costs discovery | Discovery of monthly costs. |
Dependent item | aws.monthly.cost.discovery Preprocessing
|
Item prototypes for AWS monthly costs discovery
| Name | Description | Type | Key and additional info |
|---|---|---|---|
| [{#AWS.BILLING.MONTH}]: Blended cost per month | The blended cost by month {#AWS.BILLING.MONTH}. |
Dependent item | aws.monthly.cost["{#AWS.BILLING.MONTH}"] Preprocessing
|
Feedback
Please report any issues with the template at https://support.zabbix.com
You can also provide feedback, discuss the template, or ask for help at ZABBIX forums