我正在使用aws-serverless-java-container将Jersey服务包装在AWS Lambda中。我决定使用函数别名进行“测试”和“生产”阶段,最终指向不同版本的lambda函数。
我需要基于该别名在.properties文件中选择一些属性,基本上是因为我需要与“测试”或“产品”数据库进行对话,或者使用其他终结点来调用外部Web服务。
为此,我需要调用Context object的getInvokedFunctionArn方法。不幸的是,默认情况下,Jersey资源不知道此类上下文。
在示例资源下面:
@Path("/pet")
public class PetResource {
@POST
@Path("/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.WILDCARD)
public Response createPet() {
// how to call getInvokedFunctionArn from Lambda context object?
return Response.status(200).entity("{'result': 'success'}").build();
}
}
如何使Jersey资源具有调用的ARN?我可以注射吗?
lambda处理程序定义为:
public class PetLambdaHandler implements RequestStreamHandler {
private static final ResourceConfig jerseyApplication = new ResourceConfig().register(PetResource.class)
.register(JacksonFeature.class);
private static final JerseyLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler = JerseyLambdaContainerHandler
.getAwsProxyHandler(jerseyApplication);
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
handler.proxyStream(inputStream, outputStream, context);
}
}
答案 0 :(得分:1)
您不能自动注入Lambda上下文。但是,您可以从ContainerRequestContext
对象中检索它。 serverless-java-container
框架将其添加为a request property。
您可能可以执行以下操作(尚未测试代码):
@GET
public String testLambdaContext(@Context ContainerRequestContext containerRequest) {
Context lambdaContext =
(Context) containerRequest.getProperty(RequestReader.LAMBDA_CONTEXT_PROPERTY);
return lambdaContext.getInvokedFunctionArn()
}
答案 1 :(得分:0)
您可以使用Spring profile
向球衣资源注入上下文为测试和产品简介定义不同的方法/对象
如果没有Spring,则可以选中jersey integration
jersey-spring4模块将充当Spring和Jersey的集成桥。
在github aws-serverless-java-container库中查看完整示例,该库运行带有AWS Lambda中的配置文件的Spring应用程序
有两种方法可以激活Spring Profiles(由@Profile注释定义)。我们建议使用接收配置文件列表的静态初始化程序。无服务器Java容器框架负责设置配置文件并立即初始化应用程序。
public class StreamLambdaHandler implements RequestStreamHandler { private static SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler; static { try { AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); applicationContext.register(PetStoreSpringAppConfig.class); handler = SpringLambdaContainerHandler.getAwsProxyHandler(applicationContext, "profile-1", "profile-2");