📊

AWS Performance Insights を使ってみよう

2022/10/05に公開

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 \times 2 = 3.5122 USD

db.m6g.large を利用する場合(ap-northeast-1)

"db.m6g.large" を使用する場合も同様に、vCPU が 2 つです。
1 か月の保存を選択した場合、1.7561USD を 1 か月あたり vCPU ごとかかる。
1.7561 \times 2 = 3.5122 USD

無料利用枠を超えた際の料金

API の無料利用枠には、Performance Insights のダッシュボードからの全コールと、Performance Insights のダッシュボード以外からのコール 100 万回分が含まれます。
100 万回を超えた場合以下の料金となる。

1,000 リクエストあたり 0.01USD

参考

https://aws.amazon.com/jp/rds/performance-insights/pricing/
https://aws.amazon.com/jp/rds/instance-types/

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 モジュールを作成しましょう。

variables.tf
variable "name" {}
variable "vpc_cidr" {}
main.tf
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.tf
output "vpc_id" { value = aws_vpc.vpc.id }
output "vpc_cidr" { value = aws_vpc.vpc.cidr_block }

Internet Gateway の定義

variables.tf
variable "name" {}
variable "vpc_id" {}
output.tf
output "igw_id" { value = aws_internet_gateway.igw.id }
main.tf
resource "aws_internet_gateway" "igw" {
  vpc_id = var.vpc_id
  tags = {
    Name = "${var.name}-igw"
  }
}

Subnet の定義

今回は検証ということで、Public Subnet を 1 つ作ります。

variables.tf
variable "name" {}
variable "vpc_id" {}
variable "igw_id" {}
variable "azs" {}
variable "pub_cidrs" { type = list(string) }
output.tf
output "pub_subnet_ids" { value = aws_subnet.pub-sub.*.id }
main.tf
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
variables.tf
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.tf
output "db_address" { value = aws_db_instance.rds.address }
main.tf
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 を作成しましょう。

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 でまとめて定義しておきます。

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

今回動作チェックに関しては、テスト用データセットを提供しているリポジトリを利用します。

https://github.com/datacharmer/test_db

検証

以下のコマンドで、リソースを作成します。

$ make init plan
$ make apply

次に、テストデータを流し込みます。

$ make dbtest DOMAINNAME=`<your rds domain name>`

マネジメントコンソールに入ってパフォーマンスダッシュボードを開いてみましょう。

こちら項目などに関しての詳しい解説は、 AWS が公式で紹介しているので、こちらを参考にしてください。

https://aws.amazon.com/jp/blogs/news/introduction-to-performance-insights-for-beginner/

確認できたら、リソースを削除するのをお忘れなく。

$ make destroy

まとめ

今回は、実際に Terraform を定義して AWS Performance Insights を使用してみることでイメージがより具体的になったと思います。
いざ運用が始まって、AWS Performance Insights を導入したいと思っても、再起動などが必要になるパターンもあるので、初期の段階から導入を検討できると良いと思います。
今回 AWS Performance Insights を使用してみて、かなり使いやすいと感じましたので、今後も積極的に活用していきたいと思いました。

参考文献

https://aws.amazon.com/jp/rds/performance-insights/pricing/
https://aws.amazon.com/jp/rds/instance-types/
https://aws.amazon.com/jp/blogs/news/tuning-amazon-rds-for-mysql-with-performance-insights/

GitHubで編集を提案

Discussion