Eventgrid+Function实现event driven架构 - 数据库以及function code

时间:2024-01-22 17:05:53

承接上文Eventgrid+Function实现event driven架构 - 架构介绍及环境部署,这次主要把架构图中剩下的部分部署好,包括以下内容

  1. Azure SQL数据库部署
  2. 创建数据库table
  3. 配置function中到azure sql的outbound binding
  4. 编写function代码,处理收到的event,写到数据库里

Eventgrid+Function实现event driven架构 - 数据库以及function code_云

首先数据库的部署主要也都是通过CLI来做,否则图形化界面创建的话会太臃肿

# 创建Azure SQL Server
az sql server create `
 --name eventtest2024 `
 --resource-group event `
 --location eastasia `
 --admin-user admin_user `
 --admin-password '*****************'

Eventgrid+Function实现event driven架构 - 数据库以及function code_云_02

 # 创建Azure SQL database
 az sql db create -g event `
				 -s eventtest2024 `
				 -n mydb `
				 --service-objective S0 `
				 --backup-storage-redundancy Local

Eventgrid+Function实现event driven架构 - 数据库以及function code_数据库_03

数据库创建好之后,接下来把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
);

Eventgrid+Function实现event driven架构 - 数据库以及function code_Azure_04

数据库部分基本就准备完了,剩下的就是function里的代码以及function到数据库的连接了,function到数据库的连接用的是function内置的outbound binding,不需要自己编写连接数据库的代码,只需要把connection string准备好,然后在function里定义好outbound的绑定即可

首先先找到,之前创建数据库的connection string,复制好,替换掉密码,之后会用到

Eventgrid+Function实现event driven架构 - 数据库以及function code_Azure_05


之后在VS Code里ctrl+shift+P, 选择Azure Functions: Add New Setting...

Eventgrid+Function实现event driven架构 - 数据库以及function code_sql_06

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代码调整好之前有不少报错,调整好之后,已经可以正常运行了

Eventgrid+Function实现event driven架构 - 数据库以及function code_Azure_07

数据库里也已经可以看到数据

Eventgrid+Function实现event driven架构 - 数据库以及function code_数据库_08