Forgive the noob question, but why is it necessary to have a custom runtime when using a binary from a compiled language? It seems to me that golang support should just mean binary support, and then c++ and rust would be able to comply already, no?

As of yesterday, lambda only provided a way to specify a function handler. The input to that function, and the response value from that function, needs to be deserialized and serialized (and implicitly, construct a runtime in which the concept of a function exists). Previously, a runtime for each supported language handled deserializing the wire protocol into a runtime object, invoking the specified function, routing stdout and stderr to cloudwatch, serializing the function's return value, and transforming runtime exceptions into response exceptions.

The lambda team is now letting you write that runtime, and presumably providing more documentation on the responsibilities of the runtime.

Check out the example C++ and Rust runtimes to understand why each language needed to have it's own custom runtime.

https://github.com/awslabs/aws-lambda-cpp

https://github.com/awslabs/aws-lambda-rust-runtime