AWS.ApiGatewayManagementApi() postToConnection 不起作用

rav*_*ker 6 gateway amazon-web-services websocket

我正在尝试使用方法向通过套接字连接的客户端发送消息**AWS.ApiGatewayManagementApi() postToConnection**。在本地运行良好,但在 ec2 中运行不正常。唯一的区别是 VPC。那会有问题吗?

var AWS = require('aws-sdk');

var awsGW = new AWS.ApiGatewayManagementApi({
    endpoint: "https://endpoint",
    accessKeyId: "accessKeyId",
    secretAccessKey: "secretAccessKey",
    region: "region"
});

awsGW.postToConnection({
    ConnectionId: 'ConnectionId',
    Data: '{"key1":"msg1","key2":"msg2"}'
}, (err, success) => {
    if (err) {
        console.log('Socket error', err);
    } else {
    }
});
Run Code Online (Sandbox Code Playgroud)

错误:

{ ForbiddenException: Forbidden
    at Object.extractError (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/protocol/json.js:51:27)
    at Request.extractError (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/protocol/rest_json.js:55:8)
    at Request.callListeners (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/request.js:683:14)
    at Request.transition (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /home/ubuntu/git/backend/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/home/ubuntu/git/backend/node_modules/aws-sdk/lib/request.js:685:12)
  message: 'Forbidden',
  code: 'ForbiddenException',
  time: 2019-06-10T07:40:02.214Z,
  requestId: 'f4caef03-8b52-11e9-9cc3-91bfe40b8eb0',
  statusCode: 403,
  retryable: false,
  retryDelay: 37.0834357877396 } 
Run Code Online (Sandbox Code Playgroud)

Mal*_*ous 6

我遇到了类似的问题,这是因为我使用了错误的端点。我是event根据正常的 API 请求从对象生成它的,因此我获得了不同服务的端点(正常的 API,而不是 websocket)。

如果您的 websockets 服务部署到类似的 URL,wss://abcd那么您的端点应该是https://abcd.

  • 这正是我遇到的问题。当您阅读文档时,使用“https”而不是“wss”作为 URL 是非常不直观的(golang:https://docs.aws.amazon.com/sdk-for-go/api/service/apigatewaymanagementapi/)当您考虑到 API Gateway 控制台本身显示 WebSocket URL 为“wss://...” (2认同)

Chr*_*ris 0

403 听起来您需要更新调用您的 IAM 角色的策略postToConnection

就我而言,我明确缺少规则,因此我必须附加授权ExecuteAPI

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "execute-api:*",
            "Resource": "arn:aws:execute-api:eu-west-1:###########:*/*/*/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)