Skip to main content

ตั้งเวลา Scale Up, Down ให้ Azure SQL Database แบบ DTU

เนื่องจาก Database แบบ DTU ยังไม่มี Option ให้ทำ Auto Scale เพื่อให้ขนาดใหญ่ขึ้นได้ ดังนั้น ถ้าเราจะทำเราสามารถใช้ GitHub Actions ช่วยได้

ใน GitHub Action จะใช้ crontab ในการตั้งค่าเวลา

ตั้งค่าเฉพาะวันจันทร์ - ศุกร์

  • Start Scale Up: 0 6 * * 1-5 (“At 06:00 UTC on every day-of-week from Monday through Friday.”) ลองดูเพิ่มที่ crontab.guru
  • Start Scale Down: 0 18 * * 1-5 (“At 18:00 UTC on every day-of-week from Monday through Friday.”) ลองดูเพิ่มที่ crontab.guru

ตั้งค่าให้ทำงานทุกวัน

  • 0 6 * * * (Every Day “At 06:00.” UTC)
  • 0 18 * * * (Every Day “At 18:00.” UTC)

ตัวอย่าง

Project Structure

.
├── composite
│ └── scale-sql-database
│ └── action.yml
└── scale-sql-db.yml

ในตัวอย่างนี้ เราสามารถ Scale แบบ manual ได้ด้วย

# scale-sql-db.yml

name: "Scale sql database by schedule"

on:
# Triggers the workflow on push or pull request events but only for the main branch
schedule:
# Test Scale up on Everyday
- cron: '0 6 * * *'
# Test Scale Down on Everyday
- cron: '0 18 * * *'

workflow_dispatch:
inputs:
service_objective:
description: service objective

env:
service_objective_scale_up: S7
service_objective_scale_down: S4
db_name: Database_Name
db_server: server-name
resource_group: resource-group-name

jobs:
manual:
name: scale at service_objective manually to ${{ github.event.inputs.service_objective }}
if: github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/composite/scale-sql-database
with:
azure_credentials: ${{ secrets.azure_credentials }}
db_name: ${{ env.db_name }}
db_server: ${{ env.db_server }}
resource_group: ${{ env.resource_group }}
service_objective: ${{ github.event.inputs.service_objective }}

scale-up:
name: Scale Up
if: github.event.schedule == '0 5 * * *'
runs-on: ubuntu-latest
steps:
- run: echo "Run at $(date)"
- uses: actions/checkout@v3
- uses: ./.github/workflows/composite/scale-sql-database
with:
azure_credentials: ${{ secrets.azure_credentials }}
db_name: ${{ env.db_name }}
db_server: ${{ env.db_server }}
resource_group: ${{ env.resource_group }}
service_objective: ${{ env.service_objective_scale_up }}

scale-down:
name: Scale Down
if: github.event.schedule == '0 19 * * *'
runs-on: ubuntu-latest
steps:
- run: echo "Run at $(date)"
- uses: actions/checkout@v3
- uses: ./.github/workflows/composite/scale-sql-database
with:
azure_credentials: ${{ secrets.azure_credentials }}
db_name: ${{ env.db_name }}
db_server: ${{ env.db_server }}
resource_group: ${{ env.resource_group }}
service_objective: ${{ env.service_objective_scale_down }}

ตัวอย่าง Composite ที่เรียกใช้

# composite/scale-sql-database/action.yml

name: "Scale SQL Database"
description: "Scale SQL Database"

inputs:
azure_credentials:
description: "Azure AD credentials"
required: true
db_name:
description: "DB name"
required: true
db_server:
description: "DB Server name"
required: true
resource_group:
description: "Resource Group"
required: true
service_objective:
description: "Service Objective"
required: true

runs:
using: "composite"
steps:
- uses: azure/login@v1
with:
creds: ${{ inputs.azure_credentials }}

- name: Scaling DB to ${{ inputs.service_objective }}
run: |
az sql db update --resource-group '${{ inputs.resource_group }}' --server '${{ inputs.db_server }}' --name '${{ inputs.db_name }}' --service-objective '${{ inputs.service_objective }}'
shell: bash

การดู Log การ Scale Database

เราสามารถเลือกดูที่เมนู Metric แล้วเลือก DTU_Limit ได้เลย สังเกตุจากเส้นสีน้ำเงิน