我已经在micronauts/grovy中写了一个简单的lambda功能,以返回允许/拒绝策略作为AWS API网关授权者。当用作API网关授权器时,JSON无法解析
由于配置错误而导致执行失败:无法解析策略
在本地测试时,响应在JSON中具有正确的属性案例。例如:
{
"principalId": "user",
"PolicyDocument": {
"Context": {
"stringKey": "1551172564541"
},
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:eu-west-1:<account>:<ref>/*/GET/"
}
]
}}
在AWS中运行此操作时,JSON响应将所有属性都处于小写状态:
{
"principalId": "user",
"policyDocument": {
"context": {
"stringKey": "1551172664327"
},
"version": "2012-10-17",
"statement": [
{
"resource": "arn:aws:execute-api:eu-west-1:<account>:<ref>/*/GET/",
"action": "execute-api:Invoke",
"effect": "Allow"
}
]
}
}
不确定是否是问题,但我看不出还有什么问题(在输出中尝试了许多变化)。我已经尝试了各种杰克逊注释(@jsonnaming(propertyNamingStrategy.uppercamelcasestrategy.class)等),但它们似乎对AWS的输出没有影响。
有什么想法如何对此进行排序?谢谢。
示例代码:
试图使输出看起来像示例。
使用
在本地运行示例runtime "io.micronaut:micronaut-function-web"
runtime "io.micronaut:micronaut-http-server-netty"
lambda功能处理程序:
AuthResponse sessionAuth(APIGatewayProxyRequestEvent event) {
AuthResponse authResponse = new AuthResponse()
authResponse.principalId = 'user'
authResponse.policyDocument = new PolicyDocument()
authResponse.policyDocument.version = "2012-10-17"
authResponse.policyDocument.setStatement([new session.auth.Statement(
Effect: Statement.Effect.Allow,
Action:"execute-api:Invoke",
Resource: "arn:aws:execute-api:eu-west-1:<account>:<ref>/*/GET/"
)])
return authResponse
}
authresponse看起来像:
@CompileStatic
class AuthResponse {
String principalId
PolicyDocument policyDocument
}
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
@CompileStatic
class PolicyDocument {
String Version
List<Statement> Statement = []
}
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
@CompileStatic
class Statement {
String Action
String Effect
String Resource
}
看起来您不能依靠AWS lambda java serialializer如果您依靠某种注释或映射器,则不会更改JSON响应。如果您希望响应不受影响,则需要您的处理程序的原始输出流类型。
请参阅此AWS DOC处理程序输入/输出类型(Java)