Končíme s CloudTools

Tento zápisek navazuje na předcházející „Začínáme s Amazon Elastic Cloudem“. Původně jsem se chtěl zabývat projektem CloudTools hlouběji, ale jak jsem zjistil, tak růžové to s tímto nástrojem není.

CloudTools je sada nástrojů, které Java programátorům usnadňují práci s EC2. Poskytují AMI, o kterém jsem se zmiňoval minule, obsahují Groovy skripty pro práci s Grails a hlavně Maven plugin, kterému se budeme věnovat dnes.

Pokud si to chcete sami vyzkoušet, můžete si stáhnout můj příklad ze SVN, jinak to samé můžete udělat i s jakýmkoliv web projektem. Pro to, abychom mohli aplikaci automaticky nasadit na EC2 musíme upravit pom.xml. Musíme přidat pluginRepository odkud se stáhne CloudTools plugin.

	<pluginRepositories>
		<pluginRepository>
			<id>pia-repository</id>
			<url>http://www.pojosinaction.com/repository
			</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>

Musíme samozřejmě nakonfigurovat i plugin samotný.

<plugin>
	<groupId>net.chrisrichardson</groupId>
	<artifactId>cloudtools-maven-plugin</artifactId>
	<configuration>
		<awsPropertiesFile>
			aws.properties
		</awsPropertiesFile>
		<schemaName>simplechat</schemaName>
		<schemaUsers>
			<param>
				chat:chat
			</param>
		</schemaUsers>
		<catalinaOptsBuilder>
			{builder, databasePrivateDnsName, slaves ->
			builder.arg("-server")
			builder.arg("-Xmx1000m")
			builder.prop("ptrack.application.environment", "ec2")
			builder.prop("jdbc.db.server", databasePrivateDnsName)}
		</catalinaOptsBuilder>
	</configuration>
</plugin>

Zde je asi nejdůležitější cesta k aws.properties. V ostatních elementech zadáváme přístupové údaje k MySql a konfiguraci Tomcatu. V aws.properties definujeme následující:

imageId.m1.small=ami-6f2cc906
accessKey=XXXXXXXXXXXXXXXXX
secretKey=XXXXXXXXXXXXXXXXX
keyName=Pair1
keyPairFile=/home/lukas/tmp/id-Pair1
sshDir=/usr/bin/

Většinu známe z minulého dílu a z ElasticFoxu. Pokud už máme všechno nakonfigurováno, spustíme mvn package pro vytvoření war souboru. Pak můžeme zkusit spustit mvn cloudtools:deploy. Teto příkaz nejdříve nahraje WAR do S3, nastartuje EC2 server, spustí MySql, vytvoří schéma a kdybychom mu zadali cestu k SQL skriptu, tak by podle něj i vytvořil tabulky. Poté stáhne z S3 WAR na server, nasadí ho a nakonfiguruje Tomcat. Ten spustí a zkusí jestli se všechno podařilo. Vy to můžete otestovat tak, že si server zobrazíte v ElasticFoxu, zkopírujete jeho “Public DNS Name” a zadáte ho do prohlížeče. Pokud jste si udělali díru do firewallu, aplikace by měla být vidět jak na portu 8080 tak i přes Apache na portu 80.

Pokud se ale CloudTooly pokusíte o něco složitějšího, ošklivě narazíte. A to hlavně na zoufalý nedostatek dokumentace. Na WIKI projektu mají pár stránek, z kterých se dá něco zjistit. Něco se dá i vykoukat ze zdrojových kódů. Ty jsou ovšem v Groovy a navíc jsem tam snad nezahlédl ani řádek komentáře, takže taky nic moc. Když jsem zkoušel spouštět složitější topologie clusteru, tak mi to nastartovalo osm serverů, nevěděl jsem proč, co na nich má běžet a hlavně to zas tak moc dobře nefungovalo. Už sice mám představu co a jak by se dalo udělat, ale nějak nemám náladu se tím brodit.

Je taky potřeba se zamyslet nad tím, co bychom vlastně potřebovali. Pro vývoj nám cloudtools:deploy, popřípadě cloudtools:redeploy stačí. Pro ostrý provoz si myslím, že Maven plugin není to nejlepší. Spíš bychom potřebovali něco, co nám ty servery bude hlídat, automaticky startovat nebo vypínat a podobně. To by měl umět projekt ElasticGrid, ale ten má snad ještě horší dokumentaci než CloudTools.

Nicméně mám v hlavě nápad, jak udělat CloudTools o trochu použitelnější. Umí totiž po nastartování serveru spustit libovolný shell skript (viz. zde). Takže teoreticky se dá třeba snadno nainstalovat a spustit například Terracotta aniž by se člověk musel brodit Groovy kódem. Je sice škoda, že není snadné využít existující funkcionalitu, která tam už pro podobné účely je, ale to je bohužel klasický osud nezdokumentovaného kódu.