in resources/custom-resources/ssm-put-param-secure/src/main/java/com/amazon/aws/partners/saasfactory/SSMPutParamSecure.java [56:174]
public Object handleRequest(Map<String, Object> input, Context context) {
LambdaLogger logger = context.getLogger();
try {
ObjectMapper mapper = new ObjectMapper();
logger.log(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(input));
logger.log("\n");
} catch (JsonProcessingException e) {
logger.log("Could not log input\n");
}
final String requestType = (String) input.get("RequestType");
Map<String, Object> resourceProperties = (Map<String, Object>) input.get("ResourceProperties");
final String ssmParameterName = (String) resourceProperties.get("Name");
final String ssmParameterValue = (String) resourceProperties.get("Value");
final boolean update = "Update".equalsIgnoreCase(requestType);
final boolean withKey = resourceProperties.containsKey("KeyId");
final boolean withDescription = resourceProperties.containsKey("Description");
final String[] stackArn = ((String) input.get("StackId")).split(":");
final String region = stackArn[3];
final String accountId = stackArn[4];
// final String stack = stackArn[5].split("/")[1];
final String ssmArn = "arn:aws:ssm:" + region + ":" + accountId + ":parameter/" + ssmParameterName;
ExecutorService service = Executors.newSingleThreadExecutor();
ObjectNode responseData = JsonNodeFactory.instance.objectNode();
try {
if (requestType == null) {
throw new RuntimeException();
}
Runnable r = () -> {
PutParameterRequest request = PutParameterRequest.builder()
.name(ssmParameterName)
.value(ssmParameterValue)
.type(ParameterType.SECURE_STRING)
.overwrite(update)
.build();
if (withKey && !withDescription) {
request = request.toBuilder()
.keyId((String) resourceProperties.get("KeyId"))
.build();
} else if (!withKey && withDescription) {
request = request.toBuilder()
.description((String) resourceProperties.get("Description"))
.build();
} else if (withKey && withDescription) {
request = request.toBuilder()
.keyId((String) resourceProperties.get("KeyId"))
.description((String) resourceProperties.get("Description"))
.build();
}
if ("Create".equalsIgnoreCase(requestType)) {
logger.log("CREATE\n");
PutParameterResponse response = ssm.putParameter(request);
Long version = response.version();
responseData.put("Parameter", ssmParameterName);
responseData.put("ARN", ssmArn);
responseData.put("Version", version);
logger.log("Adding new parameter to SSM: " + ssmArn + "\n");
sendResponse(input, context, "SUCCESS", responseData);
} else if ("Update".equalsIgnoreCase(requestType)) {
logger.log("UDPATE\n");
PutParameterResponse response = ssm.putParameter(request);
Long version = response.version();
responseData.put("Parameter", ssmParameterName);
responseData.put("ARN", ssmArn);
responseData.put("Version", version);
logger.log("Updating value of existing SSM parameter: " + ssmArn + "\n");
sendResponse(input, context, "SUCCESS", responseData);
} else if ("Delete".equalsIgnoreCase(requestType)) {
logger.log("DELETE\n");
DeleteParameterRequest deleteRequest = DeleteParameterRequest.builder()
.name(ssmParameterName)
.build();
DeleteParameterResponse response = ssm.deleteParameter(deleteRequest);
responseData.put("ARN", ssmArn);
logger.log("Deleting SSM parameter: " + ssmArn + "\n");
sendResponse(input, context, "SUCCESS", responseData);
} else {
logger.log("FAILED unknown requestType " + requestType + "\n");
responseData.put("Reason", "Unknown RequestType " + requestType);
sendResponse(input, context, "FAILED", responseData);
}
};
Future<?> f = service.submit(r);
f.get(context.getRemainingTimeInMillis() - 1000, TimeUnit.MILLISECONDS);
} catch (final TimeoutException | InterruptedException | ExecutionException e) {
// Timed out
logger.log("FAILED unexpected error or request timed out " + e.getMessage() + "\n");
// Print entire stack trace
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw, true);
e.printStackTrace(pw);
logger.log(sw.getBuffer().toString() + "\n");
responseData.put("Reason", e.getMessage());
sendResponse(input, context, "FAILED", responseData);
} finally {
service.shutdown();
}
return null;
}