我尝试将Grafana集成到Amazon Prometheus托管服务(AMP)中
首先
很高兴见到你!我是日铁解决方案股份有限公司(NSSOL)零售和服务解决方案事业部的Haruka。
在我所属的部门中,我们开始通过工作向外界传播我们积累的技术知识。作为第一步,我们创建了一篇在Qiita上的文章。
我將Amazon Managed Service for Prometheus(以下簡稱AMP)和Grafana集成到示範應用程式中,作為監視學習的一部分。
※Prometheus是一种开源的数据收集工具。它可以收集和监视各种指标,例如服务器资源的使用情况。
※Grafana→一个开源的数据可视化工具。可以将通过Prometheus等收集的数据以直观的方式进行可视化。
这次我们决定使用AWS托管的AMP来与AWS服务结合,虽然Prometheus也有开源版本。
Grafana决定将OSS版本部署到Amazon Elastic Container Service(以下简称ECS)容器中并进行使用。
尽管Grafana中也有AWS托管服务,但由于需要进行Amazon Organizations的设置,在内部环境中使用变得困难,因此我们放弃了它。
关于样本应用程序。
这次,我选择了amazon-ecs-java-microservices/3_ECS_Java_Spring_PetClinic_CICD作为示例应用程序。
这是一个简单的REST API,根据每个功能分为5个服务(系统、所有者、宠物、兽医、访问),通过请求路径从应用负载均衡器(ALB)路由到各个服务,这是其特点之一。
应用程序需要部署在ECS上。
导入后的架构图
为了收集应用程序的指标,将AWS Distro for OpenTelemetry Collector(以下称为ADOTCollector)作为应用程序的辅助部署。
我们通过ADOTCollector将指标发送到AMP,并在部署在ECS集群上的Grafana上进行确认结果。
由于内部规定的原因,我们将应用程序部署在亚马逊虚拟私有云(以下简称VPC)内的私有子网中。因此,为了从每个资源访问AMP,我们设置了VPC终端节点,以避免通过互联网进行连接。

引入步骤
引导程序_AMP编辑
按照参考文献的指引,开始设置 AMP。
参考文献:https://docs.aws.amazon.com/zh_cn/prometheus/latest/userguide/AMP-onboard-ingest-metrics-OpenTelemetry-ECS.html
创建亚马逊管理的Prometheus工作区。

创建用于存储图像的亚马逊弹性容器注册表(以下简称ECR)仓库。

修改adot-config.yaml文件。
-
- adot-config.yamlファイルのexporters.awsprometheusremotewrite.endpoint にPrometheusのリモート書き込みURLエンドポイントを記載する
- adot-config.yaml
receivers:
awsecscontainermetrics:
collection_interval: 10s
processors:
filter:
metrics:
include:
match_type: strict
metric_names:
- ecs.task.memory.utilized
- ecs.task.memory.reserved
- ecs.task.cpu.utilized
- ecs.task.cpu.reserved
- ecs.task.network.rate.rx
- ecs.task.network.rate.tx
- ecs.task.storage.read_bytes
- ecs.task.storage.write_bytes
exporters:
awsprometheusremotewrite:
endpoint: # Prometheusのリモート書き込みURLエンドポイントを記載
aws_auth:
region: ap-northeast-1
service: aps
resource_to_telemetry_conversion:
enabled: true
logging:
loglevel: info
extensions:
health_check:
pprof:
endpoint: :1888
zpages:
endpoint: :55679
service:
extensions: [pprof, zpages, health_check]
pipelines:
metrics:
receivers: [prometheus]
exporters: [logging, awsprometheusremotewrite]
metrics/ecs:
receivers: [awsecscontainermetrics]
processors: [filter]
exporters: [logging, awsprometheusremotewrite]
修改buildspec.yml文件。
-
- buildspec.ymlファイルのCOLLECTOR_REPOSITORYに②で控えておいたECRリポジトリのURIを記載する
AWSのドキュメントに従って、イメージのタグは「:ecs」としておきます。
buildspec.yml
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- COLLECTOR_REPOSITORY= # ECRリポジトリのURIを記載
- aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $COLLECTOR_REPOSITORY
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build . -t $COLLECTOR_REPOSITORY:ecs
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $COLLECTOR_REPOSITORY:ecs
将Dockerfile,buildspec.yml和adot-config.yaml放置在AWS CodeCommit仓库中。
-
- AWS CodeCommitに新規リポジトリを作成し、Dockerfile, ③adot-config.yaml, ④buildspec.ymlファイルを配置する
- Dockerfile
FROM public.ecr.aws/aws-observability/aws-otel-collector:latest
COPY adot-config.yaml /etc/ecs/otel-config.yaml
CMD ["--config=/etc/ecs/otel-config.yaml"]
创建并推送ADOTCollector的容器映像到ECR。
-
- ⑤で作成したAWS CodeCommitリポジトリをソースとして、AWS CodeBuildにて新規ビルドプロジェクトを作成し、ECRにコンテナイメージをプッシュする
(AWS CodeBuildの利用方法は各自調べてください。)
修正应用程序的ECS任务定义
-
- アプリ側の修正例として、参考までにpetclinicデモアプリのAWS CloudFormationテンプレートの一部を紹介する
-
- TaskDefinition.Properties.ContainerDefinitionsに、adot-collectorというコンテナを追加し、サイドカーとして定義する
-
- ImageにECRリポジトリのURI:ecs と記載する
-
- 修正が終わったら、改めてECSデプロイ作業を行うこと
- petclinic-service.yaml
TaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
Family: !Sub ${ECRRepository}
TaskRoleArn: !Ref TaskDefinitionServiceRole
ExecutionRoleArn: arn:aws:iam::265407044485:role/ecsTaskExecutionRole
ContainerDefinitions:
- Name: !Sub ${ECRRepository}
Image: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${ECRRepository}:${ECRImageTag}
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-region: !Sub ${AWS::Region}
awslogs-group: !Ref ECSCluster
awslogs-stream-prefix: !Sub ${ECRImageTag}
Essential: true
Memory: !Ref ContainerMemorySize
PortMappings:
- ContainerPort: !Ref ContainerPort
Environment:
- Name: SPRING_PROFILES_ACTIVE
Value: mysql
- Name: SPRING_DATASOURCE_URL
Value: !Ref JDBCConnectionString
- Name: SPRING_DATASOURCE_USERNAME
Value: !Ref DBUsername
- Name: SPRING_DATASOURCE_PASSWORD
Value: cnabc2022
- Name: AWS_Region
Value: !Sub ${AWS::Region}
- Name: adot-collector
Image: # ECRリポジトリのURI:ecs と記載
Essential: true
Memory: 512
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-region: !Sub ${AWS::Region}
awslogs-group: !Ref ECSCluster
awslogs-stream-prefix: !Sub ${ECRImageTag}
Environment:
- Name: ECS_SERVICE_NAME
Value: !Sub ${ECRRepository}
在执行任务角色上附加AWS身份和访问管理(以下简称IAM)策略。

