Проблема вывода JSON Micronauts AWS API Gateway Authorizer

Я написал простую лямбда-функцию в Micronauts/Groovy для возврата политик Allow/Deny в качестве авторизатора шлюза API AWS. При использовании в качестве авторизатора шлюза 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"

Обработчик лямбда-функции:

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
}

0 ответов

Похоже, вы не можете полагаться на лямбда-Java-сериализатор AWS, чтобы не изменять свой ответ JSON, если вы полагаетесь на какие-то аннотации или отображение. Если вы хотите, чтобы ответ был нетронутым, вам понадобится обработчик необработанного потока вывода.

Посмотрите конец этого AWS doc Обработчик типов ввода / вывода (Java)

Другие вопросы по тегам