paketo-buildpacks / java-native-image

A Cloud Native Buildpack with an order definition suitable for Java native image applications
Apache License 2.0
28 stars 3 forks source link

Spring Native Zip File Support for AWS Lambda #108

Open shresthaujjwal opened 3 years ago

shresthaujjwal commented 3 years ago

What happened?

Deploy Spring Native Zip to AWS Lambda in zip format. https://github.com/spring-projects-experimental/spring-native/blob/main/samples/cloud-function-aws/pom.xml#L58-L81

Checklist

dmikusa commented 3 years ago

This is an interesting request and if there's something we can do to make deploying to AWS easier, I'd support it. Again, I would appreciate it if you could share some more details though.

A few questions/thoughts...

Deploy Spring Native Zip to AWS Lambda in zip format. https://github.com/spring-projects-experimental/spring-native/blob/main/samples/cloud-function-aws/pom.xml#L58-L81

So long as this only needs configuration in your Maven pom.xml file, you should be able to do this now. I suspect what will happen though is that you'll end up with is a container inside of which is the zip file. Is that what you're seeing at the moment?

Currently it is only possible to generate native image in docker.

Correct. This isn't specific to the Java Native Image buildpack. It is the primary goal of the buildpacks project, to take source code and transform that into container images.

You could try to extract files from the generated container images, but that's outside the scope of buildpacks. You'd need to look at Docker and any other tools that would let you pull files out of a container image.

I haven't used AWS Lambdas myself, is there a way you can deploy your code as a container image? If so and there are docs you could link me to, I'd be happy to take a look.

shresthaujjwal commented 3 years ago

So long as this only needs configuration in your Maven pom.xml file, you should be able to do this now. I suspect what will happen though is that you'll end up with is a container inside of which is the zip file. Is that what you're seeing at the moment?

This is not possible (I think) as this step has to happen at the end after the native image has been generated. Basically, we have to take the native image which is part of OCI image and zip it up or create a shaded jar

You could try to extract files from the generated container images, but that's outside the scope of buildpacks. You'd need to look at Docker and any other tools that would let you pull files out of a container image.

Yes, we will probably have to do some extra scripting to extract that image and zip it up. Tying to see if we can automate this step as well. So that it would be easier to deploy to AWS Lambda.

I haven't used AWS Lambdas myself, is there a way you can deploy your code as a container image?

Yes, AWS Lambda does support Docker, but i was trying to see if i can deploy it without Docker. It would be great to have support for Functions. https://spring.io/projects/spring-cloud-function. So that we just upload jar/zip to AWS functions with handler. https://github.com/spring-cloud/spring-cloud-function/blob/master/spring-cloud-function-samples

shresthaujjwal commented 3 years ago

@dmikusa-pivotal just checking to see if you have any questions on this

dmikusa commented 3 years ago

Yes, we will probably have to do some extra scripting to extract that image and zip it up. Tying to see if we can automate this step as well. So that it would be easier to deploy to AWS Lambda.

I don't want to say it'll never happen, but the goal of buildpacks is to produce an image so the extraction work, at least for the foreseeable future is something you'll need to handle. If it's helpful, I could see the buildpack zipping up the resulting native image, possibly an env variable flag you set to instruct it to zip up the resulting image. Is there a particular format for the zip? or is it just a zip with the single binary?

Yes, AWS Lambda does support Docker, but i was trying to see if i can deploy it without Docker. It would be great to have support for Functions. https://spring.io/projects/spring-cloud-function. So that we just upload jar/zip to AWS functions with handler.

I would like to look at this more but haven't had the time. Apologizes. I suspect this is probably the preferred integration path for the two services, given that the stated goal of buildpacks is to produce an image. Plus really small images, like if you're building with the tiny builder do not add much in the way of overhead, maybe 10-15M. There are probably ways to strip that down as well, given some exploration and investigation.

tl;dr - I can't promise anything soon on this, but I would like to keep this open as a potential improvement.

dmikusa commented 3 years ago

FYI, a colleague of mine put together this simple extraction process in Maven, which is convenient.

https://github.com/making/hello-native-world/blob/main/pom.xml#L104-L138

He's using it for Azure Functions, but I think AWS Lambda is probably going to be very similar. Hope that helps!

shresthaujjwal commented 3 years ago

This is great. I will test it out and share my findings

Richardmbs12 commented 3 years ago

It would be very very valuable to be able to generate a native image that's compatible to run on lambda (using aws's base image)

dmikusa commented 3 years ago

It would be very very valuable to be able to generate a native image that's compatible to run on lambda (using aws's base image)

@Richardmbs12 We can certainly explore doing this. Can you expand on this idea? What specifically would you like it to do that you can't do now? Do you have any docs you can reference for AWS regarding their base image? Thanks