

# 백엔드 서비스에서 `@connections` 명령 사용
<a name="apigateway-how-to-call-websocket-api-connections"></a>

백엔드 서비스는 다음 WebSocket 연결 HTTP 요청을 사용하여 연결된 클라이언트에 콜백 메시지를 보내거나 연결 정보를 얻거나 클라이언트 연결을 끊을 수 있습니다.

**중요**  
이러한 요청은 [IAM 권한 부여](apigateway-websocket-control-access-iam.md)를 사용하므로 [서명 버전 4(SigV4)](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html)로 서명해야 합니다. 이를 수행하기 위해 API Gateway 관리 API를 사용할 수 있습니다. 자세한 내용은 [ApiGatewayManagementApi](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigatewaymanagementapi.html)를 참조하십시오.

다음 명령에서 `{{{api-id}}}`를 실제 API ID, 즉 API Gateway 콘솔에 표시되거나 AWS CLI [create-api](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-api.html) 명령에서 반환하는 ID로 바꿔야 합니다. 이 명령을 사용하기 전에 연결을 설정해야 합니다.

클라이언트에게 콜백 메시지를 전송하려면 다음을 사용합니다.

```
POST https://{{{api-id}}}.execute-api.{{us-east-1}}.amazonaws.com/{{{stage}}}/@connections/{{{connection_id}}}
```

`[Postman](https://www.postman.com/)`을 사용하거나 다음 예와 같이 `[awscurl](https://github.com/okigan/awscurl)`를 호출하여 이 요청을 테스트할 수 있습니다.

```
awscurl --service execute-api -X POST -d "hello world" https://{{{prefix}}}.execute-api.{{us-east-1}}.amazonaws.com/{{{stage}}}/@connections/{{{connection_id}}}
```

다음 예제와 같이 명령을 URL 인코딩해야 합니다.

```
awscurl --service execute-api -X POST -d "hello world" https://{{aabbccddee}}.execute-api.{{us-east-1}}.amazonaws.com/{{prod}}/%40connections/{{R0oXAdfD0kwCH6w%3D}}
```

클라이언트의 가장 최신 연결 상태를 얻으려면 다음을 사용합니다.

```
GET https://{{{api-id}}}.execute-api.{{us-east-1}}.amazonaws.com/{{{stage}}}/@connections/{{{connection_id}}}
```

클라이언트의 연결을 해제하려면 다음을 사용합니다.

```
DELETE https://{{{api-id}}}.execute-api.{{us-east-1}}.amazonaws.com/{{{stage}}}/@connections/{{{connection_id}}}
```

통합에 `$context` 변수를 사용하여 동적으로 콜백 URL을 구성할 수 있습니다. 예를 들어 Lambda 프록시 통합과 `Node.js` Lambda 함수를 사용하는 경우 다음과 같이 URL을 구성하고 연결된 클라이언트에 메시지를 보낼 수 있습니다.

```
import {
  ApiGatewayManagementApiClient,
  PostToConnectionCommand,
} from "@aws-sdk/client-apigatewaymanagementapi";

export const handler = async (event) => {
  const domain = event.requestContext.domainName;
  const stage = event.requestContext.stage;
  const connectionId = event.requestContext.connectionId;
  const callbackUrl = `https://${domain}/${stage}`;
  const client = new ApiGatewayManagementApiClient({ endpoint: callbackUrl });

  const requestParams = {
    ConnectionId: connectionId,
    Data: "Hello!",
  };

  const command = new PostToConnectionCommand(requestParams);

  try {
    await client.send(command);
  } catch (error) {
    console.log(error);
  }

  return {
    statusCode: 200,
  };
};
```

WebSocket API에 사용자 지정 도메인 이름을 사용하는 경우 함수 코드에서 `stage` 변수를 제거합니다.

콜백 메시지를 보낼 때는 Lambda 함수에 API Gateway Management API를 직접 호출할 권한이 있어야 합니다. 연결이 설정되기 전 또는 클라이언트 연결이 끊긴 후에 메시지를 게시하면 `GoneException`을 포함하는 오류가 발생할 수 있습니다.