List of usage examples for com.amazonaws.services.route53.model ResourceRecordSet ResourceRecordSet
public ResourceRecordSet()
From source file:br.com.ingenieux.mojo.beanstalk.cmd.dns.BindDomainsCommand.java
License:Apache License
protected void assignDomain(BindDomainsContext ctx, String record, String zoneId) { ChangeBatch changeBatch = new ChangeBatch(); changeBatch.setComment(format("Updated for env %s", ctx.getCurEnv().getCNAME())); /**/*w ww. j a v a 2 s.c o m*/ * Look for Existing Resource Record Sets */ { ResourceRecordSet resourceRecordSet = null; ListResourceRecordSetsResult listResourceRecordSets = r53 .listResourceRecordSets(new ListResourceRecordSetsRequest(zoneId)); for (ResourceRecordSet rrs : listResourceRecordSets.getResourceRecordSets()) { if (!rrs.getName().equals(record)) { continue; } boolean matchesTypes = "A".equals(rrs.getType()) || "CNAME".equals(rrs.getType()); if (!matchesTypes) { continue; } if (isInfoEnabled()) { info("Excluding resourceRecordSet %s for domain %s", rrs, record); } changeBatch.getChanges().add(new Change(ChangeAction.DELETE, rrs)); } } /** * Then Add Ours */ ResourceRecordSet resourceRecordSet = new ResourceRecordSet(); resourceRecordSet.setName(record); resourceRecordSet.setType(RRType.A); if (ctx.singleInstance) { final String address = ctx.getCurEnv().getEndpointURL(); ResourceRecord resourceRecord = new ResourceRecord(address); resourceRecordSet.setTTL(60L); resourceRecordSet.setResourceRecords(asList(resourceRecord)); if (isInfoEnabled()) { info("Adding resourceRecordSet %s for domain %s mapped to %s", resourceRecordSet, record, address); } } else { AliasTarget aliasTarget = new AliasTarget(); aliasTarget.setHostedZoneId(ctx.getElbHostedZoneId()); aliasTarget.setDNSName(ctx.getCurEnv().getEndpointURL()); resourceRecordSet.setAliasTarget(aliasTarget); if (isInfoEnabled()) { info("Adding resourceRecordSet %s for domain %s mapped to %s", resourceRecordSet, record, aliasTarget.getDNSName()); } } changeBatch.getChanges().add(new Change(ChangeAction.CREATE, resourceRecordSet)); if (isInfoEnabled()) { info("Changes to be sent: %s", changeBatch.getChanges()); } ChangeResourceRecordSetsRequest req = new ChangeResourceRecordSetsRequest(zoneId, changeBatch); r53.changeResourceRecordSets(req); }
From source file:com.carrotgarden.maven.aws.dns.CarrotRoute53.java
License:BSD License
public ResourceRecordSet makeRecordCNAME(final String source, final String target) { final Collection<ResourceRecord> resourceList = new ArrayList<ResourceRecord>(); resourceList.add(new ResourceRecord(target)); final ResourceRecordSet record = new ResourceRecordSet(); record.setName(source);/*from w w w. j a v a 2 s. co m*/ record.setTTL(60L); record.setType("CNAME"); record.setResourceRecords(resourceList); return record; }
From source file:com.msi.dns53.client.DNS53Client.java
License:Apache License
public ListResourceRecordSetsResult listResourceRecordSets(ListResourceRecordSetsRequest req) throws AmazonServiceException, AmazonClientException { Client c = Client.create();/*from w w w .j ava2 s.com*/ WebResource r = c.resource(this.serverURL); MultivaluedMap<String, String> paramMap = new MultivaluedMapImpl(); if (req.getStartRecordName() != null) { paramMap.add("name", req.getStartRecordName()); } if (req.getStartRecordType() != null) { paramMap.add("type", req.getStartRecordType()); } if (req.getStartRecordIdentifier() != null) { paramMap.add("identifier", req.getStartRecordIdentifier()); } if (req.getMaxItems() != null) { paramMap.add("maxitems", req.getMaxItems()); } ClientResponse response = r.path(req.getHostedZoneId() + "/rrset").queryParams(paramMap) .type(MediaType.APPLICATION_XML_TYPE).accept(MediaType.TEXT_XML) .header("X-Amzn-Authorization", "AWS3 AWSAccessKeyId=" + this.accessKey + "," + "Algorithm=HmacSHA256," + "SignedHeaders=Host;X-Amz-Date," + "Signature=THISISANEXAMPLESIGNATURE=") .get(ClientResponse.class); String resultXml = response.getEntity(String.class); if (response.getStatus() != 200) { exceptionMapper(response, resultXml); } ListResourceRecordSetsResponsePOJO interResult = null; try { StringReader reader = new StringReader(resultXml); JAXBContext context = JAXBContext.newInstance(ListResourceRecordSetsResponsePOJO.class); Unmarshaller unmarshaller = context.createUnmarshaller(); interResult = (ListResourceRecordSetsResponsePOJO) unmarshaller.unmarshal(reader); } catch (JAXBException e) { e.printStackTrace(); return null; } if (interResult == null) { return null; } ListResourceRecordSetsResult result = new ListResourceRecordSetsResult(); result.setMaxItems(interResult.getMaxItems()); result.setIsTruncated(interResult.isTruncated()); if (interResult.getResourceRecordSets() != null) { Collection<ResourceRecordSet> rrSets = new LinkedList<ResourceRecordSet>(); for (ResourceRecordSetPOJO p : interResult.getResourceRecordSets()) { ResourceRecordSet temp = new ResourceRecordSet(); temp.setName(p.getName()); temp.setSetIdentifier(p.getSetIdentifier()); temp.setTTL(p.getTTL()); temp.setType(p.getType()); temp.setWeight(p.getWeight()); if (p.getResourceRecords() != null) { Collection<ResourceRecord> resourceRecords = new LinkedList<ResourceRecord>(); for (ResourceRecordPOJO record : p.getResourceRecords()) { ResourceRecord newRec = new ResourceRecord(); newRec.setValue(record.getValue()); resourceRecords.add(newRec); } temp.setResourceRecords(resourceRecords); } rrSets.add(temp); } result.setResourceRecordSets(rrSets); } return result; }
From source file:com.msi.dns53.client.DNS53MetadataUtil.java
License:Apache License
public void populateServiceMetadata(final ServletConfig config, String serviceName) { logger.debug("init(): TXT record will be created for this service regarding its port and context path."); String contextPath = config.getServletContext().getContextPath(); String port = Appctx.getBean("TOMCAT_PORT"); String master_passwd = Appctx.getBean("DB_PASSWORD"); final String fqdn = (String) ConfigurationUtil.getConfiguration(Arrays.asList(new String[] { "FQDN" })); final String domain = (String) ConfigurationUtil .getConfiguration(Arrays.asList(new String[] { "FQDN_DOMAIN" })); String txtRecordValue = ":" + port + contextPath; String baseDNSServerURL = "http://localhost:" + port + "/DNS53Server/2012-02-29/"; logger.debug("Tomcat port = " + port + "; FQDN = " + fqdn + "; domain = " + domain + "; TXT Record Value = " + txtRecordValue + "; BaseDNSServerUrl = " + baseDNSServerURL); DNS53Client client = new DNS53Client(baseDNSServerURL + "hostedzone", baseDNSServerURL + "change", "admin", master_passwd);/*from www.ja v a2 s . com*/ logger.debug("Service name = " + serviceName); String recordName = serviceName + "-" + fqdn; logger.debug("TXT Record Name: " + recordName); logger.debug("init(): Calling ListHostedZones to find the target zone!"); ListHostedZonesRequest lhzReq = new ListHostedZonesRequest(); lhzReq.setMaxItems("1"); ListHostedZonesResult lhzResult = client.listHostedZones(lhzReq); HostedZone zone = null; List<HostedZone> zones = lhzResult.getHostedZones(); if (zones != null && zones.size() > 0) { for (HostedZone hz : zones) { if (hz.getName().equals(domain + ".") || hz.getName().equals(domain)) { zone = hz; } } } else { logger.error( "BaseAsyncServlet encountered an error while it was trying to find the target hosted zone."); throw ErrorResponse.InternalFailure(); } if (zone == null) { logger.error("BaseAsyncServlet could not find any zone for this TopStackWeb instance."); throw ErrorResponse.InternalFailure(); } // TODO (optional) check for the CNAME record for this service before proceeding logger.debug("init(): Creating a new TXT record for " + recordName + " with \"" + txtRecordValue + "\" as its value!"); String zoneId = zone.getId(); ChangeResourceRecordSetsRequest crrsReq = new ChangeResourceRecordSetsRequest(); crrsReq.setHostedZoneId(zoneId); ChangeBatch cb = new ChangeBatch(); cb.setComment( "BaseAsyncServlet => init(): Registering " + serviceName + " service for Transcend TopStack."); Collection<Change> changes = new LinkedList<Change>(); Change change = new Change(); change.setAction(ChangeAction.CREATE); ResourceRecordSet rrSet = new ResourceRecordSet(); rrSet.setName(recordName); rrSet.setTTL(900L); rrSet.setType(RRType.TXT); Collection<ResourceRecord> rr = new LinkedList<ResourceRecord>(); ResourceRecord record = new ResourceRecord(); record.setValue(txtRecordValue); rr.add(record); rrSet.setResourceRecords(rr); change.setResourceRecordSet(rrSet); changes.add(change); cb.setChanges(changes); crrsReq.setChangeBatch(cb); ChangeResourceRecordSetsResult result = client.changeResourceRecordSets(crrsReq); logger.debug("Result for the last ChangeResourceRecordSets request: " + result.toString()); }
From source file:com.msi.dns53.server.query.ChangeResourceRecordSets.java
License:Apache License
public ChangeResourceRecordSetsRequest unmarshall(HttpServletRequest req) throws IOException, SAXException { final ChangeResourceRecordSetsRequest request = new ChangeResourceRecordSetsRequest(); SlashObject so = new SlashObject(req.getPathInfo()); List<String> paths = so.getList(); if (paths.size() != 4) { throw DNS53Faults.InternalError(); }/* ww w . j av a 2 s.co m*/ String zoneId = paths.get(2); request.setHostedZoneId(zoneId); final ChangeBatch batch = new ChangeBatch(); StringBuilder stringBuilder = new StringBuilder(1000); Scanner scanner = new Scanner(req.getInputStream()); while (scanner.hasNextLine()) { stringBuilder.append(scanner.nextLine()); } String body = stringBuilder.toString(); logger.debug("XML Body Content: " + body); // TODO handler below parses basic syntax only; latency, weight, and alias record sets cannot be parsed at the moment DefaultHandler handler = new DefaultHandler() { private boolean changeResourceRecordSetsRequest = false; private boolean changeBatch = false; private boolean changes = false; private boolean change = false; private boolean resourceRecordSet = false; private boolean resourceRecords = false; private boolean resourceRecord = false; private CharArrayWriter contents = new CharArrayWriter(); private List<Change> cList; private Change c; ResourceRecordSet rrSet; Collection<ResourceRecord> rrs; ResourceRecord record; public void startElement(String uri, String localName, String nodeName, Attributes attributes) throws SAXException { contents.reset(); if (!uri.equals(DNS53Constants.XMLNS_VALUE)) { throw DNS53Faults.InvalidInput("The XML you provided did not have the correct namespace."); } if (nodeName.equals(DNS53Constants.CHANGERESOURCERECORDSETSREQUEST)) { changeResourceRecordSetsRequest = true; } if (nodeName.equals(DNS53Constants.CHANGEBATCH)) { changeBatch = true; } if (nodeName.equals(DNS53Constants.CHANGES)) { changes = true; cList = new LinkedList<Change>(); } if (nodeName.equals(DNS53Constants.CHANGE)) { change = true; c = new Change(); } if (nodeName.equals(DNS53Constants.RESOURCERECORDSET)) { resourceRecordSet = true; rrSet = new ResourceRecordSet(); } if (nodeName.equals(DNS53Constants.RESOURCERECORDS)) { resourceRecords = true; rrs = new LinkedList<ResourceRecord>(); } if (nodeName.equals(DNS53Constants.RESOURCERECORD)) { resourceRecord = true; record = new ResourceRecord(); } } public void endElement(String uri, String localName, String nodeName) throws SAXException { // closing xml node if (changeResourceRecordSetsRequest && localName.equals(DNS53Constants.CREATEHOSTEDZONEREQUEST)) { changeResourceRecordSetsRequest = false; } if (changeResourceRecordSetsRequest && changeBatch && localName.equals(DNS53Constants.CHANGEBATCH)) { changeBatch = false; request.setChangeBatch(batch); } if (changeResourceRecordSetsRequest && changeBatch && changes && localName.equals(DNS53Constants.CHANGES)) { changes = false; batch.setChanges(cList); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && localName.equals(DNS53Constants.CHANGE)) { change = false; cList.add(c); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && localName.equals(DNS53Constants.RESOURCERECORDSET)) { resourceRecordSet = false; c.setResourceRecordSet(rrSet); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && localName.equals(DNS53Constants.RESOURCERECORDS)) { resourceRecords = false; rrSet.setResourceRecords(rrs); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && resourceRecords && localName.equals(DNS53Constants.RESOURCERECORD)) { resourceRecord = false; rrs.add(record); } // pulling xml node value if (changeResourceRecordSetsRequest && changeBatch && localName.equals(DNS53Constants.COMMENT)) { batch.setComment(contents.toString()); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && localName.equals(DNS53Constants.ACTION)) { c.setAction(contents.toString()); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && resourceRecordSet && localName.equals(DNS53Constants.NAME)) { rrSet.setName(contents.toString()); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && resourceRecordSet && localName.equals(DNS53Constants.TYPE)) { rrSet.setType(contents.toString()); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && resourceRecordSet && localName.equals(DNS53Constants.SETIDENTIFIER)) { rrSet.setSetIdentifier(contents.toString()); } if (changeResourceRecordSetsRequest && changeBatch && changes && change && resourceRecordSet && localName.equals(DNS53Constants.TTL)) { try { rrSet.setTTL(Long.valueOf(contents.toString())); } catch (NumberFormatException e) { logger.debug("Problem parsing TTL. It must be a numeric value!"); throw DNS53Faults.InvalidArgument("TTL must be a numeric value within range."); } } if (changeResourceRecordSetsRequest && changeBatch && changes && change && resourceRecordSet && localName.equals(DNS53Constants.WEIGHT)) { try { rrSet.setWeight(Long.valueOf(contents.toString())); } catch (NumberFormatException e) { logger.debug("Problem parsing Weight. It must be a numeric value!"); throw DNS53Faults.InvalidArgument("Weight must be a numeric value within range."); } } if (changeResourceRecordSetsRequest && changeBatch && changes && change && resourceRecordSet && resourceRecords && resourceRecord && localName.equals(DNS53Constants.VALUE)) { record.setValue(contents.toString()); } } public void characters(char ch[], int start, int length) throws SAXException { this.contents.write(ch, start, length); } }; XMLReader xr = XMLReaderFactory.createXMLReader(); xr.setContentHandler(handler); xr.parse(new InputSource(new StringReader(body))); return request; }
From source file:com.msi.dns53.server.query.ListResourceRecordSets.java
License:Apache License
private ListResourceRecordSetsResult listResourceRecordSets(Session sess, ListResourceRecordSetsRequest request) throws ErrorResponse { ListResourceRecordSetsResult result = new ListResourceRecordSetsResult(); AccessMySQL sqlaccess = AccessMySQL.getInstance(); String tableName = sqlaccess.getTableName(request.getHostedZoneId(), this.getAccountId()); if (tableName.equals("FAILED")) { throw DNS53Faults.NoSuchHostedZone(request.getHostedZoneId()); }/* ww w.ja v a 2s . c o m*/ if (request.getStartRecordType() != null && request.getStartRecordName() == null) { throw DNS53Faults.InvalidInput(); } logger.debug( "Table " + tableName + " is found for hosted zone with id, " + request.getHostedZoneId() + "."); String zoneName = sqlaccess.getZoneName(request.getHostedZoneId()); logger.debug("Target hosted zone: " + zoneName); RequestHandler.checkType(request.getStartRecordType()); List<DNS53ResourceRecord> records = sqlaccess.listResourceRecords(sess, request.getHostedZoneId(), request.getStartRecordName(), null, request.getStartRecordType(), null, -1, -1); logger.debug("There are " + records.size() + " resource record sets in this hosted zone."); int maxItems = -1; if (request.getMaxItems() != null) { try { maxItems = Integer.valueOf(request.getMaxItems()); } catch (NumberFormatException e) { throw DNS53Faults.InvalidArgument("maxitems parameter must be an integer between 1 and 100."); } } if (maxItems == -1) { maxItems = 100; // default } boolean truncated = false; if (maxItems < records.size()) { truncated = true; } Collection<ResourceRecordSet> resourceRecordSets = new LinkedList<ResourceRecordSet>(); /* * ResourceRecordSet ns = new ResourceRecordSet(); ns.setName(zoneName); * ns.setType("NS"); Collection<ResourceRecord> nsRecords = new * LinkedList<ResourceRecord>(); */ int i = 0; while (i < records.size() && i < maxItems) { DNS53ResourceRecord rec = records.get(i); ResourceRecordSet temp = new ResourceRecordSet(); temp.setName(rec.getName()); temp.setType(rec.getRdtype()); temp.setTTL(Long.valueOf(rec.getTtl())); if (rec.getSid() != null) { temp.setSetIdentifier(rec.getSid()); } if (rec.getWeight() != -1) { temp.setWeight(rec.getWeight()); } Collection<ResourceRecord> resourceRecords = new LinkedList<ResourceRecord>(); resourceRecords.add(new ResourceRecord().withValue(rec.getRdata())); temp.setResourceRecords(resourceRecords); resourceRecordSets.add(temp); ++i; } // now reduce the duplicates TreeMap<String, ResourceRecordSet> map = new TreeMap<String, ResourceRecordSet>(); for (ResourceRecordSet rs : resourceRecordSets) { String key = rs.getName() + "::" + rs.getType(); ResourceRecordSet temp = map.get(key); if (temp == null) { map.put(key, rs); } else { temp.getResourceRecords().add(new ResourceRecord(rs.getResourceRecords().get(0).getValue())); } } resourceRecordSets = map.values(); result.setResourceRecordSets(resourceRecordSets); result.setIsTruncated(truncated); if (truncated) { result.setNextRecordName("UNIMPLEMENTED"); result.setNextRecordType("UNIMPLEMENTED"); } result.setMaxItems(String.valueOf(maxItems)); return result; }
From source file:com.renatodelgaudio.awsupdate.SimpleRecordService.java
License:Open Source License
@Override public boolean updateRecord(String ip) { String recordName = config.getRecordName(); ChangeResourceRecordSetsRequest changeRequest = new ChangeResourceRecordSetsRequest(); changeRequest.setHostedZoneId(config.getZoneId()); ChangeBatch batch = new ChangeBatch(); Change change = new Change(); ResourceRecordSet set = getCurrentRecordSet(); if (set != null) { if (!equalsIgnoreCase("A", set.getType())) { log.error("Record already exists but not as Type A. No actions were performed."); return false; }/*from w ww. j av a 2s . com*/ change.setAction("UPSERT"); log.info("Record [" + recordName + "] already present on AWS Route 53. Upating it.."); } else { change.setAction("CREATE"); log.info("Record [" + recordName + "] not present on AWS Route 53. Creating it.."); set = new ResourceRecordSet().withName(recordName).withType("A"); } set.setTTL(Long.parseLong(config.getTTL())); List<ResourceRecord> l = new ArrayList<ResourceRecord>(); l.add(new ResourceRecord(ip)); set.setResourceRecords(l); change.setResourceRecordSet(set); batch.withChanges(change); changeRequest.setChangeBatch(batch); log.info("Updating DNS " + recordName + " with IP " + ip); ChangeResourceRecordSetsResult result = config.getAmazonRoute53Client() .changeResourceRecordSets(changeRequest); log.info(result.toString()); return true; }
From source file:edu.umass.cs.aws.support.Route53.java
License:Apache License
private static void createRecordSetFromHostedZone() { List<ResourceRecord> records = new ArrayList<>(); ResourceRecord record = new ResourceRecord(); record.setValue("http://www.marksdevserver.com"); records.add(record);/* ww w .j a va 2s . c o m*/ ResourceRecordSet recordSet = new ResourceRecordSet(); recordSet.setName("markstest.domain.com."); recordSet.setType(RRType.CNAME); recordSet.setTTL(new Long(60)); recordSet.setResourceRecords(records); // Create the Change List<Change> changes = new ArrayList<>(); Change change = new Change(); change.setAction(ChangeAction.CREATE); change.setResourceRecordSet(recordSet); changes.add(change); // Create a batch and add the change to it ChangeBatch batch = new ChangeBatch(); batch.setChanges(changes); // Create a Request and add the batch to it. ChangeResourceRecordSetsRequest request = new ChangeResourceRecordSetsRequest(); request.setHostedZoneId(HOSTED_ZONE_ID); request.setChangeBatch(batch); // send the request ChangeResourceRecordSetsResult result = route53.changeResourceRecordSets(request); System.out.println(result.toString()); }
From source file:fr.xebia.cloud.amazon.aws.tools.AmazonAwsUtils.java
License:Apache License
public static void deleteCnameIfExist(Iterable<String> cnames, HostedZone hostedZone, AmazonRoute53 route53) { // List all//from w w w.ja va 2s . com ListResourceRecordSetsRequest listResourceRecordSetsRequest = new ListResourceRecordSetsRequest() // .withStartRecordType(RRType.CNAME) .withHostedZoneId(hostedZone.getId()); ListResourceRecordSetsResult listResourceRecordSetsResult = route53 .listResourceRecordSets(listResourceRecordSetsRequest); if (listResourceRecordSetsResult.isTruncated()) { logger.warn("truncated result"); } Function<ResourceRecordSet, String> cnameExtractor = new Function<ResourceRecordSet, String>() { @Override public String apply(@Nullable ResourceRecordSet resourceRecordSet) { if (resourceRecordSet == null) { return null; } if (!RRType.CNAME.equals(RRType.fromValue(resourceRecordSet.getType()))) { return null; } return resourceRecordSet.getName(); } }; Iterable<ResourceRecordSet> existingCnamesAsResourceRecordSet = Iterables .filter(listResourceRecordSetsResult.getResourceRecordSets(), new Predicate<ResourceRecordSet>() { @Override public boolean apply(@Nullable ResourceRecordSet resourceRecordSet) { return RRType.CNAME.equals(RRType.fromValue(resourceRecordSet.getType())); } }); final ImmutableMap<String, ResourceRecordSet> existingCnames = Maps .uniqueIndex(existingCnamesAsResourceRecordSet, cnameExtractor); Sets.SetView<String> cnamesToDelete = Sets.intersection(Sets.newHashSet(cnames), existingCnames.keySet()); Function<String, Change> cnameToDeleteCnameChange = new Function<String, Change>() { @Override public Change apply(@Nullable String cname) { ResourceRecordSet existingResourceRecordSet = existingCnames.get(cname); return new Change().withAction(ChangeAction.DELETE) .withResourceRecordSet(new ResourceRecordSet().withType(RRType.CNAME).withName(cname) .withTTL(existingResourceRecordSet.getTTL()) .withResourceRecords(existingResourceRecordSet.getResourceRecords())); } }; List<Change> changes = Lists.newArrayList(Iterables.transform(cnamesToDelete, cnameToDeleteCnameChange)); if (changes.isEmpty()) { logger.debug("No CNAME to delete"); return; } logger.info("Delete CNAME changes {}", changes); ChangeResourceRecordSetsRequest changeResourceRecordSetsRequest = new ChangeResourceRecordSetsRequest() .withHostedZoneId(hostedZone.getId()).withChangeBatch(new ChangeBatch().withChanges(changes)); route53.changeResourceRecordSets(changeResourceRecordSetsRequest); }
From source file:fr.xebia.cloud.amazon.aws.tools.AmazonAwsUtils.java
License:Apache License
public static void createCnamesForInstances(Map<String, Instance> cnameToInstances, HostedZone hostedZone, AmazonRoute53 route53) {//from w w w. ja v a2 s. c o m Function<Map.Entry<String, Instance>, Change> cnameAndInstanceToChange = new Function<Map.Entry<String, Instance>, Change>() { @Override public Change apply(@Nullable Map.Entry<String, Instance> entry) { String cname = entry.getKey(); Instance instance = entry.getValue(); return new Change().withAction(ChangeAction.CREATE).withResourceRecordSet( new ResourceRecordSet().withType(RRType.CNAME).withName(cname).withTTL(300L) .withResourceRecords(new ResourceRecord(instance.getPublicDnsName()))); } }; List<Change> changes = Lists .newArrayList(Iterables.transform(cnameToInstances.entrySet(), cnameAndInstanceToChange)); logger.debug("Create CNAME {}", changes); ChangeResourceRecordSetsRequest changeResourceRecordSetsRequest = new ChangeResourceRecordSetsRequest() .withHostedZoneId(hostedZone.getId()).withChangeBatch(new ChangeBatch().withChanges(changes)); route53.changeResourceRecordSets(changeResourceRecordSetsRequest); }