创建 VPC 终端节点,并设置 ECS 集群的安全组。
-
- VPC>仮想プライベートクラウド>エンドポイント>右上の「エンドポイントを作成」をクリック
-
- 名前タグに任意の名前を入力する
-
- サービスカテゴリは「AWSのサービス」とし、サービスにて「com.amazonaws.ap-northeast-1.aps-workspaces」を選択する
-
- 使用しているVPCとサブネットを選択する
- ECSクラスターのセキュリティグループを設定する
Grafana編的導入步驟
Grafana有提供参考文献,我们这里将使用AWS Fargate。
参考文献:请参阅链接的AWS官方文档,其中包含有关单独配置Grafana查询自动扩展模板的详细信息。
在ECS上创建一个Grafana容器。
ECSにGrafanaコンテナを立てる
ECSのタスク定義に、以下2つの環境変数を定義しておくこと
AWS_SDK_LOAD_CONFIG=true
GF_AUTH_SIGV4_AUTH_ENABLED=true
ブラウザで「http://(ALBのパス)/login」を打鍵するとGrafanaコンソール画面が表示される。
ユーザ名/パスワード両方adminと入力しログイン
ログイン後パスワードの変更を求められるため任意のパスワードを入力してsubmit

将Grafana的安全组设置为VPC终端节点。
-
- GrafanaからAMPにデータを取得しに行くために、作成済のVPCエンドポイントにGrafanaコンテナのセキュリティグループを追加する
「セキュリティグループの管理」をクリック
Grafanaコンテナのセキュリティグループを選択し、「セキュリティグループの変更」をクリック
创建IAM用户

将Prometheus数据源添加到Grafana中。


-
- Authにて「SigV4 auth」を選択
-
- SigV4 Auth Detailsを以下のように入力
Authentication Provider:Access & secret key
Access Key ID:<③で作成したIAMユーザーのアクセスキー>
Secret Access Key:<③で作成したIAMユーザーのシークレットアクセスキー>
Default Region:ap-northeast-1

-
- 「Save & test」をクリックして、保存&接続テストを行う
接続テストに成功すると「Data source is working」と表示される

用仪表盘检查指标
-
- Grafanaダッシュボードが確認できる
各タスクのCPU使用量
各タスクのメモリ使用量
各タスクが受信したバイト数
各タスクが送信したバイト数
等

※因为找不到一个合适的仪表板,所以我自己动手制作了一个。
印象
在互联网上没有很多资料,需要边阅读官方文档边进行,解决问题相当困难,但这是一次很棒的经验!
当我比较CloudWatch和AMP+Grafana的图表时,我感受到了以下的优点。
-
- より短い時間間隔でデータが取れる(CloudWatchではECSのメトリクスはデフォルトで1分間隔でしか取れないが、AMP+Grafanaはもっと細かく取れる。今回は10秒で取得)
- ダッシュボードのカスタマイズの自由度が高く、監視しやすい
如果有机会的话,我也想尝试使用AWS托管版的Grafana来进行配置。
商标注册
NS Solutions、NSSOL 是日鉄ソリューションズ株式会社的注册商标。
Amazon Web Services、AWS、Amazon Managed Service for Prometheus、Amazon Organizations、Amazon Elastic Container Service、AWS Distro for OpenTelemetry Collector、Application Load Balancer、Amazon Virtual Private Cloud、Amazon Elastic Container Registry、AWS CodeCommit、AWS CodeBuild、AWS CloudFormation、AWS Fargate、AWS Identity and Access Management是Amazon.com, Inc.或其关联公司的商标。
本文中的公司名称和产品名称是各公司的商标或注册商标。