如何使用自定义授权程序和空$ context.authorizer.*变量测试API网关方法?

jac*_*cus 6 velocity amazon-web-services aws-api-gateway

我有一个API网关,其POST方法直接放在DynamoDB表中.我的方法也配置为通过Lambda使用自定义授权程序.

在我的模板映射中,我正在使用一些授权变量,例如$context.authorizer.principalId$context.authorizer.accountId.简化的模板映射如下所示:

{ 
"TableName": "$stageVariables.tableName",
"Item": {
    "AccountId": {
        "S": "$context.authorizer.accountId"
        },
    "Id": {
        "S": "$context.requestId"
        },
    "Content": {
        "S": "$input.path('$.content')"
        },
    "UserId": {
        "S": "$context.authorizer.principalId"
        }
}
Run Code Online (Sandbox Code Playgroud)

}

现在,当我向部署到实际阶段的此API方法发出HTTP请求时,该请求将通过自定义授权程序并提供/填写$context.authorizer.*模板中的所有变量,如下所示:

{ 
"TableName": "MyTable",
"Item": {
    "AccountId": {
        "S": "12345"
        },
    "Id": {
        "S": "6fd5ff08-34c0-11e7-bf96-591a565835b3"
        },
    "Content": {
        "S": "my content"
        },
    "UserId": {
        "S": "userid-123456789"
        }
}
Run Code Online (Sandbox Code Playgroud)

}

通过API网关测试按钮测试API方法时,测试请求绕过自定义授权程序(这是有道理的,因为授权程序可以单独测试)并生成如下结果:

{ 
"TableName": "MyTable",
"Item": {
    "AccountId": {
        "S": ""
        },
    "Id": {
        "S": "test-invoke-request"
        },
    "Content": {
        "S": "my content"
        },
    "UserId": {
        "S": ""
        }
}
Run Code Online (Sandbox Code Playgroud)

}

以下内容现在无效,因为所有字段都针对模型进行验证,并获得以下验证错误:

Endpoint response body before transformations: {"__type":"com.amazon.coral.validate#ValidationException","message":"One or more parameter values were invalid: An AttributeValue may not contain an empty string"}
Run Code Online (Sandbox Code Playgroud)

在测试API网关方法时,有没有办法指定授权者变量?或者是否有一些聪明的方法来定义模板映射中的回退变量,以便当它解析为空时,它会回退到,例如,test-invoke-principalid就像$context.requestId开箱即用?

我想要的是仍然能够使用API​​网关测试功能,同时保持所有验证/授权器设置.

Jac*_*AWS 2

当然,我们可以考虑为测试调用功能添加占位符。当然是针对principalId。至于自定义上下文变量,这可能会更困难,我们拭目以待。我们最终也希望有一个更好的端到端测试解决方案。