/* * Copyright 2016 by PrimeCloud Controller/OSS Community. * * This file is part of PrimeCloud Controller(TM). * * PrimeCloud Controller(TM) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * PrimeCloud Controller(TM) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PrimeCloud Controller(TM). If not, see <http://www.gnu.org/licenses/>. */ package jp.primecloud.auto.process.aws; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import jp.primecloud.auto.common.status.InstanceStatus; import jp.primecloud.auto.common.status.LoadBalancerInstanceStatus; import jp.primecloud.auto.common.status.LoadBalancerListenerStatus; import jp.primecloud.auto.entity.crud.AwsInstance; import jp.primecloud.auto.entity.crud.AwsLoadBalancer; import jp.primecloud.auto.entity.crud.AwsSslKey; import jp.primecloud.auto.entity.crud.Instance; import jp.primecloud.auto.entity.crud.LoadBalancer; import jp.primecloud.auto.entity.crud.LoadBalancerHealthCheck; import jp.primecloud.auto.entity.crud.LoadBalancerInstance; import jp.primecloud.auto.entity.crud.LoadBalancerListener; import jp.primecloud.auto.process.DnsProcessClient; import jp.primecloud.auto.process.DnsProcessClientFactory; import jp.primecloud.auto.process.ProcessLogger; import jp.primecloud.auto.service.ServiceSupport; import jp.primecloud.auto.util.MessageUtils; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import com.amazonaws.services.ec2.model.AvailabilityZone; import com.amazonaws.services.ec2.model.SecurityGroup; import com.amazonaws.services.ec2.model.Subnet; import com.amazonaws.services.elasticloadbalancing.model.ApplySecurityGroupsToLoadBalancerRequest; import com.amazonaws.services.elasticloadbalancing.model.ConfigureHealthCheckRequest; import com.amazonaws.services.elasticloadbalancing.model.CreateLoadBalancerListenersRequest; import com.amazonaws.services.elasticloadbalancing.model.CreateLoadBalancerRequest; import com.amazonaws.services.elasticloadbalancing.model.CreateLoadBalancerResult; import com.amazonaws.services.elasticloadbalancing.model.CrossZoneLoadBalancing; import com.amazonaws.services.elasticloadbalancing.model.DeleteLoadBalancerListenersRequest; import com.amazonaws.services.elasticloadbalancing.model.DeleteLoadBalancerRequest; import com.amazonaws.services.elasticloadbalancing.model.DeregisterInstancesFromLoadBalancerRequest; import com.amazonaws.services.elasticloadbalancing.model.HealthCheck; import com.amazonaws.services.elasticloadbalancing.model.Listener; import com.amazonaws.services.elasticloadbalancing.model.LoadBalancerAttributes; import com.amazonaws.services.elasticloadbalancing.model.LoadBalancerDescription; import com.amazonaws.services.elasticloadbalancing.model.ModifyLoadBalancerAttributesRequest; import com.amazonaws.services.elasticloadbalancing.model.RegisterInstancesWithLoadBalancerRequest; /** * <p> * TODO: クラスコメント * </p> * */ public class AwsLoadBalancerProcess extends ServiceSupport { protected AwsCommonProcess awsCommonProcess; protected DnsProcessClientFactory dnsProcessClientFactory; protected ProcessLogger processLogger; public void start(AwsProcessClient awsProcessClient, Long loadBalancerNo) { LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200101", loadBalancerNo, loadBalancer.getLoadBalancerName())); } // ロードバランサの作成 createLoadBalancer(awsProcessClient, loadBalancerNo); // DNSサーバへの追加 addDns(loadBalancerNo); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200102", loadBalancerNo, loadBalancer.getLoadBalancerName())); } } public void stop(AwsProcessClient awsProcessClient, Long loadBalancerNo) { LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200103", loadBalancerNo, loadBalancer.getLoadBalancerName())); } // DNSサーバからの削除 deleteDns(loadBalancerNo); // ロードバランサの削除 deleteLoadBalancer(awsProcessClient, loadBalancerNo); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200104", loadBalancerNo, loadBalancer.getLoadBalancerName())); } } public void configure(AwsProcessClient awsProcessClient, Long loadBalancerNo) { LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200105", loadBalancerNo, loadBalancer.getLoadBalancerName())); } // リスナーの設定 try { configureListeners(awsProcessClient, loadBalancerNo); } catch (RuntimeException e) { // ロードバランサが無効な場合は例外を握りつぶす if (BooleanUtils.isTrue(loadBalancer.getEnabled())) { throw e; } } // ヘルスチェックの設定 try { configureHealthCheck(awsProcessClient, loadBalancerNo); } catch (RuntimeException e) { // ロードバランサが無効な場合は例外を握りつぶす if (BooleanUtils.isTrue(loadBalancer.getEnabled())) { throw e; } } // セキュリティグループの設定 try { applySecurityGroups(awsProcessClient, loadBalancerNo); } catch (RuntimeException e) { // ロードバランサが無効な場合は例外を握りつぶす if (BooleanUtils.isTrue(loadBalancer.getEnabled())) { throw e; } } // インスタンスの振り分け設定 try { configureInstances(awsProcessClient, loadBalancerNo); } catch (RuntimeException e) { // ロードバランサが無効な場合は例外を握りつぶす if (BooleanUtils.isTrue(loadBalancer.getEnabled())) { throw e; } } if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200106", loadBalancerNo, loadBalancer.getLoadBalancerName())); } } public String createLoadBalancer(AwsProcessClient awsProcessClient, Long loadBalancerNo) { AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); // ロードバランサ作成情報 CreateLoadBalancerRequest request = new CreateLoadBalancerRequest(); request.withLoadBalancerName(awsLoadBalancer.getName()); // ダミーのリスナー Listener listener = new Listener(); listener.withProtocol("TCP"); listener.withLoadBalancerPort(65535); listener.withInstancePort(65535); request.withListeners(listener); // 非PVCの場合 if (BooleanUtils.isNotTrue(awsProcessClient.getPlatformAws().getVpc())) { // AvailabilityZones List<AvailabilityZone> availabilityZones = awsCommonProcess.describeAvailabilityZones(awsProcessClient); for (AvailabilityZone availabilityZone : availabilityZones) { request.withAvailabilityZones(availabilityZone.getZoneName()); } } // VPCの場合 else { // Subnet List<Subnet> subnets = awsCommonProcess.describeSubnetsByVpcId(awsProcessClient, awsProcessClient .getPlatformAws().getVpcId()); if (StringUtils.isNotEmpty(awsLoadBalancer.getSubnetId())) { for (String subnetId : StringUtils.split(awsLoadBalancer.getSubnetId(), ",")) { subnetId = subnetId.trim(); for (Subnet subnet : subnets) { if (StringUtils.equals(subnetId, subnet.getSubnetId())) { request.withSubnets(subnetId); break; } } } } else { // Subnetが指定されていない場合、全てのAvailabilityZoneのSubnetを設定する Map<String, String> subnetIdMap = new LinkedHashMap<String, String>(); for (Subnet subnet : subnets) { if (BooleanUtils.isTrue(subnet.getDefaultForAz())) { subnetIdMap.put(subnet.getAvailabilityZone(), subnet.getSubnetId()); continue; } if (!subnetIdMap.containsKey(subnet.getAvailabilityZone())) { subnetIdMap.put(subnet.getAvailabilityZone(), subnet.getSubnetId()); } } request.withSubnets(subnetIdMap.values()); } // SecurytiGroup List<SecurityGroup> securityGroups = awsCommonProcess.describeSecurityGroupsByVpcId(awsProcessClient, awsProcessClient.getPlatformAws().getVpcId()); for (String groupName : StringUtils.split(awsLoadBalancer.getSecurityGroups(), ",")) { groupName = groupName.trim(); for (SecurityGroup securityGroup : securityGroups) { if (StringUtils.equals(groupName, securityGroup.getGroupName())) { request.withSecurityGroups(securityGroup.getGroupId()); break; } } } // Internal if (BooleanUtils.isTrue(awsLoadBalancer.getInternal())) { request.withScheme("internal"); } } // ロードバランサの作成 CreateLoadBalancerResult result = awsProcessClient.getElbClient().createLoadBalancer(request); String dnsName = result.getDNSName(); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200111", awsLoadBalancer.getName())); } // イベントログ出力 processLogger.debug(null, null, "AwsElbCreate", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName() }); // ダミーのリスナーの削除 DeleteLoadBalancerListenersRequest request2 = new DeleteLoadBalancerListenersRequest(); request2.withLoadBalancerName(awsLoadBalancer.getName()); request2.withLoadBalancerPorts(65535); awsProcessClient.getElbClient().deleteLoadBalancerListeners(request2); // クロスゾーン負荷分散を有効化 ModifyLoadBalancerAttributesRequest request3 = new ModifyLoadBalancerAttributesRequest(); request3.withLoadBalancerName(awsLoadBalancer.getName()); request3.withLoadBalancerAttributes(new LoadBalancerAttributes() .withCrossZoneLoadBalancing(new CrossZoneLoadBalancing().withEnabled(true))); awsProcessClient.getElbClient().modifyLoadBalancerAttributes(request3); // イベントログ出力 processLogger.debug(null, null, "AwsCrossZoneEnabled", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName() }); // データベース更新 awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); awsLoadBalancer.setDnsName(dnsName); awsLoadBalancerDao.update(awsLoadBalancer); return dnsName; } public void deleteLoadBalancer(AwsProcessClient awsProcessClient, Long loadBalancerNo) { AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); // ロードバランサの削除 DeleteLoadBalancerRequest request = new DeleteLoadBalancerRequest(); request.withLoadBalancerName(awsLoadBalancer.getName()); awsProcessClient.getElbClient().deleteLoadBalancer(request); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200112", awsLoadBalancer.getName())); } // イベントログ出力 processLogger.debug(null, null, "AwsElbDelete", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName() }); // データベース更新 awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); awsLoadBalancer.setDnsName(null); awsLoadBalancerDao.update(awsLoadBalancer); } public void configureListeners(AwsProcessClient awsProcessClient, Long loadBalancerNo) { List<LoadBalancerListener> listeners = loadBalancerListenerDao.readByLoadBalancerNo(loadBalancerNo); // リスナーの起動・停止処理 for (LoadBalancerListener listener : listeners) { LoadBalancerListenerStatus status = LoadBalancerListenerStatus.fromStatus(listener.getStatus()); if (BooleanUtils.isTrue(listener.getEnabled())) { if (status == LoadBalancerListenerStatus.STOPPED) { // 有効で停止しているリスナーは処理対象 startListener(awsProcessClient, loadBalancerNo, listener.getLoadBalancerPort()); } else if (status == LoadBalancerListenerStatus.RUNNING) { // 有効で起動しているリスナーの場合、処理を行わずにフラグを変更する if (BooleanUtils.isTrue(listener.getConfigure())) { listener.setConfigure(false); loadBalancerListenerDao.update(listener); } } } else { if (status == LoadBalancerListenerStatus.RUNNING || status == LoadBalancerListenerStatus.WARNING) { // 無効で起動または異常なリスナーは処理対象 stopListener(awsProcessClient, loadBalancerNo, listener.getLoadBalancerPort()); } else if (status == LoadBalancerListenerStatus.STOPPED) { // 無効で停止しているリスナーの場合、処理を行わずにフラグを変更する if (BooleanUtils.isTrue(listener.getConfigure())) { listener.setConfigure(false); loadBalancerListenerDao.update(listener); } } } } } public void startListener(AwsProcessClient awsProcessClient, Long loadBalancerNo, Integer loadBalancerPort) { AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); LoadBalancerListener listener = loadBalancerListenerDao.read(loadBalancerNo, loadBalancerPort); try { // リスナー作成情報 CreateLoadBalancerListenersRequest request = new CreateLoadBalancerListenersRequest(); request.withLoadBalancerName(awsLoadBalancer.getName()); Listener listener2 = new Listener(); listener2.withProtocol(listener.getProtocol()); listener2.withLoadBalancerPort(listener.getLoadBalancerPort()); listener2.withInstancePort(listener.getServicePort()); if (listener.getSslKeyNo() != null) { AwsSslKey awsSslKey = awsSslKeyDao.read(listener.getSslKeyNo()); listener2.withSSLCertificateId(awsSslKey.getSslcertificateid()); } request.withListeners(listener2); // リスナーの作成 awsProcessClient.getElbClient().createLoadBalancerListeners(request); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200121", awsLoadBalancer.getName(), listener.getLoadBalancerPort())); } // イベントログ出力 processLogger.debug(null, null, "AwsElbListenerCreate", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName(), listener.getLoadBalancerPort() }); } catch (RuntimeException e) { // ステータスを更新 listener = loadBalancerListenerDao.read(loadBalancerNo, loadBalancerPort); listener.setStatus(LoadBalancerListenerStatus.WARNING.toString()); loadBalancerListenerDao.update(listener); throw e; } // ステータスを更新 listener = loadBalancerListenerDao.read(loadBalancerNo, loadBalancerPort); listener.setStatus(LoadBalancerListenerStatus.RUNNING.toString()); listener.setConfigure(false); loadBalancerListenerDao.update(listener); } public void stopListener(AwsProcessClient awsProcessClient, Long loadBalancerNo, Integer loadBalancerPort) { AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); LoadBalancerListener listener = loadBalancerListenerDao.read(loadBalancerNo, loadBalancerPort); try { // リスナーの削除 DeleteLoadBalancerListenersRequest request = new DeleteLoadBalancerListenersRequest(); request.withLoadBalancerName(awsLoadBalancer.getName()); request.withLoadBalancerPorts(listener.getLoadBalancerPort()); awsProcessClient.getElbClient().deleteLoadBalancerListeners(request); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200122", awsLoadBalancer.getName(), listener.getLoadBalancerPort())); } // イベントログ出力 processLogger.debug(null, null, "AwsElbListenerDelete", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName(), listener.getLoadBalancerPort() }); } catch (RuntimeException e) { log.warn(e.getMessage()); } // ステータスを更新 listener = loadBalancerListenerDao.read(loadBalancerNo, loadBalancerPort); listener.setStatus(LoadBalancerListenerStatus.STOPPED.toString()); listener.setConfigure(false); loadBalancerListenerDao.update(listener); } public void configureHealthCheck(AwsProcessClient awsProcessClient, Long loadBalancerNo) { LoadBalancerHealthCheck healthCheck = loadBalancerHealthCheckDao.read(loadBalancerNo); // ヘルスチェック情報がない場合はスキップ if (healthCheck == null) { return; } AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); // ヘルスチェック設定を作成 HealthCheck healthCheck2 = new HealthCheck(); String target = healthCheck.getCheckProtocol() + ":" + healthCheck.getCheckPort(); if (StringUtils.isNotEmpty(healthCheck.getCheckPath())) { if (healthCheck.getCheckPath().charAt(0) != '/') { target = target + "/"; } target = target + healthCheck.getCheckPath(); } healthCheck2.withTarget(target); healthCheck2.withTimeout(healthCheck.getCheckTimeout()); healthCheck2.withInterval(healthCheck.getCheckInterval()); healthCheck2.withHealthyThreshold(healthCheck.getHealthyThreshold()); healthCheck2.withUnhealthyThreshold(healthCheck.getUnhealthyThreshold()); // ヘルスチェック設定に変更がない場合はスキップ LoadBalancerDescription description = awsCommonProcess.describeLoadBalancer(awsProcessClient, awsLoadBalancer.getName()); HealthCheck healthCheck3 = description.getHealthCheck(); if (StringUtils.equals(healthCheck2.getTarget(), healthCheck3.getTarget()) && ObjectUtils.equals(healthCheck2.getTimeout(), healthCheck3.getTimeout()) && ObjectUtils.equals(healthCheck2.getInterval(), healthCheck3.getInterval()) && ObjectUtils.equals(healthCheck2.getHealthyThreshold(), healthCheck3.getHealthyThreshold()) && ObjectUtils.equals(healthCheck2.getUnhealthyThreshold(), healthCheck3.getUnhealthyThreshold())) { return; } // ヘルスチェック設定を変更 ConfigureHealthCheckRequest request = new ConfigureHealthCheckRequest(); request.withLoadBalancerName(awsLoadBalancer.getName()); request.withHealthCheck(healthCheck2); awsProcessClient.getElbClient().configureHealthCheck(request); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200131", awsLoadBalancer.getName())); } // イベントログ出力 processLogger.debug(null, null, "AwsElbHealthCheckConfig", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName() }); } public void applySecurityGroups(AwsProcessClient awsProcessClient, Long loadBalancerNo) { // 非VPCの場合はスキップ if (BooleanUtils.isNotTrue(awsProcessClient.getPlatformAws().getVpc())) { return; } AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); // 現在設定されているSecurityGroup LoadBalancerDescription description = awsCommonProcess.describeLoadBalancer(awsProcessClient, awsLoadBalancer.getName()); List<String> groupIds = description.getSecurityGroups(); // 新しく設定するSecurityGroup List<String> newGroupIds = new ArrayList<String>(); List<SecurityGroup> securityGroups = awsCommonProcess.describeSecurityGroupsByVpcId(awsProcessClient, awsProcessClient.getPlatformAws().getVpcId()); for (String groupName : StringUtils.split(awsLoadBalancer.getSecurityGroups(), ",")) { groupName = groupName.trim(); for (SecurityGroup securityGroup : securityGroups) { if (StringUtils.equals(groupName, securityGroup.getGroupName())) { newGroupIds.add(securityGroup.getGroupId()); break; } } } // SecurityGroupに変更がない場合はスキップ if (groupIds.size() == newGroupIds.size() && groupIds.containsAll(newGroupIds)) { return; } // セキュリティグループを変更 ApplySecurityGroupsToLoadBalancerRequest request = new ApplySecurityGroupsToLoadBalancerRequest(); request.withLoadBalancerName(awsLoadBalancer.getName()); request.withSecurityGroups(newGroupIds); awsProcessClient.getElbClient().applySecurityGroupsToLoadBalancer(request); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200225", awsLoadBalancer.getName())); } // イベントログ出力 processLogger.debug(null, null, "AwsElbSecurityGroupsConfig", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName() }); } public void configureInstances(AwsProcessClient awsProcessClient, Long loadBalancerNo) { List<LoadBalancerInstance> loadBalancerInstances = loadBalancerInstanceDao.readByLoadBalancerNo(loadBalancerNo); // 振り分け設定するインスタンスがない場合はスキップ if (loadBalancerInstances.isEmpty()) { return; } LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo); // 振り分けを登録・解除するインスタンスを仕分けする List<Long> enabledInstanceNos = new ArrayList<Long>(); List<Long> disabledInstanceNos = new ArrayList<Long>(); for (LoadBalancerInstance loadBalancerInstance : loadBalancerInstances) { Long instanceNo = loadBalancerInstance.getInstanceNo(); // ロードバランサが無効の場合は振り分けを解除する if (BooleanUtils.isNotTrue(loadBalancer.getEnabled())) { disabledInstanceNos.add(instanceNo); continue; } // インスタンスが無効の場合は振り分けを解除する Instance instance = instanceDao.read(instanceNo); if (BooleanUtils.isNotTrue(instance.getEnabled())) { disabledInstanceNos.add(instanceNo); continue; } if (BooleanUtils.isTrue(loadBalancerInstance.getEnabled())) { enabledInstanceNos.add(instanceNo); } else { disabledInstanceNos.add(instanceNo); } } // 振り分けを登録する registerInstances(awsProcessClient, loadBalancerNo, enabledInstanceNos); // 振り分けを解除する unregisterInstances(awsProcessClient, loadBalancerNo, disabledInstanceNos); } public void registerInstances(AwsProcessClient awsProcessClient, Long loadBalancerNo, List<Long> instanceNos) { if (instanceNos.isEmpty()) { // 振り分け登録するインスタンスがない場合はスキップ return; } // 振り分けされていないインスタンス番号を抽出 { List<Long> tmpInstanceNos = new ArrayList<Long>(); List<LoadBalancerInstance> loadBalancerInstances = loadBalancerInstanceDao .readByLoadBalancerNo(loadBalancerNo); for (LoadBalancerInstance loadBalancerInstance : loadBalancerInstances) { if (instanceNos.contains(loadBalancerInstance.getInstanceNo())) { LoadBalancerInstanceStatus status = LoadBalancerInstanceStatus.fromStatus(loadBalancerInstance .getStatus()); if (status == LoadBalancerInstanceStatus.STOPPED) { tmpInstanceNos.add(loadBalancerInstance.getInstanceNo()); } } } instanceNos = tmpInstanceNos; } if (instanceNos.isEmpty()) { // 振り分けされていないインスタンスがない場合はスキップ return; } // 起動しているインスタンス番号を抽出 { List<Long> tmpInstanceNos = new ArrayList<Long>(); List<Instance> instances = instanceDao.readInInstanceNos(instanceNos); for (Instance instance : instances) { InstanceStatus status = InstanceStatus.fromStatus(instance.getStatus()); if (status == InstanceStatus.RUNNING) { tmpInstanceNos.add(instance.getInstanceNo()); } } instanceNos = tmpInstanceNos; } if (instanceNos.isEmpty()) { // 起動しているインスタンスがない場合はスキップ return; } // インスタンスIDを取得 List<String> instanceIds = new ArrayList<String>(); { List<AwsInstance> awsInstances = awsInstanceDao.readInInstanceNos(instanceNos); for (AwsInstance awsInstance : awsInstances) { instanceIds.add(awsInstance.getInstanceId()); } } try { // 振り分け登録 AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); RegisterInstancesWithLoadBalancerRequest request = new RegisterInstancesWithLoadBalancerRequest(); request.withLoadBalancerName(awsLoadBalancer.getName()); for (String instanceId : instanceIds) { request.withInstances(new com.amazonaws.services.elasticloadbalancing.model.Instance(instanceId)); } awsProcessClient.getElbClient().registerInstancesWithLoadBalancer(request); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200141", awsLoadBalancer.getName(), instanceIds)); } // イベントログ出力 processLogger.debug(null, null, "AwsElbInstancesRegist", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName(), instanceIds }); } catch (RuntimeException e) { // ステータスの更新 List<LoadBalancerInstance> loadBalancerInstances = loadBalancerInstanceDao .readByLoadBalancerNo(loadBalancerNo); for (LoadBalancerInstance loadBalancerInstance : loadBalancerInstances) { if (instanceNos.contains(loadBalancerInstance.getInstanceNo())) { loadBalancerInstance.setStatus(LoadBalancerInstanceStatus.WARNING.toString()); loadBalancerInstanceDao.update(loadBalancerInstance); } } throw e; } // ステータスの更新 List<LoadBalancerInstance> loadBalancerInstances = loadBalancerInstanceDao.readByLoadBalancerNo(loadBalancerNo); for (LoadBalancerInstance loadBalancerInstance : loadBalancerInstances) { if (instanceNos.contains(loadBalancerInstance.getInstanceNo())) { loadBalancerInstance.setStatus(LoadBalancerInstanceStatus.RUNNING.toString()); loadBalancerInstanceDao.update(loadBalancerInstance); } } } public void unregisterInstances(AwsProcessClient awsProcessClient, Long loadBalancerNo, List<Long> instanceNos) { if (instanceNos.isEmpty()) { // 振り分け解除するインスタンスがない場合はスキップ return; } // 振り分けされているインスタンス番号を抽出 { List<Long> tmpInstanceNos = new ArrayList<Long>(); List<LoadBalancerInstance> loadBalancerInstances = loadBalancerInstanceDao .readByLoadBalancerNo(loadBalancerNo); for (LoadBalancerInstance loadBalancerInstance : loadBalancerInstances) { if (instanceNos.contains(loadBalancerInstance.getInstanceNo())) { LoadBalancerInstanceStatus status = LoadBalancerInstanceStatus.fromStatus(loadBalancerInstance .getStatus()); if (status == LoadBalancerInstanceStatus.RUNNING) { tmpInstanceNos.add(loadBalancerInstance.getInstanceNo()); } } } instanceNos = tmpInstanceNos; } if (instanceNos.isEmpty()) { // 振り分けされているインスタンスがない場合はスキップ return; } // 起動しているインスタンス番号を抽出 { List<Long> tmpInstanceNos = new ArrayList<Long>(); List<Instance> instances = instanceDao.readInInstanceNos(instanceNos); for (Instance instance : instances) { InstanceStatus status = InstanceStatus.fromStatus(instance.getStatus()); if (status == InstanceStatus.RUNNING) { tmpInstanceNos.add(instance.getInstanceNo()); } } instanceNos = tmpInstanceNos; } if (instanceNos.isEmpty()) { // 起動しているインスタンスがない場合はスキップ return; } // インスタンスIDを取得 List<String> instanceIds = new ArrayList<String>(); { List<AwsInstance> awsInstances = awsInstanceDao.readInInstanceNos(instanceNos); for (AwsInstance awsInstance : awsInstances) { instanceIds.add(awsInstance.getInstanceId()); } } try { // 振り分け解除 AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); DeregisterInstancesFromLoadBalancerRequest request = new DeregisterInstancesFromLoadBalancerRequest(); request.withLoadBalancerName(awsLoadBalancer.getName()); for (String instanceId : instanceIds) { request.withInstances(new com.amazonaws.services.elasticloadbalancing.model.Instance(instanceId)); } awsProcessClient.getElbClient().deregisterInstancesFromLoadBalancer(request); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200142", awsLoadBalancer.getName(), instanceIds)); } // イベントログ出力 processLogger.debug(null, null, "AwsElbInstancesDeregist", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsLoadBalancer.getName(), instanceIds }); } catch (RuntimeException e) { // ステータスの更新 List<LoadBalancerInstance> loadBalancerInstances = loadBalancerInstanceDao .readByLoadBalancerNo(loadBalancerNo); for (LoadBalancerInstance loadBalancerInstance : loadBalancerInstances) { if (instanceNos.contains(loadBalancerInstance.getInstanceNo())) { loadBalancerInstance.setStatus(LoadBalancerInstanceStatus.WARNING.toString()); loadBalancerInstanceDao.update(loadBalancerInstance); } } throw e; } // ステータスの更新 List<LoadBalancerInstance> loadBalancerInstances = loadBalancerInstanceDao.readByLoadBalancerNo(loadBalancerNo); for (LoadBalancerInstance loadBalancerInstance : loadBalancerInstances) { if (instanceNos.contains(loadBalancerInstance.getInstanceNo())) { loadBalancerInstance.setStatus(LoadBalancerInstanceStatus.STOPPED.toString()); loadBalancerInstanceDao.update(loadBalancerInstance); } } } public void addDns(Long loadBalancerNo) { LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo); AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(loadBalancerNo); // CNAMEが登録されている場合はスキップ if (StringUtils.equals(awsLoadBalancer.getDnsName(), loadBalancer.getCanonicalName())) { return; } String fqdn = loadBalancer.getFqdn(); String canonicalName = awsLoadBalancer.getDnsName(); DnsProcessClient dnsProcessClient = dnsProcessClientFactory.createDnsProcessClient(); // CNAMEの追加 dnsProcessClient.addCanonicalName(fqdn, canonicalName); // イベントログ出力 processLogger.debug(null, null, "DnsRegistCanonical", new Object[] { fqdn, canonicalName }); // データベース更新 loadBalancer = loadBalancerDao.read(loadBalancerNo); loadBalancer.setCanonicalName(awsLoadBalancer.getDnsName()); loadBalancerDao.update(loadBalancer); } public void deleteDns(Long loadBalancerNo) { LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo); // CNAMEが登録されていない場合はスキップ if (StringUtils.isEmpty(loadBalancer.getCanonicalName())) { return; } String fqdn = loadBalancer.getFqdn(); String canonicalName = loadBalancer.getCanonicalName(); try { DnsProcessClient dnsProcessClient = dnsProcessClientFactory.createDnsProcessClient(); // CNAMEの削除 dnsProcessClient.deleteCanonicalName(fqdn); // イベントログ出力 processLogger.debug(null, null, "DnsUnregistCanonical", new Object[] { fqdn, canonicalName }); } catch (RuntimeException e) { log.warn(e.getMessage()); } // データベース更新 loadBalancer = loadBalancerDao.read(loadBalancerNo); loadBalancer.setCanonicalName(null); loadBalancerDao.update(loadBalancer); } public void setAwsCommonProcess(AwsCommonProcess awsCommonProcess) { this.awsCommonProcess = awsCommonProcess; } public void setDnsProcessClientFactory(DnsProcessClientFactory dnsProcessClientFactory) { this.dnsProcessClientFactory = dnsProcessClientFactory; } public void setProcessLogger(ProcessLogger processLogger) { this.processLogger = processLogger; } }