package Ġcom . atlassian . performance . tools . aws infrastructure . load balancer Ċ Ċ import Ġcom . amazonaws . services . ec 2 . Amazon EC 2 Ċ import Ġcom . amazonaws . services . ec 2 . model .* Ċ import Ġcom . atlassian . performance . tools . aws . api .* Ċ import Ġcom . atlassian . performance . tools . aws infrastructure . api . load balancer . LoadBalancer Formula Ċ import Ġcom . atlassian . performance . tools . aws infrastructure . api . load balancer . Provision ed LoadBalancer Ċ import Ġcom . atlassian . performance . tools . infrastructure . api . load balancer . LoadBalancer Ċ import Ġcom . atlassian . performance . tools . ssh . api . Ssh Ċ import Ġorg . apache . logging . log 4 j . Log Manager Ċ import Ġorg . apache . logging . log 4 j . Logger Ċ import Ġjava . net . URI Ċ import Ġjava . time . Duration Ċ Ċ internal Ġclass ĠApache Ec 2 LoadBalancer Formula Ġ: ĠLoad Balancer Formula Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ġ= ĠLog Manager . getLogger ( this :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġbalancer Port Ġ= Ġ 8 0 ĊĊĠĠĠ Ġoverride Ġfun Ġprovision ( ĊĠĠĠĠĠĠĠ Ġinvestment : ĠInvest ment , ĊĠĠĠĠĠĠĠ Ġinstances : ĠList < Instance >, ĊĠĠĠĠĠĠĠ Ġvpc : ĠV pc , ĊĠĠĠĠĠĠĠ Ġsubnet : ĠSub net , ĊĠĠĠĠĠĠĠ Ġkey : ĠSsh Key , ĊĠĠĠĠĠĠĠ Ġaws : ĠAws ĊĠĠĠ Ġ): ĠPro vision ed LoadBalancer Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Setting Ġup ĠApache Ġload Ġbalancer ...") ĊĠĠĠĠĠĠĠ Ġval Ġec 2 Ġ= Ġaws . ec 2 ĊĠĠĠĠĠĠĠ Ġval Ġhttp Access Ġ= Ġhttp Access ( invest ment , Ġec 2 , Ġaws . await ing Ec 2 , Ġvpc ) ĊĠĠĠĠĠĠĠ Ġval Ġ( ssh , Ġresource ) Ġ= Ġaws . await ing Ec 2 . allocate Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvestment Ġ= Ġinvestment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvpc Id Ġ= Ġvpc . vpc Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustomize Launch Ġ= Ġ{ Ġlaunch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with SecurityGroup Ids ( http Access . groupId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Subnet Id ( subnet . subnet Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Instance Type ( Instance Type . M 1 Large ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Apache Ġload Ġbalancer Ġis Ġset Ġup ") ĊĠĠĠĠĠĠĠ Ġreturn ĠPro vision ed LoadBalancer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Balancer Ġ= ĠApache LoadBalancer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes Ġ= Ġinstances . map Ġ{ ĠURI (" http ://${ it . public IpAddress }: 8 0 8 0 /") Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Port Ġ= Ġbalancer Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġssh Ġ= Ġssh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Ġ= ĠDepend ent Resources ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= Ġresource , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Ġ= ĠEc 2 SecurityGroup ( http Access , Ġec 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhttp Access ( ĊĠĠĠĠĠĠĠ Ġinvestment : ĠInvest ment , ĊĠĠĠĠĠĠĠ Ġec 2 : ĠAmazon EC 2 , ĊĠĠĠĠĠĠĠ Ġawait ing Ec 2 : ĠA waiting Ec 2 , ĊĠĠĠĠĠĠĠ Ġvpc : ĠV pc ĊĠĠĠ Ġ): ĠSecurity Group Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsecurity Group Ġ= Ġawait ing Ec 2 . allocate SecurityGroup ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvestment , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCreate SecurityGroup Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with GroupName ("${ invest ment . reuse Key ()} - Http Listener ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Description (" Enable s ĠHTTP Ġaccess ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Vpc Id ( vpc . vpc Id ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġec 2 . authorize SecurityGroup Ingress ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuthor ize SecurityGroup Ingress Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with GroupId ( security Group . groupId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Ip Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIp Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Ip Protocol (" tcp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with From Port ( balancer Port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with To Port ( balancer Port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Ipv 4 Ranges ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIp Range (). with Cid r Ip (" 0 . 0 . 0 . 0 / 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsecurity Group ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠApache LoadBalancer ( ĊĠĠĠ Ġprivate Ġval Ġnodes : ĠList < URI >, ĊĠĠĠ Ġprivate Ġval Ġssh : ĠSsh , ĊĠĠĠ Ġprivate Ġval Ġhttp Port : ĠInt Ċ ) Ġ: ĠLoad Balancer Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Wait Ġuntil Ġthe Ġ` infrastructure ` Ġmodule Ġsh ips Ġ` Apache LoadBalancer ` ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġuri : ĠURI Ġ= ĠURI (" http ://${ ssh . host . ipAddress }: $ http Port /") ĊĊĠĠĠ Ġoverride Ġfun Ġwait Until Health y ( ĊĠĠĠĠĠĠĠ Ġtimeout : ĠDuration ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TODO : ĠInstall ĠApache Ġload Ġbalancer Ġvia Ġ$ ssh ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġconfigure Ġit Ġto Ġbalance Ġbetween Ġ$ nodes " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġand Ġlisten Ġon Ġ$ http Port " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }