承接上文Eventgrid+Function实现event driven架构 - 架构介绍及环境部署,这次主要把架构图中剩下的部分部署好,包括以下内容
- Azure SQL数据库部署
- 创建数据库table
- 配置function中到azure sql的outbound binding
- 编写function代码,处理收到的event,写到数据库里
首先数据库的部署主要也都是通过CLI来做,否则图形化界面创建的话会太臃肿
# 创建Azure SQL Server
az sql server create `
--name eventtest2024 `
--resource-group event `
--location eastasia `
--admin-user admin_user `
--admin-password '*****************'
# 创建Azure SQL database
az sql db create -g event `
-s eventtest2024 `
-n mydb `
--service-objective S0 `
--backup-storage-redundancy Local
数据库创建好之后,接下来把table也建好,我们这里因为只是一个测试环境,所以会挑选event中的一部分字段来创建一个简单的table
CREATE TABLE dbo.Event (
[Id] UNIQUEIDENTIFIER PRIMARY KEY,
[name] NVARCHAR(200) NOT NULL,
[scope] NVARCHAR(200) NOT NULL,
[action] NVARCHAR(200) NOT NULL,
[resourceUri] NVARCHAR(200) NOT NULL,
[operationName] NVARCHAR(200) NOT NULL,
[status] NVARCHAR(200) NOT NULL
);
数据库部分基本就准备完了,剩下的就是function里的代码以及function到数据库的连接了,function到数据库的连接用的是function内置的outbound binding,不需要自己编写连接数据库的代码,只需要把connection string准备好,然后在function里定义好outbound的绑定即可
首先先找到,之前创建数据库的connection string,复制好,替换掉密码,之后会用到
之后在VS Code里ctrl+shift+P, 选择Azure Functions: Add New Setting...
App setting 名字是SqlConnectionString,value就是之前的复制的connection string
Outbound binding就是在function代码里定义的, 直接定义好需要访问的table即可
import logging
import azure.functions as func
import sys
from azure.eventgrid import EventGridEvent
import json
from azure.functions.decorators.core import DataType
app = func.FunctionApp()
@app.event_grid_trigger(arg_name="azeventgrid")
# 定义function output binding
@app.generic_output_binding(arg_name="event2024", type="sql",
CommandText="[dbo].[Event]",
ConnectionStringSetting="SqlConnectionString",
data_type=DataType.STRING)
def EventGridTrigger(azeventgrid: func.EventGridEvent, event2024: func.Out[func.SqlRow]):
logging.info(azeventgrid)
data=azeventgrid.get_json()
logging.info(data)
id=azeventgrid.id
name=data['claims']['name']
scope=data['authorization']['scope']
action=data['authorization']['action']
resourceUri=data['resourceUri']
operationName=data['operationName']
status=data['status']
row = func.SqlRow.from_dict(
{
'Id':id,
'name':name,
'scope':scope,
'action':action,
'resourceUri':resourceUri,
'operationName':operationName,
'status':status
}
)
event2024.set(row)
function代码调整好之前有不少报错,调整好之后,已经可以正常运行了
数据库里也已经可以看到数据