はじめに

2023/5/12にはてな株式会社様におけるMackerel Azure インテグレーション開発の事例を公開しました。

https://cloudpack.jp/casestudy/257.html

アイレットでは SaaS 型サーバー監視サービス「Mackerel」における Azure SDK の旧ライブラリから新ライブラリへの切り替えをご支援させて頂きました。

概要

以前支援させていただいたAWSインテグレーション開発では、テスト環境やメトリック発生方法が共有されていなかったことから、はてな様側でのレビュー時に手間がかかる課題がありました。
そこでAzureインテグレーション開発では、テスト環境の構築はTerraformを、メトリックの収集はシェルスクリプトを活用して自動化することで、テストとレビューを効率化しました。
本記事はそのテスト環境の構築とテストの自動化について技術的に解説する記事となります。

詳細

テスト環境について

以前はどのような環境でテストが実施されたのかが明確に共有されておらず、レビュー時に同一の環境でテストが実施されていませんでした。
一つのサービスでも、価格帯レベルによってテスト対象の環境が複数ある場合や、特定の設定によって収集可能なメタデータやメトリックがあるなど、様々な要素が関わっています。これらの要素はレビューをするはてな様側に大きな負担をかけていました。
この課題を解決するため、今回からはテスト環境の再現性と管理の容易性を高めるためにIaCを採用することにしました。

今回活用したツールは以下のとおりです。

Terraform

Terraformを採用した理由としては、マルチクラウドに対応しており元々AWSを扱うエンジニアからも扱いやすく学習コストが低い点です。また、インフラのコード化が可能なため、バージョン管理システムであるGithub上でのテスト環境の共有が容易にできます。

AzureRM

Azureのリソースを構築するにあたりTerraformのプロバイダーがいくつかありますが、
今回は既存サービスのSDKの切り替えが主な作業であったため、AzureRM プロバイダーを使用しています。

random

Terraformの設定内でランダムな値を扱えるようにするプロバイダーです。
一意の値にしたいストレージアカウント名やパスワードの生成に使っています。

Azure terrafy

Azureの既存のリソースをTerraformにインポートするツールで、既にterraform importコマンドがありますが、こちらはリソースグループ単位でインポートすることが可能です。

テストの自動化について

Mackerelはクラウドのリソースからメトリックを収集しグラフを表示するサービスです。
したがって、テスト時には実際にリソースのメトリックを発生させる必要があります。
メトリックは通常時に発生するものからエラー時に発生するものまで多岐にわたるため、ドキュメントを参照しながら試行錯誤でメトリックを発生をさせる工程が含まれます。

前述のとおり以前はメトリックの発生方法まで共有されておらず、アイレット側とレビュー段階のはてな様側でこれらの工程が行われ二度手間になってしまう課題がありました。
この課題を解決するために、シェルスクリプトとツールを併用してメトリックの発生を自動化しました。

具体的には、テスト環境作成後に動作させるシェルスクリプトと既存のツールを組み合わせてリソースの操作をすることで、通常の負荷で発生するメトリックから特定条件下で発生するメトリックなどを自動的に発生させることができるようになりました。
これによって、手作業でメトリックを発生させる必要がなくなり、結果的にアイレット側とはてな様側でのテストやレビューでの二度手間が解消され、大幅な効率化に繋がりました。

各サービスごとの自動化方法と収集したメトリックを簡単に紹介します。

Virtual Machine

Virtual Machineの作成時にツール(stress)をブートストラップで動作させてメトリックの収集を行なっています。

  • 収集するメトリックの一覧
メトリック 単位 集計
Percentage CPU percentage Average
CPU Credits float Average
Disk IOPS iops Average
Network In/Out bytes Total
Network In/Out Total bytes Total
Disk Read/Write Bytes bytes Total

メトリックの詳細

Cache for Redis

Redisとコマンド実行用のVirtual Machine、メトリック収集のために追加でバックアップ用のストレージを作成しています。
Virtural Machineからベンチマークツールを動作させて、通常負荷時のメトリックを収集し、azコマンドによる再起動でフェイルオーバーやバックアップストレージのパブリックアクセスの無効化するなどでエラーのメトリックを収集しています。

  • 収集するメトリックの一覧
メトリック 単位 集計
CPU percentage Maximum
Connected Clients integer Maximum
Total Keys integer Maximum
Used Memory bytes Maximum
Server Load percentage Maximum
Cache Read/Write integer Maximum
Cache Hits/Misses integer Total
Commands integer Total
Evicted/Expired Keys integer Total
Operations Per Second iops Maximum
Errors integer Maximum

メトリックの詳細

SQL Database

Standard(Serverless), Premium, Hyperscale,Business Criticalの4つのSKUでSQL Databaseを作成しています。
こちらもVirtual Machineと組み合わせており、ベンチマークツールを動作させて負荷をかけています。ただし、通常の負荷では収集できないメトリックに関しては、別途SQLクエリを用意して実行しています。

  • 収集するメトリックの一覧
    • 一部抜粋(DTUベース Basic, Standard, Premium)
メトリック 単位 集計
Data space allocated bytes Average
Connections integer Total
CPU percentage Average
Deadlocks integer Total
DTU Consumption percentage Average
DTU float Average
Log Write percentage Average
Data Read percentage Average
Sessions percentage Average
SQL Server process core percent percentage Maximum
SQL Server process memory percent percentage Maximum
Data space used bytes Maximum
Data space used percent percentage Maximum
Tempdb Data File Size bytes Maximum
Tempdb Log File Size bytes Maximum
Tempdb Percent Log Used percentage Maximum
Workers percentage Average
In-Memory OLTP Storage percentage Average

メトリックの詳細

Load Balancer

Load BalancerからVirtual Machineにルーティングする構成でリソースの作成を行なっていて、VIrtual MachineからLoad Balancerへcurlコマンドを実行することで簡易的な動作を行いメトリックの収集を行なっています。

  • 収集するメトリックの一覧
メトリック 単位 集計
Byte Count bytes Total
Data Path Availability percentage Average
Health Probe Status percentage Average
Packet Count integer Total
SNAT Connection Count integer Total
SYN Count integer Total

メトリックの詳細

Database for PostgreSQL

Basic, General Purpose, Memory Optimizedの3つのSKUでPostgreSQL作成しています。SQLクエリを実行し、負荷を与えることでメトリックの収集を行なっています。

  • 収集するメトリックの一覧
    • 一部抜粋(Basic)
メトリック 単位 集計
Active/Failed Connections float Average
Total
Backup Storage used bytes Average
CPU percent percentage Average
Max Lag Across Replicas bytes Maximum
Memory percent percentage Average
Network In/Out bytes Total
Replica Lag float Maximum
Server Log storage limit/used bytes Maximum
Average
Server Log storage percent percentage Average
Storage limit/used bytes Maximum
Average
Storage percent percentage Average

メトリックの詳細