참고 항목
모든 계획에서 입력 및 출력 바인딩이 지원되지만 Azure Database for MySQL 트리거 바인딩은 미리 보기 중에 전용 및 프리미엄 계획 에서만 사용할 수 있습니다.
Azure Database for MySQL 트리거 바인딩은 사용자 테이블에서 변경 내용(삽입 및 업데이트)을 모니터링하고 업데이트된 행 데이터를 사용하여 함수를 호출합니다.
Azure Database for MySQL 트리거 바인딩은 사용자 테이블에서 변경 내용을 모니터링하는 데 사용 및 열 데이터를 사용합니다 az_func_updated_at
. 따라서 트리거 지원을 사용하기 전에 MySQL 테이블에서 변경 내용 추적을 허용하도록 테이블 구조를 변경해야 합니다. 다음 쿼리를 통해 테이블에서 변경 내용 추적을 사용하도록 설정할 수 있습니다. 예를 들어 테이블에서 사용하도록 설정합니다.Products
ALTER TABLE Products
ADD az_func_updated_at TIMESTAMP DEFAULT
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
임대 테이블에는 사용자 테이블의 기본 키에 해당하는 모든 열과 세 개의 열( az_func_AttemptCount
, az_func_LeaseExpirationTime
및 az_func_SyncCompletedTime
)이 포함됩니다. 기본 키 열의 이름이 같은 경우 결과는 충돌을 나열하는 오류 메시지입니다. 이 경우 트리거가 작동하려면 나열된 기본 키 열의 이름을 바꿔야 합니다.
기능 개요
트리거 함수가 시작되면 변경 폴링 루프와 임대 갱신 루프라는 두 개의 별도 루프가 시작됩니다. 이러한 루프는 함수가 중지될 때까지 지속적으로 실행됩니다.
Azure Database for MySQL 트리거 바인딩은 폴링 루프를 사용하여 변경 내용을 확인합니다. 폴링 루프는 변경 내용을 감지할 때 사용자 함수를 트리거합니다. 대략적으로 루프는 다음 예제와 같습니다.
while (true) {
1. Get list of changes on table - up to a maximum number controlled by the MySql_Trigger_MaxBatchSize setting
2. Trigger function with list of changes
3. Wait for delay controlled by MySql_Trigger_PollingIntervalMs setting
}
변경 내용은 수행된 순서대로 처리됩니다. 가장 오래된 변경 내용이 먼저 처리됩니다. 변경 처리에 대해 다음 사항을 고려합니다.
- 한 번에 여러 행에서 변경이 발생하는 경우 함수로 전송되는 정확한 순서는 열 및 기본 키 열의
az_func_updated_at
오름차순을 기반으로 합니다. - 변경 내용은 행에 대해 일괄 처리됩니다. 루프의 각 반복 사이에 여러 변경이 행에서 발생하는 경우 해당 행에 대해 존재하는 최신 변경 항목만 고려됩니다.
참고 항목
현재 관리 ID는 Azure Functions와 Azure Database for MySQL 간의 연결에 대해 지원되지 않습니다.
예제 사용
Azure Database for MySQL 트리거에 대한 추가 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.
예는 Product
클래스와 해당 데이터베이스 테이블을 참조하세요.
namespace AzureMySqlSamples.Common
{
public class Product
{
public int? ProductId { get; set; }
public string Name { get; set; }
public int Cost { get; set; }
public override bool Equals(object obj)
{
if (obj is Product)
{
var that = obj as Product;
return this.ProductId == that.ProductId && this.Name == that.Name && this.Cost == that.Cost;
}
return false;
}
}
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
테이블에 하나의 열을 추가하여 데이터베이스에서 변경 내용 추적을 사용하도록 설정합니다.
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Azure Database for MySQL 트리거는 개체를 IReadOnlyList<MySqlChange<T>>
나열 MySqlChange
하는 바인딩합니다. 각 개체에는 다음 두 가지 속성이 있습니다.
-
Item
: 변경된 항목입니다. 항목의 형식은 클래스에서 볼 수 있듯이 테이블 스키마를ToDoItem
따라야 합니다. -
Operation
: 열거형의MySqlChangeOperation
값입니다. 가능한 값은Update
삽입 및 업데이트 모두에 대한 것입니다.
다음 예제에서는 테이블에서 변경이 발생할 때 호출되는 C# 함수 를 Product
보여줍니다.
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.MySql;
using Microsoft.Extensions.Logging;
using AzureMySqlSamples.Common;
namespace AzureMySqlSamples.TriggerBindingSamples
{
private static readonly Action<ILogger, string, Exception> _loggerMessage = LoggerMessage.Define<string>(LogLevel.Information, eventId: new EventId(0, "INFO"), formatString: "{Message}");
[Function(nameof(ProductsTrigger))]
public static void Run(
[MySqlTrigger("Products", "MySqlConnectionString")]
IReadOnlyList<MySqlChange<Product>> changes, FunctionContext context)
{
ILogger logger = context.GetLogger("ProductsTrigger");
// The output is used to inspect the trigger binding parameter in test methods.
foreach (MySqlChange<Product> change in changes)
{
Product product = change.Item;
_loggerMessage(logger, $"Change operation: {change.Operation}", null);
_loggerMessage(logger, $"Product Id: {product.ProductId}, Name: {product.Name}, Cost: {product.Cost}", null);
}
}
}
예제 사용
Azure Database for MySQL 트리거에 대한 추가 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.
이 예제에서는 클래스, 클래스, Product
MySqlChangeProduct
열거형 및 해당 데이터베이스 테이블을 참조 MySqlChangeOperation
합니다.
Product.java 별도의 파일에서:
package com.function.Common;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Product {
@JsonProperty("ProductId")
private int ProductId;
@JsonProperty("Name")
private String Name;
@JsonProperty("Cost")
private int Cost;
public Product() {
}
public Product(int productId, String name, int cost) {
ProductId = productId;
Name = name;
Cost = cost;
}
}
MySqlChangeProduct.java 명명된 별도의 파일에서 다음을 수행합니다.
package com.function.Common;
public class MySqlChangeProduct {
private MySqlChangeOperation Operation;
private Product Item;
public MySqlChangeProduct() {
}
public MySqlChangeProduct(MySqlChangeOperation operation, Product item) {
this.Operation = operation;
this.Item = item;
}
}
MySqlChangeOperation.java 명명된 별도의 파일에서:
package com.function.Common;
import com.google.gson.annotations.SerializedName;
public enum MySqlChangeOperation {
@SerializedName("0")
Update
}
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
테이블에 다음 열을 추가하여 데이터베이스에서 변경 내용 추적을 사용하도록 설정합니다.
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Azure Database for MySQL 트리거는 개체 배열 MySqlChangeProduct[]
인 에 바인딩됩니다MySqlChangeProduct
. 각 개체에는 다음 두 가지 속성이 있습니다.
-
item
: 변경된 항목입니다. 항목의 형식은 클래스에서 볼 수 있듯이 테이블 스키마를Product
따라야 합니다. -
operation
: 열거형의MySqlChangeOperation
값입니다. 가능한 값은Update
삽입 및 업데이트 모두에 대한 것입니다.
다음 예제에서는 테이블에서 변경이 발생할 때 호출되는 Java 함수를 Product
보여줍니다.
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for
* license information.
*/
package com.function;
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.mysql.annotation.MySqlTrigger;
import com.function.Common.MySqlChangeProduct;
import com.google.gson.Gson;
import java.util.logging.Level;
public class ProductsTrigger {
@FunctionName("ProductsTrigger")
public void run(
@MySqlTrigger(
name = "changes",
tableName = "Products",
connectionStringSetting = "MySqlConnectionString")
MySqlChangeProduct[] changes,
ExecutionContext context) {
context.getLogger().log(Level.INFO, "MySql Changes: " + new Gson().toJson(changes));
}
}
예제 사용
Azure Database for MySQL 트리거에 대한 추가 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.
이 예에서는 Product
데이터베이스 테이블을 참조하세요.
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
테이블에 하나의 열을 추가하여 데이터베이스에서 변경 내용 추적을 사용하도록 설정합니다.
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Azure Database for MySQL 트리거는 개체를 Product
나열하는 바인딩합니다. 각 개체에는 다음 두 가지 속성이 있습니다.
-
item
: 변경된 항목입니다. 항목의 구조는 테이블 스키마를 따릅니다. -
operation
: 삽입 및 업데이트 모두에 사용할 수 있는 값입니다Update
.
다음 예제에서는 테이블에서 변경이 발생할 때 호출되는 PowerShell 함수를 Product
보여줍니다.
다음 예에서는 function.json 파일의 데이터 바인딩입니다.
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString"
}
],
"disabled": false
}
구성 섹션에서는 이러한 속성에 대해 설명합니다.
다음 예제는 run.ps1 파일의 함수에 대한 샘플 PowerShell 코드입니다.
using namespace System.Net
param($changes)
# The output is used to inspect the trigger binding parameter in test methods.
# Use -Compress to remove new lines and spaces for testing purposes.
$changesJson = $changes | ConvertTo-Json -Compress
Write-Host "MySql Changes: $changesJson"
예제 사용
Azure Database for MySQL 트리거에 대한 추가 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.
이 예에서는 Product
데이터베이스 테이블을 참조하세요.
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
테이블에 하나의 열을 추가하여 데이터베이스에서 변경 내용 추적을 사용하도록 설정합니다.
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Azure Database for MySQL 트리거는 개체 배열인 에 바인딩됩니다 Changes
. 각 개체에는 다음 두 가지 속성이 있습니다.
-
item
: 변경된 항목입니다. 항목의 구조는 테이블 스키마를 따릅니다. -
operation
: 삽입 및 업데이트 모두에 사용할 수 있는 값입니다Update
.
다음 예제에서는 테이블에서 변경이 발생할 때 호출되는 JavaScript 함수를 Product
보여줍니다.
다음 예에서는 function.json 파일의 데이터 바인딩입니다.
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString",
}
],
"disabled": false
}
구성 섹션에서는 이러한 속성에 대해 설명합니다.
다음 예제는 파일의 함수에 대한 샘플 JavaScript 코드입니다 index.js
.
module.exports = async function (context, changes) {
context.log(`MySql Changes: ${JSON.stringify(changes)}`)
}
예제 사용
Azure Database for MySQL 트리거에 대한 추가 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.
이 예에서는 Product
데이터베이스 테이블을 참조하세요.
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
테이블에 하나의 열을 추가하여 데이터베이스에서 변경 내용 추적을 사용하도록 설정합니다.
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
참고 항목
Python용 Azure Functions 버전 1.22.0b4를 사용해야 합니다.
Azure Database for MySQL 트리거는 개체를 나열하는 이름이 지정된 Product
변수에 바인딩됩니다. 각 개체에는 다음 두 가지 속성이 있습니다.
-
item
: 변경된 항목입니다. 항목의 구조는 테이블 스키마를 따릅니다. -
operation
: 삽입 및 업데이트 모두에 사용할 수 있는 값입니다Update
.
다음 예제에서는 테이블에서 변경이 발생할 때 호출되는 Python 함수를 Product
보여줍니다.
다음 예제는 function_app.py 파일에 대한 샘플 Python 코드입니다.
import json
import logging
import azure.functions as func
app = func.FunctionApp()
# The function is triggered when a change (insert, update)
# is made to the Products table.
@app.function_name(name="ProductsTrigger")
@app.mysql_trigger(arg_name="products",
table_name="Products",
connection_string_setting="MySqlConnectionString")
def products_trigger(products: str) -> None:
logging.info("MySQL Changes: %s", json.loads(products))
특성
특성 속성 | 설명 |
---|---|
TableName |
필수입니다. 트리거가 모니터링하는 테이블의 이름입니다. |
ConnectionStringSetting |
필수입니다. 변경 내용을 모니터링하는 테이블을 포함하는 데이터베이스에 대한 연결 문자열을 포함하는 앱 설정의 이름입니다. 연결 문자열 설정의 이름은 Azure Database for MySQL에 대한 연결 문자열 을 포함하는 애플리케이션 설정(로컬 개발용 local.settings.json)에 해당합니다. |
LeasesTableName |
선택 사항. 임대를 저장하기 위한 테이블의 이름입니다. 지정하지 않으면 이름은 .입니다 Leases_{FunctionId}_{TableId} . |
주석
Java 함수 런타임 라이브러리에서 값이 Azure Database for MySQL에서 제공되는 매개 변수에 주석을 사용합니다@MySQLTrigger
. 이 주석은 다음 요소를 지원합니다.
요소 | 설명 |
---|---|
name |
필수입니다. 트리거가 바인딩되는 매개 변수의 이름입니다. |
tableName |
필수입니다. 트리거가 모니터링하는 테이블의 이름입니다. |
connectionStringSetting |
필수입니다. 변경 내용을 모니터링하는 테이블을 포함하는 데이터베이스에 대한 연결 문자열을 포함하는 앱 설정의 이름입니다. 연결 문자열 설정의 이름은 Azure Database for MySQL에 대한 연결 문자열 을 포함하는 애플리케이션 설정(로컬 개발용 local.settings.json)에 해당합니다. |
LeasesTableName |
선택 사항. 임대를 저장하기 위한 테이블의 이름입니다. 지정하지 않으면 이름은 .입니다 Leases_{FunctionId}_{TableId} . |
구성
다음 표에서는 function.json 파일에 설정한 바인딩 구성 속성에 대해 설명합니다.
재산 | 설명 |
---|---|
name |
필수입니다. 트리거가 바인딩되는 매개 변수의 이름입니다. |
type |
필수입니다.
MysqlTrigger 로 설정해야 합니다. |
direction |
필수입니다.
in 로 설정해야 합니다. |
tableName |
필수입니다. 트리거가 모니터링하는 테이블의 이름입니다. |
connectionStringSetting |
필수입니다. 변경 내용을 모니터링하는 테이블을 포함하는 데이터베이스에 대한 연결 문자열을 포함하는 앱 설정의 이름입니다. 연결 문자열 설정의 이름은 Azure Database for MySQL에 대한 연결 문자열 을 포함하는 애플리케이션 설정(로컬 개발용 local.settings.json)에 해당합니다. |
LeasesTableName |
선택 사항. 임대를 저장하기 위한 테이블의 이름입니다. 지정하지 않으면 이름은 .입니다 Leases_{FunctionId}_{TableId} . |
선택적 구성
로컬 개발 또는 클라우드 배포를 위해 Azure Database for MySQL 트리거에 대해 다음과 같은 선택적 설정을 구성할 수 있습니다.
host.json
이 섹션에서는 버전 2.x 이상에서 이 바인딩에 사용할 수 있는 구성 설정을 설명합니다. host.json 파일의 설정은 함수 앱 인스턴스의 모든 함수에 적용됩니다. 함수 앱 구성 설정에 대한 자세한 내용은 Azure Functions에 대한host.json 참조를 참조하세요.
설정 | 기본값 | 설명 |
---|---|---|
MaxBatchSize |
100 |
트리거된 함수로 전송되기 전에 트리거 루프를 반복할 때마다 처리되는 최대 변경 횟수입니다. |
PollingIntervalMs |
1000 |
각 변경 내용 일괄 처리 사이의 대기 시간(밀리초)입니다. (1,000ms는 1초입니다.) |
MaxChangesPerWorker |
1000 |
애플리케이션 작업자당 허용되는 사용자 테이블의 보류 중인 변경 내용 수에 대한 상한입니다. 변경 횟수가 이 제한을 초과하면 규모가 확장될 수 있습니다. 이 설정은 런타임 기반 크기 조정을 사용하도록 설정된 Azure 함수 앱에만 적용됩니다. |
예제 host.json 파일
다음은 선택적 설정이 있는 host.json 파일의 예입니다.
{
"version": "2.0",
"extensions": {
"MySql": {
"MaxBatchSize": 300,
"PollingIntervalMs": 1000,
"MaxChangesPerWorker": 100
}
},
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
},
"logLevel": {
"default": "Trace"
}
}
}
local.setting.json
local.settings.json 파일은 로컬 개발 도구에서 사용하는 앱 설정 및 설정을 저장합니다. local.settings.json 파일의 설정은 프로젝트를 로컬에서 실행할 때만 사용됩니다. Azure에 프로젝트를 게시하는 경우 함수 앱의 앱 설정에도 필요한 설정을 추가해야 합니다.
중요합니다
local.settings.json 파일에 연결 문자열과 같은 비밀이 포함될 수 있으므로 원격 리포지토리에 저장해서는 안 됩니다. Azure Functions를 지원하는 도구는 local.settings.json 파일의 설정을 프로젝트가 배포된 함수 앱의 앱 설정 과 동기화하는 방법을 제공합니다.
설정 | 기본값 | 설명 |
---|---|---|
MySql_Trigger_BatchSize |
100 |
트리거된 함수로 전송되기 전에 트리거 루프를 반복할 때마다 처리되는 최대 변경 횟수입니다. |
MySql_Trigger_PollingIntervalMs |
1000 |
각 변경 내용 일괄 처리 사이의 대기 시간(밀리초)입니다. (1,000ms는 1초입니다.) |
MySql_Trigger_MaxChangesPerWorker |
1000 |
애플리케이션 작업자당 허용되는 사용자 테이블의 보류 중인 변경 내용 수에 대한 상한입니다. 변경 횟수가 이 제한을 초과하면 규모가 확장될 수 있습니다. 이 설정은 런타임 기반 크기 조정을 사용하도록 설정된 Azure 함수 앱에만 적용됩니다. |
예제 local.settings.json 파일
다음은 선택적 설정이 있는 local.settings.json 파일의 예입니다.
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"MySqlConnectionString": "",
"MySql_Trigger_MaxBatchSize": 300,
"MySql_Trigger_PollingIntervalMs": 1000,
"MySql_Trigger_MaxChangesPerWorker": 100
}
}
변경 내용 추적 설정(필수)
Azure Database for MySQL 트리거에 사용할 변경 내용 추적을 설정하려면 함수를 사용하여 테이블에 열을 추가해야 합니다. Visual Studio Code 또는 Azure Data Studio를 포함하여 실행 중인 쿼리를 지원하는 MySQL 도구에서 이러한 단계를 완료할 수 있습니다.
Azure Database for MySQL 트리거 바인딩은 사용자 테이블에서 변경 내용을 모니터링하는 데 사용 및 열 데이터를 사용합니다 az_func_updated_at
. 따라서 트리거 지원을 사용하기 전에 MySQL 테이블에서 변경 내용 추적을 허용하도록 테이블 구조를 변경해야 합니다. 다음 쿼리를 통해 테이블에서 변경 내용 추적을 사용하도록 설정할 수 있습니다. 예를 들어 테이블에서 사용하도록 설정합니다.Products
ALTER TABLE Products;
ADD az_func_updated_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
임대 테이블에는 사용자 테이블의 기본 키에 해당하는 모든 열과 두 개의 열이 더 포함됩니다. az_func_AttemptCount
az_func_LeaseExpirationTime
기본 키 열의 이름이 같은 경우 결과는 충돌을 나열하는 오류 메시지입니다. 이 경우 트리거가 작동하려면 나열된 기본 키 열의 이름을 바꿔야 합니다.
런타임 기반 스케일링 사용
필요에 따라 함수는 사용자 테이블에서 처리될 보류 중인 변경 내용 수에 따라 자동으로 확장될 수 있습니다. Azure Database for MySQL 트리거를 사용할 때 함수가 프리미엄 계획에서 제대로 확장되도록 하려면 런타임 확장 모니터링을 사용하도록 설정해야 합니다.
Azure Portal의 함수 앱에서 구성을 선택합니다.
함수 런타임 설정 탭에서 런타임 크기 조정 모니터링에 대해 켜기를 선택합니다.
다시 시도 지원
시작 다시 시도
시작 중에 예외가 발생하면 호스트 런타임은 지수 백오프 전략으로 트리거 수신기를 자동으로 다시 시작하려고 시도합니다. 이러한 다시 시도는 수신기가 성공적으로 시작되거나 시작이 취소될 때까지 계속됩니다.
함수 예외 다시 시도
변경 처리 중에 사용자 함수에서 예외가 발생하면 현재 처리 중인 행의 일괄 처리가 60초 후에 다시 시도됩니다. 다른 변경 내용은 이 시간 동안 정상적으로 처리되지만, 예외를 발생시킨 일괄 처리의 행은 제한 시간이 경과할 때까지 무시됩니다.
특정 행에 대해 함수 실행이 5회 연속으로 실패하면 이후의 모든 변경 내용에 대해 해당 행이 무시됩니다. 일괄 처리의 행은 결정적이지 않으므로 실패한 일괄 처리의 행은 후속 호출에서 다른 일괄 처리로 끝날 수 있습니다. 이 동작은 실패한 일괄 처리의 모든 행이 반드시 무시되는 것은 아니라는 것을 의미합니다. 일괄 처리의 다른 행에서 예외가 발생한 경우 "양수" 행은 이후 호출에서 실패하지 않는 다른 일괄 처리로 끝날 수 있습니다.