AWS Performance Insights を使ってみよう
AWS Performance Insights を使ってみよう
あらまし
Amazon RDS を利用している際に予想外の負荷が発生してしまう経験はないでしょうか。
この際にパフォーマンスデータを分析して対応を考えたい局面が出てくると思いますが、外部プロファイリングツールなどは、ライセンス、セキュリティの問題など、すぐに使えない場合もあると思います。
今回は、AWS が提供している AWS Performance Insights
を利用してパフォーマンスを可視化する tips です。
AWS Performance Insights 料金について
無料利用枠あり
- 7 日間分のパフォーマンスデータ履歴
- 1 か月あたり 100 万件のリクエスト
長期保存をする場合の料金
注意
2022 年 7 月 1 日以降料金体系が変わりました。
こちら新体系をベースに解説。
例
db.t3.medium を利用する場合(ap-northeast-1)
"db.t3.medium" を使用する場合は、vCPU が 2 つです。
1 か月の保存を選択した場合、1.7561USD を 1 か月あたり vCPU ごとかかる。
1.7561
db.m6g.large を利用する場合(ap-northeast-1)
"db.m6g.large" を使用する場合も同様に、vCPU が 2 つです。
1 か月の保存を選択した場合、1.7561USD を 1 か月あたり vCPU ごとかかる。
1.7561
無料利用枠を超えた際の料金
API の無料利用枠には、Performance Insights のダッシュボードからの全コールと、Performance Insights のダッシュボード以外からのコール 100 万回分が含まれます。
100 万回を超えた場合以下の料金となる。
1,000 リクエストあたり 0.01USD
参考
Terraform で実際に定義してみよう
今回は検証用にリソースを立てるので、検証後にすぐ削除することを想定しています。
ディレクトリ構造
rds
├── Makefile
├── main.tf
└── module
├── igw
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
├── rds
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
├── subnet
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── vpc
├── main.tf
├── output.tf
└── variables.tf
VPC の定義
Terraform はモジュールとしてリソースを定義できるので、まずは VPC モジュールを作成しましょう。
variable "name" {}
variable "vpc_cidr" {}
resource "aws_vpc" "vpc" {
cidr_block = var.vpc_cidr
instance_tenancy = "default"
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "${var.name}-vpc"
}
}
output "vpc_id" { value = aws_vpc.vpc.id }
output "vpc_cidr" { value = aws_vpc.vpc.cidr_block }
Internet Gateway の定義
variable "name" {}
variable "vpc_id" {}
output "igw_id" { value = aws_internet_gateway.igw.id }
resource "aws_internet_gateway" "igw" {
vpc_id = var.vpc_id
tags = {
Name = "${var.name}-igw"
}
}
Subnet の定義
今回は検証ということで、Public Subnet を 1 つ作ります。
variable "name" {}
variable "vpc_id" {}
variable "igw_id" {}
variable "azs" {}
variable "pub_cidrs" { type = list(string) }
output "pub_subnet_ids" { value = aws_subnet.pub-sub.*.id }
resource "aws_subnet" "pub-sub" {
count = length(var.pub_cidrs)
vpc_id = var.vpc_id
cidr_block = element(var.pub_cidrs, count.index)
availability_zone = element(var.azs, count.index)
map_public_ip_on_launch = true
tags = {
Name = "${var.name}-pub-${element(var.azs, count.index)}"
}
}
resource "aws_route_table" "pub-rtb" {
vpc_id = var.vpc_id
route {
cidr_block = "0.0.0.0/0"
gateway_id = var.igw_id
}
tags = {
Name = "${var.name}-pub-rtb"
}
}
resource "aws_route_table_association" "pub-rtb-as" {
count = length(var.pub_cidrs)
subnet_id = element(aws_subnet.pub-sub.*.id, count.index)
route_table_id = aws_route_table.pub-rtb.id
}
RDS の定義
ここの定義部分で AWS Performance Insights を有効にして、設定していきます。
今回は無料利用枠に収めたいので 7 日間の保持にします。
また、今回の検証では、データベースエンジンに MySQL を利用しました。
performance_insights_enabled = true
performance_insights_kms_key_id = aws_kms_key.a.arn
performance_insights_retention_period = 7
variable "name" {}
variable "db_name" {}
variable "db_username" {}
variable "db_password" {}
variable "vpc_id" {}
variable "pub_subnet_ids" {}
variable "engine" { default = "mysql" }
variable "engine_version" { default = "8.0.20" }
variable "db_instance" { default = "db.t3.medium" }
output "db_address" { value = aws_db_instance.rds.address }
resource "aws_kms_key" "a" {
description = "KMS key 1"
deletion_window_in_days = 10
}
resource "aws_db_instance" "rds" {
allocated_storage = 5
storage_type = "gp2"
engine = var.engine
engine_version = var.engine_version
instance_class = var.db_instance
identifier = var.db_name
username = var.db_username
password = var.db_password
skip_final_snapshot = true
deletion_protection = false
publicly_accessible = true
vpc_security_group_ids = [aws_security_group.rds-sg.id]
db_subnet_group_name = aws_db_subnet_group.rds-subnet-group.name
performance_insights_enabled = true
performance_insights_kms_key_id = aws_kms_key.a.arn
performance_insights_retention_period = 7
}
resource "aws_db_subnet_group" "rds-subnet-group" {
name = var.db_name
description = "rds subnet group for ${var.db_name}"
subnet_ids = var.pub_subnet_ids
}
resource "aws_security_group" "rds-sg" {
name = "${var.name}-rds-sg"
description = "RDS service security group for ${var.name}"
vpc_id = var.vpc_id
ingress {
from_port = 3306
to_port = 3306
protocol = "tcp"
cidr_blocks = ["`<yourIP>`/32"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "${var.name}-rds-sg"
}
}
ワークロードを定義しよう
先程、定義したモジュールを使って main.tf を作成しましょう。
variable "name" {}
variable "region" {}
variable "vpc_cidr" {}
variable "public_subnet_cidrs" {}
variable "azs" {}
variable "db_name" {}
variable "db_username" {}
variable "db_password" {}
terraform {
required_version = "=v1.0.8"
}
provider "aws" {
region = var.region
}
module "vpc" {
source = "./module/vpc"
name = var.name
vpc_cidr = var.vpc_cidr
}
module "igw" {
source = "./module/igw"
name = var.name
vpc_id = module.vpc.vpc_id
}
module "subnet" {
source = "./module/subnet"
name = var.name
vpc_id = module.vpc.vpc_id
igw_id = module.igw.igw_id
azs = var.azs
pub_cidrs = var.public_subnet_cidrs
}
module "rds" {
source = "./module/rds"
name = var.name
db_name = var.db_name
db_username = var.db_username
db_password = var.db_password
vpc_id = module.vpc.vpc_id
pub_subnet_ids = module.subnet.pub_subnet_ids
}
また、Terraform のコマンドを Makefile でまとめて定義しておきます。
DOMAINNAME:=
.PHONY: init
init:
terraform init
.PHONY: plan
plan:
terraform plan
.PHONY: apply
apply:
terraform apply
.PHONY: destroy
destroy:
terraform destroy
.PHONY: dbtest
dbtest:
git clone https://github.com/datacharmer/test_db
cd test_db && mysql -h $(DOMAINNAME) -P 3306 -u root -p < employees.sql
今回動作チェックに関しては、テスト用データセットを提供しているリポジトリを利用します。
検証
以下のコマンドで、リソースを作成します。
$ make init plan
$ make apply
次に、テストデータを流し込みます。
$ make dbtest DOMAINNAME=`<your rds domain name>`
マネジメントコンソールに入ってパフォーマンスダッシュボードを開いてみましょう。
こちら項目などに関しての詳しい解説は、 AWS が公式で紹介しているので、こちらを参考にしてください。
確認できたら、リソースを削除するのをお忘れなく。
$ make destroy
まとめ
今回は、実際に Terraform を定義して AWS Performance Insights
を使用してみることでイメージがより具体的になったと思います。
いざ運用が始まって、AWS Performance Insights
を導入したいと思っても、再起動などが必要になるパターンもあるので、初期の段階から導入を検討できると良いと思います。
今回 AWS Performance Insights
を使用してみて、かなり使いやすいと感じましたので、今後も積極的に活用していきたいと思いました。
参考文献
Discussion