이 문서에서는 Azure Functions와 Socket.IO 서버리스 통합을 사용하는 방법을 설명합니다.
| 작업 | 바인딩 유형 |
|---|---|
| URL 및 액세스 토큰을 포함한 클라이언트 협상 결과 가져오기 | 입력 바인딩 |
| 서비스의 메시지에 의해 트리거됨 | 트리거 바인딩 |
| 메시지를 보내거나 클라이언트를 관리하는 서비스 호출 | 출력 바인딩 |
소스 코드 | 패키지 | API 참조 설명서 | 제품 설명서 | 샘플
Important
Azure Function 바인딩은 서버리스 모드에서 Socket.IO Web PubSub와만 통합할 수 있습니다.
인증 및 연결 문자열
확장이 Socket.IO Web PubSub에서 작동하도록 하려면 서비스에 인증하기 위해 액세스 키 또는 ID 기반 구성을 제공해야 합니다.
액세스 키 기반 구성
| 구성 이름 | 설명 |
|---|---|
| WebPubSubForSocketIOConnectionString | 필수입니다. 서비스에 대한 키 기반 연결 문자열 |
Azure Portal에서 Socket.IO Web PubSub의 키 블레이드에서 연결 문자열 찾을 수 있습니다.
로컬 개발의 경우 파일을 사용하여 local.settings.json 연결 문자열 저장합니다. 이전 단계에서 복사한 연결 문자열 설정합니다WebPubSubForSocketIOConnectionString.
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
`WebPubSubForSocketIOConnectionString`: "Endpoint=https://<webpubsub-name>.webpubsub.azure.com;AccessKey=<access-key>;Version=1.0;"
}
}
배포되는 경우 애플리케이션 설정을 사용하여 연결 문자열 설정합니다.
ID 기반 구성
| 구성 이름 | 설명 |
|---|---|
| WebPubSubForSocketIOConnectionString__endpoint | 필수입니다. 서비스의 엔드포인트입니다. 예를 들어 https://mysocketio.webpubsub.azure.com |
| WebPubSubForSocketIOConnectionString__credential | 연결을 위해 토큰을 가져오는 방법을 정의합니다. 배포된 Azure Function이 관리 ID 인증을 사용하려는 경우 이 설정을 managedidentity로 설정해야 합니다. 이 값은 호스팅 환경에서 관리 ID를 사용할 수 있는 경우에만 유효합니다. |
| WebPubSubForSocketIOConnectionString__clientId |
credential이 managedidentity로 설정된 경우 이 속성은 토큰을 가져올 때 사용할 사용자가 할당한 ID를 지정하도록 설정할 수 있습니다. 속성은 애플리케이션에 할당된 사용자가 할당한 ID에 해당하는 클라이언트 ID를 허용합니다. 지정하지 않으면 시스템 할당 ID가 사용됩니다. |
함수 바인딩은 ID 기반 구성에 대한 공통 속성을 따릅니다. 더 많은 멘션되지 않은 속성은 ID 기반 연결에 대한 공통 속성을 참조하세요.
로컬 개발의 경우 파일을 사용하여 local.settings.json 연결 문자열 저장합니다. 이전 단계에서 복사한 연결 문자열 설정합니다WebPubSubForSocketIOConnectionString.
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"WebPubSubForSocketIOConnectionString__endpoint": "https://<webpubsub-name>.webpubsub.azure.com",
"WebPubSubForSocketIOConnectionString__tenant": "<tenant id you're in>",
}
}
ID 기반 구성을 사용하고 온라인으로 AzureWebJobsStorage 실행하려면 ID를 사용하여 호스트 스토리지에 연결하는 것을 참조해야 합니다.
입력 바인딩
Socket.IO 입력 바인딩은 클라이언트 협상 요청에 대한 a SocketIONegotiationResult 를 생성합니다. Socket.IO 클라이언트가 서비스에 연결하려고 할 때 인증에 대해 알고 endpointpathaccess token 있어야 합니다. 이러한 데이터를 생성하는 서버를 갖는 것이 일반적이며 이를 협상이라고 합니다.
[FunctionName("SocketIONegotiate")]
public static IActionResult Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
[SocketIONegotiation(Hub = "hub", UserId = "userId")] SocketIONegotiationResult result)
{
return new OkObjectResult(result);
}
attribute
입력 바인딩의 특성은 .입니다 [SocketIONegotiation].
| 특성 속성 | 설명 |
|---|---|
| 허브 | 클라이언트가 연결해야 하는 허브 이름입니다. |
| Connection | Socket.IO 연결 문자열 포함하는 앱 설정의 이름입니다(기본값은 WebPubSubForSocketIOConnectionString). |
| UserId | 연결의 userId입니다. 연결의 모든 소켓에 적용됩니다. 생성된 토큰의 sub 클레임이 됩니다. |
트리거 바인딩
Azure Function은 트리거 바인딩을 사용하여 함수를 트리거하여 Socket.IO Web PubSub에서 이벤트를 처리합니다.
트리거 바인딩은 Azure Function 엔드포인트를 따르는 특정 경로를 노출합니다. URL은 서비스의 URL 템플릿으로 설정되어야 합니다(포털: 설정 -> 이벤트 처리기 -> URL 템플릿). 엔드포인트 패턴에서 쿼리 부분 code=<API_KEY>는 보안상의 이유로 Azure 함수 앱을 사용할 때 필수입니다. 키는 Azure Portal에서 찾을 수 있습니다. 함수 앱 리소스를 찾고 함수 앱을 Azure에 배포한 후 Functions ->App 키 ->시스템 키 ->socketio_extension 이동합니다. 그러나 로컬 함수를 사용할 때는 이 키가 필요하지 않습니다.
<Function_App_Endpoint>/runtime/webhooks/socketio?code=<API_KEY>
소켓 연결 이벤트에 대한 함수 트리거입니다.
[FunctionName("SocketIOTriggerConnect")]
public static async Task<SocketIOEventHandlerResponse> Connect(
[SocketIOTrigger("hub", "connect")] SocketIOConnectRequest request)
{
return new SocketIOConnectResponse();
}
소켓 연결 이벤트에 대한 함수 트리거입니다.
[FunctionName("SocketIOTriggerConnected")]
public static async Task Connected(
[SocketIOTrigger("hub", "connected")] SocketIOConnectedRequest request)
{
}
소켓 연결 끊기 이벤트에 대한 함수 트리거입니다.
[FunctionName("SocketIOTriggerDisconnected")]
public static async Task Disconnected(
[SocketIOTrigger("hub", "disconnected")] SocketIODisconnectedRequest request)
{
}
클라이언트의 일반 메시지에 대한 함수 트리거입니다.
[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
[SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
[SocketIOParameter] string arg)
{
}
특성
트리거 바인딩의 특성은 .입니다 [SocketIOTrigger].
| 특성 속성 | 설명 |
|---|---|
| 허브 | 클라이언트가 연결해야 하는 허브 이름입니다. |
| 네임스페이스 | 소켓의 네임스페이스입니다. 기본값: "/" |
| EventName | 함수가 트리거하는 이벤트 이름입니다. 소켓 연결 이벤트의 경우 일부 이벤트 이름이 미리 정의되어 connect 있습니다.
connected 는 소켓 연결 이벤트에 대한 것입니다.
disconnected 는 소켓 연결이 끊긴 이벤트에 대한 것입니다. 그리고 다른 이벤트는 사용자에 의해 정의되며 클라이언트 쪽에서 보낸 이벤트 이름과 일치해야 합니다. |
| ParameterNames | 이벤트의 매개 변수 이름 목록입니다. 목록의 길이는 클라이언트에서 보낸 이벤트와 일치해야 합니다. 또한 이름은 바인딩 식을 사용하고 동일한 이름 함수 매개 변수로 액세스합니다. |
데이터 바인딩
[SocketIOTrigger] 는 일부 변수를 바인딩 데이터에 바인딩합니다. Azure Functions 바인딩 식 패턴에서 자세히 알아볼 수 있습니다.
SocketIOAttribute
SocketIOAttribute 는 함수 정의를 간소화하는 대안 ParameterNames입니다. 예를 들어 다음 두 정의의 효과는 동일합니다.
[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
[SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
[SocketIOParameter] string arg)
{
}
[FunctionName("SocketIOTriggerMessage")]
public static async Task NewMessage(
[SocketIOTrigger("hub", "new message", ParameterNames = new[] {"arg"})] SocketIOMessageRequest request,
string arg)
{
}
함께 ParameterNames[SocketIOParameter] 사용할 수 없습니다.
입력 바인딩 요청
입력 바인딩 인수의 데이터 구조는 메시지 유형에 따라 달라집니다.
연결
{
"namespace": "",
"socketId": "",
"claims": {
"<claim-type>": [ "<claim-value>" ]
},
"query": {
"<query-key>": [ "<query-value>" ]
},
"headers":{
"<header-name>": [ "<header-value>" ]
},
"clientCertificates":{
{
"thumbprint": "",
"content": ""
}
}
}
| 속성 | 설명 |
|---|---|
| namespace | 소켓의 네임스페이스입니다. |
| socketId | 소켓의 고유 ID입니다. |
| claims | 클라이언트 연결의 JWT 클레임입니다. 서비스에서 함수를 요청할 때 JWT가 아니라 Engine.IO 클라이언트가 서비스에 연결할 때 JWT입니다. |
| query | 클라이언트 연결의 쿼리입니다. 서비스에서 함수를 요청할 때 쿼리가 아니라 Engine.IO 클라이언트가 서비스에 연결할 때의 쿼리입니다. |
| 헤더 | 클라이언트 연결의 헤더입니다. 서비스에서 함수를 요청할 때 헤더가 아니라 Engine.IO 클라이언트가 서비스에 연결할 때 헤더입니다. |
| clientCertificates | 클라이언트 인증서가 사용하도록 설정된 경우 |
연결됨
{
"namespace": "",
"socketId": "",
}
| 속성 | 설명 |
|---|---|
| namespace | 소켓의 네임스페이스입니다. |
| socketId | 소켓의 고유 ID입니다. |
연결 끊김
{
"namespace": "",
"socketId": "",
"reason": ""
}
| 속성 | 설명 |
|---|---|
| namespace | 소켓의 네임스페이스입니다. |
| socketId | 소켓의 고유 ID입니다. |
| reason | 연결 닫기 이유 설명입니다. |
일반 이벤트
{
"namespace": "",
"socketId": "",
"payload": "",
"eventName": "",
"parameters": []
}
| 속성 | 설명 |
|---|---|
| namespace | 소켓의 네임스페이스입니다. |
| socketId | 소켓의 고유 ID입니다. |
| payload | Engine.IO 프로토콜의 메시지 페이로드 |
| eventName | 요청의 이벤트 이름입니다. |
| 매개 변수 | 메시지의 매개 변수 목록입니다. |
출력 바인딩
출력 바인딩은 현재 다음 기능을 지원합니다.
- 방에 소켓 추가
- 회의실에서 소켓 제거
- 소켓에 메시지 보내기
- 채팅방에 메시지 보내기
- 네임스페이스에 메시지 보내기
- 소켓 연결 끊기
[FunctionName("SocketIOOutput")]
public static async Task<IActionResult> SocketIOOutput(
[SocketIOTrigger("hub", "new message")] SocketIOMessageRequest request,
[SocketIO(Hub = "hub")] IAsyncCollector<SocketIOAction> collector)
{
await collector.AddAsync(SocketIOAction.CreateSendToNamespaceAction("new message", new[] { "arguments" }));
}
attribute
입력 바인딩의 특성은 .입니다 [SocketIO].
| 특성 속성 | 설명 |
|---|---|
| 허브 | 클라이언트가 연결해야 하는 허브 이름입니다. |
| Connection | Socket.IO 연결 문자열 포함하는 앱 설정의 이름입니다(기본값은 WebPubSubForSocketIOConnectionString). |
actions
출력 바인딩은 작업을 사용하여 작업을 수행합니다. 현재 다음 작업을 지원합니다.
AddSocketToRoomAction
{
"type": "AddSocketToRoom",
"socketId": "",
"room": ""
}
RemoveSocketFromRoomAction
{
"type": "RemoveSocketFromRoom",
"socketId": "",
"room": ""
}
SendToNamespaceAction
{
"type": "SendToNamespace",
"eventName": "",
"parameters": [],
"exceptRooms": []
}
SendToRoomsAction
{
"type": "SendToRoom",
"eventName": "",
"parameters": [],
"rooms": [],
"exceptRooms": []
}
SendToSocketAction
{
"type": "SendToSocket",
"eventName": "",
"parameters": [],
"socketId": ""
}
DisconnectSocketsAction
{
"type": "DisconnectSockets",
"rooms": [],
"closeUnderlyingConnection": false
}