Friday, March 29, 2019

Code Deploy Pre and Post Hooks in Java

The Serverless Framework blog has a nice post on how to do blue/green or canary deploys. Most of the work is done in plugins and in the serverless.yml file, but for safe automated canary deploys, you'll want to add pre and post hooks.

As you might infer from their names, the pre-hook runs before the deployment and the post-hook runs once the canary deployment is complete.

If you return a "Failure" from either hook, Code Deploy will automatically rollback your deployment.

The missing piece from the mentioned blog is writing a hook in Java. The only example is in Node.js.

I experimented for a day and now share my results. This should be enough to get you started writing AWS Code Deploy hooks in Java.

public class PreHook implements RequestHandler<Map<String, String>, PutLifecycleEventHookExecutionStatusResult> {
 @Override
 public PutLifecycleEventHookExecutionStatusResult handleRequest(Map<string, string> event, Context context) {
  String deploymentId = event.get("DeploymentId");
  String lifecycleEventHookExecutionId = event.get("LifecycleEventHookExecutionId");
  PutLifecycleEventHookExecutionStatusRequest request = new PutLifecycleEventHookExecutionStatusRequest();
  request.setDeploymentId(deploymentId);
  request.setLifecycleEventHookExecutionId(lifecycleEventHookExecutionId);

                // Do your integration tests here. If they pass, set the status to "Succeeded" otherwise "Failed"
                // I set it to "Failed" to test rollback

  request.setStatus("Failed");
  AmazonCodeDeploy codeDeploy = AmazonCodeDeployClientBuilder.defaultClient();
  return codeDeploy.putLifecycleEventHookExecutionStatus(request);
 }

Like most Java Lambdas, you extend RequestHandler and parameterize it.

The input parameter is a Map of Strings. The map contains two very important pieces of information. The DeploymentId and the LifeCycleEventHookExecutionId.

Both are required to create a PuLifecycleEventHookExecutionStatusRequest.

PuLifecycleEventHookExecutionStatusRequest is required to create the output parameter PutLifecycleEventHookExecutionStatusResult by way of a AmazonCodeDeploy object.

Hopefully the code is enough to get you started. If not, please leave a comment or come find TheDarkSavant at the Serverless forums.