繁体   English   中英

从 Spring 云访问 AWS Lambda 上下文 Function

[英]Accessing AWS Lambda Context from Spring Cloud Function

我正在使用 Spring Cloud Function 1.0.0.RELEASE 和相应的 AWS 适配器在 AWS lambda 中运行它。有没有办法从 Spring 应用程序上下文中检索 lambda function 上下文?

我知道如果你自己实现 RequestHandler 接口,那么你会得到 Context object 作为 handleRequest 方法的第二个参数(见下文),但是由于 SpringBootRequestHandler 正在处理这个,我不清楚如何访问 Context object。任何想法?

直接实现 RequestHandler 的例子

public class LambdaRequestHandler implements RequestHandler<String, String> {

    public String handleRequest(String input, Context context) {
        context.getLogger().log("Input: " + input);
        return "Hello World - " + input;
    }
}

将 RequestHandler 的实现推迟到 SpringBootRequestHandler

public class SomeFunctionHandler 
      extends SpringBootRequestHandler<SomeRequest, SomeResponse> {
}

SomeFunctionHandler扩展了SpringBootRequestHandler ,因此它可以覆盖handleRequest方法以获得对AWS lambda Context对象的访问。

public class SomeFunctionHandler extends SpringBootRequestHandler<SomeRequest, SomeResponse> {

    private static final Logger logger = LoggerFactory.getLogger(SomeFunctionHandler.class);

    @Override
    public Object handleRequest(SomeRequest event, Context context) {
        logger.info("ARN=" + context.getInvokedFunctionArn());
        return super.handleRequest(event, context);
    }

}

如果您仅使用spring-cloud-function-adapter-aws ,@ @Autowired可能不起作用。

但是,您可以使用org.springframework.messaging.Message包装您的输入。

public class FooHandler implements Function<Message<DynamodbEvent>, String> {

  @Override
  public String apply(Message<DynamodbEvent> message) {
    // Get AWS Lambda Context
    Context context = message.getHeaders().get("aws-context", Context.class);
    assert context != null;
    
    // Get the original input
    DynamodbEvent payload = message.getPayload();
    return payload.toString();
  }
}

来源:

如果您将Function作为 bean 公开,您可以简单地自动Autowire Context对象。

例子:


    @Autowired
    private Context context;

    @Bean
    public Function<String, String> uppercase() {
        logger.info("ARN=" + context.getInvokedFunctionArn());
        return value -> {
            if (value.equals("exception")) {
                throw new RuntimeException("Intentional exception which should result in HTTP 417");
            }
            else {
                return value.toUpperCase();
            }
        };
    }

来源:这个答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM