本文へスキップ

AWS CloudWatch Exporter 設定

注意

CloudWatch Exporter使用時の料金案内

CloudWatch ExporterはAWS CloudWatch APIを通じてメトリクスを照会する方式であるため、照会されるメトリクス数とAPI呼び出し量に応じてAWS CloudWatchの使用料金が発生する場合があります。料金はCloudWatchのメトリクス、APIリクエスト、ログ、ダッシュボード、アラームなどの使用量基準で課金されます。詳細についてはAWS公式料金表をご参照ください。

事前準備

AWSアカウント要件

  • AWSアカウントおよびコンソールへのアクセス権限
  • IAMポリシー/ユーザー作成権限
  • CloudWatchメトリクスの読み取り権限

IAMポリシーの作成

CloudWatch ExporterがAWS CloudWatch APIを呼び出すための最小権限ポリシーを作成します。

  1. AWS ConsoleでIAM → ポリシー → ポリシーの作成に移動します。

  2. JSONタブを選択後、以下の内容を入力します。

    ノート

    以下はポリシーの例です。実際に使用するサービスの権限のみを含めることを推奨します。

    サービス必要な権限備考
    EC2ec2:DescribeInstances
    EBSec2:DescribeVolumes
    ALB/NLB/CLBelasticloadbalancing:DescribeLoadBalancers
    ALB/NLB Target Groupelasticloadbalancing:DescribeTargetGroups, elasticloadbalancing:DescribeTargetHealthターゲットグループの状態収集に必要
    Auto Scaling Groupautoscaling:DescribeAutoScalingGroups
    RDS / Aurorards:DescribeDBInstances
    ElastiCacheelasticache:DescribeCacheClusters, elasticache:DescribeReplicationGroups
    Elastic Beanstalkelasticbeanstalk:DescribeEnvironments, elasticbeanstalk:DescribeEnvironmentHealth
    Lambdalambda:ListFunctions
    ECSecs:ListClusters, ecs:DescribeClusters
    S3s3:ListAllMyBuckets
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Sid": "CloudWatchReadPolicy",
    "Effect": "Allow",
    "Action": [
    "cloudwatch:ListMetrics",
    "cloudwatch:GetMetricStatistics",
    "cloudwatch:GetMetricData"
    ],
    "Resource": "*"
    },
    {
    "Sid": "ResourceDiscoveryPolicy",
    "Effect": "Allow",
    "Action": [
    "tag:GetResources",
    "ec2:DescribeInstances",
    "ec2:DescribeVolumes",
    "elasticloadbalancing:DescribeLoadBalancers",
    "elasticloadbalancing:DescribeTargetGroups",
    "elasticloadbalancing:DescribeTargetHealth",
    "autoscaling:DescribeAutoScalingGroups",
    "rds:DescribeDBInstances",
    "elasticache:DescribeCacheClusters",
    "elasticache:DescribeReplicationGroups",
    "elasticbeanstalk:DescribeEnvironments",
    "elasticbeanstalk:DescribeEnvironmentHealth",
    "lambda:ListFunctions",
    "s3:ListAllMyBuckets",
    "ecs:ListClusters",
    "ecs:DescribeClusters"
    ],
    "Resource": "*"
    }
    ]
    }
    Tips
    • tag:GetResourcesaws_tag_select機能の使用時に必要です。タグベースフィルタリングを使用しない場合は削除しても構いません。
    • 最小権限の原則(Least Privilege)に従い、実際にモニタリング対象となるサービスの権限のみを含めることを推奨します。
  3. ポリシー名を入力(例: CloudWatchExporterReadOnlyPolicy)して作成します。

IAMユーザーの作成

  1. AWS ConsoleでIAM → ユーザー → ユーザーの作成に移動します。

  2. ユーザー名を入力します。(例: cloudwatch-exporter

  3. 権限設定でポリシーを直接アタッチ → CloudWatchExporterReadOnlyPolicyを選択します。

  4. ユーザーの作成を完了します。

  5. セキュリティ認証情報タブでアクセスキーの作成をクリックします。

  6. ユースケースとしてAWS外部で実行されるアプリケーションを選択します。

  7. Access Key IDとSecret Access Keyを保存します。

注意

Secret Access Keyはこの画面でのみ確認できます。必ず安全な場所に保存してください。

AWS Credentialsの設定

CloudWatch ExporterがAWS APIにアクセスするための認証情報を設定します。

方法1: 環境変数方式(推奨)

export AWS_ACCESS_KEY_ID="AKIAXXXXXXXXXXXXXXXX"
export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

永続的に適用するには~/.bashrcまたは~/.bash_profileに追記します。

echo 'export AWS_ACCESS_KEY_ID="AKIAXXXXXXXXXXXXXXXX"' >> ~/.bashrc
echo 'export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"' >> ~/.bashrc
source ~/.bashrc
注意

~/.bashrcに認証情報を平文で保存すると、ファイルへのアクセス権限を持つすべてのユーザーに露出する可能性があります。本番環境では方法2(Credentialsファイル方式)を推奨します。

方法2: AWS Credentialsファイル方式

# ディレクトリの作成
mkdir -p ~/.aws

# credentialsファイルの作成
cat <<EOF > ~/.aws/credentials
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
EOF

# configファイルの作成
cat <<EOF > ~/.aws/config
[default]
output = json
EOF

# 権限の設定
chmod 600 ~/.aws/credentials
chmod 600 ~/.aws/config

Javaのインストール

CloudWatch ExporterにはJava 11以上が必要です。

  • Amazon Linux 2 / CentOS / RHEL
# Amazon Corretto 11のインストール (Amazon Linux 2)
sudo yum install -y java-11-amazon-corretto-headless

# またはOpenJDK 11のインストール
sudo yum install -y java-11-openjdk-headless
  • Ubuntu / Debian
sudo apt update
sudo apt install -y openjdk-11-jre-headless

CloudWatch Exporterのインストール

作業ディレクトリの作成

sudo mkdir -p /opt/cloudwatch-exporter
sudo chown $USER:$USER /opt/cloudwatch-exporter
cd /opt/cloudwatch-exporter

JARファイルのダウンロード

最新バージョンはGitHub Releasesで確認できます。

# 最新バージョンは以下のGitHub Releasesページで確認し、VERSIONに入力してください。
# https://github.com/prometheus/cloudwatch_exporter/releases
VERSION="0.16.0"

# JARファイルのダウンロード
wget https://github.com/prometheus/cloudwatch_exporter/releases/download/v${VERSION}/cloudwatch_exporter-${VERSION}-jar-with-dependencies.jar

# ファイル名を簡素化するためのシンボリックリンクの作成
ln -sf cloudwatch_exporter-${VERSION}-jar-with-dependencies.jar cloudwatch_exporter.jar

最終的なディレクトリ構造は以下の通りです。

/opt/cloudwatch-exporter/
├── cloudwatch_exporter.jar # シンボリックリンク
├── cloudwatch_exporter-0.16.0-jar-with-dependencies.jar # 実際のJARファイル
└── config.yml # 設定ファイル(次のセクションで作成)

設定ファイルの作成(config.yml)

従来のクラウドモニタリングはトグルボタンで収集を有効化しますが、OpenMetrics方式ではconfig.ymlファイルを直接作成して収集対象とメトリクスを設定します。

主要サービス別メトリクスドキュメント

サービスNamespaceメトリクスドキュメント
EC2AWS/EC2https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html
RDSAWS/RDShttps://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-metrics.html
AuroraAWS/RDShttps://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraMonitoring.Metrics.html
ALBAWS/ApplicationELBhttps://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html
NLBAWS/NetworkELBhttps://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-cloudwatch-metrics.html
CLBAWS/ELBhttps://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html
LambdaAWS/Lambdahttps://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html
EBSAWS/EBShttps://docs.aws.amazon.com/ebs/latest/userguide/using_cloudwatch_ebs.html
S3AWS/S3https://docs.aws.amazon.com/AmazonS3/latest/userguide/cloudwatch-monitoring.html
ECSAWS/ECShttps://docs.aws.amazon.com/AmazonECS/latest/developerguide/cloudwatch-metrics.html
EKSAWS/EKShttps://docs.aws.amazon.com/eks/latest/userguide/cloudwatch.html
DynamoDBAWS/DynamoDBhttps://docs.aws.amazon.com/amazondynamodb/latest/developerguide/metrics-dimensions.html
ElastiCacheAWS/ElastiCachehttps://docs.aws.amazon.com/AmazonElastiCache/latest/dg/CacheMetrics.html
SQSAWS/SQShttps://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-available-cloudwatch-metrics.html
SNSAWS/SNShttps://docs.aws.amazon.com/sns/latest/dg/sns-monitoring-using-cloudwatch.html
API GatewayAWS/ApiGatewayhttps://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html
CloudFrontAWS/CloudFronthttps://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/monitoring-using-cloudwatch.html
NAT GatewayAWS/NATGatewayhttps://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway-cloudwatch.html
AutoScalingAWS/AutoScalinghttps://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-metrics.html
ElasticBeanstalkAWS/ElasticBeanstalkhttps://docs.aws.amazon.com/elasticbeanstalk/latest/dg/health-enhanced-cloudwatch.html
ノート

S3ストレージメトリクスは日次(daily)メトリクスのため、period_secondsを86400(1日)に設定する必要があります。

config.yml 基本構造

必須パラメータの説明

パラメータ説明
regionAWSリージョンap-northeast-2
aws_namespaceAWSサービスのネームスペースAWS/EC2, AWS/RDS
aws_metric_name収集するメトリクス名CPUUtilization
aws_dimensionsメトリクスの分類基準[InstanceId]
aws_statistics統計タイプ[Average, Maximum, Sum]
period_secondsデータポイントの間隔(秒)300(5分)
range_seconds照会する時間範囲(秒)600(10分)
delay_secondsCloudWatchデータ遅延の補正(秒)600(10分)

統計タイプ(aws_statistics)

統計説明使用例
Average平均値CPU使用率、メモリ使用率
Sum合計ネットワークトラフィック、リクエスト数
Maximum最大値ピークCPU、最大レイテンシ
Minimum最小値最小空き容量
SampleCountサンプル数データポイント数

全サービス推奨設定

サービスperiod_secondsrange_secondsdelay_seconds
EC2 (基本モニタリング)300600600
EC2 (詳細モニタリング)60300120
EBS Volume300600600
RDS60300120
Lambda60300120
ELB / ALB / NLB60300120
DynamoDB60300120
CloudFront60300120
ElastiCache60300120
S3 (リクエストメトリクス)60300120
S3 (ストレージメトリクス)86400172800600
ECS60300120
ECS/ContainerInsights60300120
AutoScaling60300120
ElasticBeanstalk60300120

値の設定式

  • period_seconds = 対象サービスのパブリッシュ間隔
  • range_secondsperiod_seconds × 2(安全マージン、通常2〜5倍)
  • delay_secondsperiod_seconds × 2
ノート

例外/注意事項

  • EC2基本モニタリング: 5分単位がデフォルトです。period_secondsを60に下げてもデータは5分に1回であるため、空のポイントが増えるだけです。
  • EBS Volume: EC2と同様に5分単位です。
  • S3ストレージメトリクス: 1日1回パブリッシュされます。period_secondsを86400(1日)に設定し、delay_secondsも十分に長く設定してください。
  • カスタムメトリクス(高解像度): 1秒単位も可能ですがコストがかかります。通常は60で十分です。

CloudWatchデータが過去時点となる理由

  1. 集計期間が終了してから統計が算出されます — 5分間の平均はその5分間がすべて経過してから計算されます。10:00〜10:05の平均を10:03に照会しても、期間がまだ終了していないため値が返されません。
  2. 取り込み遅延を回避するための照会遅延設定(delay_seconds — CloudWatchはメトリクスがAPIに反映されるまで数分の遅延が発生します。不完全なデータを取得しないよう、OpenAgentは一定時間以前のデータのみを照会するよう設定されています。現在の設定基準では、EC2・ALB・EBSは約10〜15分前、ElastiCache・ECSは約1〜2分前のデータから安定して取得できます。(サービスごとのperiod_secondsdelay_seconds設定により異なります。)
  3. EC2基本モニタリングは5分単位でパブリッシュ — AWSのデフォルト提供間隔が5分です。詳細モニタリング(有料)を有効にすると1分単位で収集されます。

config.yml 設定例

# config.yml 例
region: ap-northeast-2 # AWSリージョン
metrics: # 収集するメトリクスリスト
- aws_namespace: AWS/EC2 # AWSサービスのネームスペース
aws_metric_name: CPUUtilization # メトリクス名
aws_dimensions: [InstanceId] # ディメンション(分類基準)
aws_tag_select: # タグベースフィルタリングおよびラベル追加
resource_type_selection: "ec2:instance" # リソースタイプ
resource_id_dimension: InstanceId # ディメンションにマッピングするリソースID
aws_statistics: [Average] # 統計タイプ
period_seconds: 300 # データポイントの間隔
range_seconds: 600 # 照会時間範囲
delay_seconds: 600 # データ遅延時間

Openmetrics cloudwatch config.yml

高度なパラメータ:フィルタリング

  • aws_dimension_select (特定リソースのみ収集)
- aws_namespace: AWS/EC2
aws_metric_name: CPUUtilization
aws_dimensions: [InstanceId]
aws_dimension_select:
InstanceId:
- i-xxxxxxxxxxxxxxxx1
- i-xxxxxxxxxxxxxxxx2
aws_statistics: [Average]
period_seconds: 300
range_seconds: 600
delay_seconds: 600
  • aws_dimension_select_regex (正規表現フィルタリング)
- aws_namespace: AWS/EC2
aws_metric_name: CPUUtilization
aws_dimensions: [InstanceId]
aws_dimension_select_regex:
InstanceId: "^i-0123.*"
aws_statistics: [Average]
period_seconds: 300
range_seconds: 600
delay_seconds: 600
  • aws_tag_select (タグベースフィルタリング) - 推奨
- aws_namespace: AWS/EC2
aws_metric_name: CPUUtilization
aws_dimensions: [InstanceId]
aws_tag_select:
tag_selections:
Environment: ["production", "staging"]
Team: ["devops"]
resource_type_selection: "ec2:instance"
resource_id_dimension: InstanceId
aws_statistics: [Average]
period_seconds: 300
range_seconds: 600
delay_seconds: 600
注意

tag_selectionsにキーを指定すると、該当タグが存在しないリソースはメトリクス収集の対象から除外されます。

サービスresource_type_selectionresource_id_dimension
EC2ec2:instanceInstanceId
ALBelasticloadbalancing:loadbalancer/appLoadBalancer
NLBelasticloadbalancing:loadbalancer/netLoadBalancer
CLBelasticloadbalancing:loadbalancerLoadBalancerName
RDSrds:dbDBInstanceIdentifier
Aurorards:clusterDBClusterIdentifier
EBSec2:volumeVolumeId
ElastiCacheelasticache:clusterCacheClusterId

CloudWatch Exporterの実行

nohupでの実行(簡易テスト用)

cd /opt/cloudwatch-exporter

# バックグラウンド実行
nohup java -jar cloudwatch_exporter.jar 9106 config.yml > cloudwatch_exporter.log 2>&1 &

# プロセスの確認
ps aux | grep cloudwatch_exporter

# ログの確認
tail -100f cloudwatch_exporter.log

# 終了
pkill -f cloudwatch_exporter.jar

Systemdサービスへの登録(本番環境推奨)

方法1: 環境変数方式

sudo vi /etc/systemd/system/cloudwatch-exporter.service
[Unit]
Description=Prometheus CloudWatch Exporter
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/opt/cloudwatch-exporter

# 環境変数でAWS Credentialsを直接設定
Environment="AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXXXXX"
Environment="AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

ExecStart=/usr/bin/java -jar /opt/cloudwatch-exporter/cloudwatch_exporter.jar 9106 /opt/cloudwatch-exporter/config.yml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

方法2: AWS Credentialsファイル方式

sudo vi /etc/systemd/system/cloudwatch-exporter.service
[Unit]
Description=Prometheus CloudWatch Exporter
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/opt/cloudwatch-exporter

# AWS SDKが $HOME/.aws/credentials ファイルを参照
# 例: /root/.aws/credentials ファイルを使用
Environment="HOME=/root"

ExecStart=/usr/bin/java -jar /opt/cloudwatch-exporter/cloudwatch_exporter.jar 9106 /opt/cloudwatch-exporter/config.yml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

サービスの起動

sudo systemctl daemon-reload
sudo systemctl start cloudwatch-exporter
sudo systemctl enable cloudwatch-exporter
sudo systemctl status cloudwatch-exporter

OpenAgentのダウンロードと設定

すべてのファイルは同じディレクトリに配置する必要があります。

## Example
/opt/whatap/openagent/
├── openagent # Executable file
├── whatap.conf # Configuration file
└── scrape_config.yaml # Scraping configuration file

ディレクトリの移動と実行ファイルのダウンロード

mkdir -p /opt/whatap/openagent
cd /opt/whatap/openagent

## AMD64 (Intel/AMD 64-bit processor)
wget https://repo.whatap.io/openagent/latest/amd/openagent

## ARM64 (ARM processor in Linux environment)
## CAUTION: macOS Apple Silicon not supported
wget https://repo.whatap.io/openagent/latest/arm/openagent

実行権限の設定

chmod +x openagent

scrape_config.yamlの作成

scrape_config.yamlファイルが変更されると、OpenAgentは自動的に変更を検出して設定を再ロードします。別途の再起動は不要です。

#scrape_config.yaml
features:
openAgent:
enabled: true
targets:
- targetName: cloudwatch-exporter
type: StaticEndpoints
# Target is enabled by default (enabled: true), this can be omitted
enabled: true
endpoints:
- address: "192.168.49.2:9106"
path: "/metrics"
scheme: "http"
interval: "300s"
metricRelabelConfigs:
- source_labels: [__name__]
regex: ".*"
action: keep

基本実行

./openagent standalone

バックグラウンド実行

nohup ./openagent standalone > /dev/null 2>&1 &

ログの確認

tail -f logs/whatap-boot-{yyyymmdd}.log

プロセス管理

# Check process
ps aux | grep openagent

# Terminate process
pkill openagent

StaticEndpoints設定要素

  • targetName: ターゲットの名前(識別用)
  • type: ターゲットタイプ("StaticEndpoints")
  • endpoints: スクレイピングするエンドポイントの定義
    • address: スクレイピング対象のアドレス(IP:PORT または HOSTNAME:PORT
    • path: メトリクスのパス(デフォルト値: /metrics)
    • scheme: スクレイピングプロトコル(http または https、デフォルト値: http)
    • interval: スクレイピング間隔(デフォルト値: 60s)
    • metricRelabelConfigs: スクレイピング後のメトリクスリラベリング設定

メトリクスリラベリング設定(metricRelabelConfigs)

OpenAgentはPrometheusのmetric_relabel_configsと同様のメトリクスリラベリング機能をサポートしています。

リラベリング設定要素

  • source_labels: ソースラベルのリスト(配列)
  • separator: ソースラベルの値を連結する際に使用する区切り文字(デフォルト値: ;
  • target_label: ターゲットラベル(結果を保存するラベル)
  • regex: ソースラベルの値に適用する正規表現
  • replacement: 置換値(正規表現のキャプチャグループ参照が可能、例: ${1}
  • action: 実行するアクション(keep、drop、replace)

サポートされるアクション(action)

  • keep: 正規表現に一致するメトリクスのみ保持
  • drop: 正規表現に一致するメトリクスを削除
  • replace: ターゲットラベルの値を置換値に変更

1. 全メトリクスの収集

metricRelabelConfigs:
- source_labels: [__name__]
regex: ".*"
action: keep

2. 特定メトリクスのみ保持

metricRelabelConfigs:
- source_labels: [__name__]
regex: "aws_ec2_cpuutilization_average"
action: keep

3. 正規表現を使用したメトリクスフィルタリング

metricRelabelConfigs:
- source_labels: [__name__]
regex: "aws_ec2_(cpu|network).*"
action: keep

4. ラベル名の変更

metricRelabelConfigs:
- source_labels: [instance_id]
target_label: ec2_instance_id
replacement: "${1}"
action: replace

5. 静的ラベルの追加

metricRelabelConfigs:
- target_label: metric_src
replacement: "whatap-open-agent"
action: replace