AWS Reinvent – ja Andy Jassyn keynote

No niin, AWS pilvipalveluiden julkistuksia on ammuttu taas matkaan sellaiseen tahtiin että päätä huimaa. Blogautin jo aiemmin esimaistiaisista, Sumerian ja Amazon Media Services. Nyt oli sitten Andy Jassyn keynote ja uutta palvelua pukkasi tiukkaan tahtiin, kaikille kentille. Sinällään fiilis on vähän sama kuin yleensäkin AWS palvelupalettia seuratessa, mutta nyt tapahtui parin tunnin sisään kaikki.

2017-11-29 07.17.34.jpg

Katsotaanpas muistiinpanoja..

Itse povailin jo etukäteenkin että Kubernetes saisi vähän rakkautta – ja se saikin, Amazon Elastic Container Service for Kubernetes eli tuttavallisemmin EKS julkaistiin. Kubernetes on yksi ihastuttava vaihtoehto konttien hallintaan kun puhutaan pikkasenkin suuremmista kokonaisuuksista, tai havitellaan rolling updates/canary deployment/green-blue deployment/etc tyylisiä ratkaisuja. Samalla julkaistiin Fargate palvelu – konttien hallintaa palveluna, tarvitsematta itse provisioida resursseja pysyvästi. Minä touhotan aina konteista, Dockerista ja Kuberneteksesta, joten olen miedosti innostunut.

2017-11-29 08.05.25

Uusia instanssityyppejä on julkaistu muutama, samoin Bare Metal instanssit. Summattakoon, että vääntöä löytyy tarvittaessa, ja nyt pääsee lähemmäs rautaa. Ei kuitenkaan ole tullut itsellä vastaan vielä tarvetta, joten let’s move on.

Pieniä juttuja jotka herättävät mielenkiintoa – Lambdoille CodeDeploy tuki, ja Weighted Routing. Lambdat nostavat enemmän ja enemmän päätään myös devaajan työkalupakissa, ja noiden avulla saa paremman tuen pipelineille, versioiden hallinnalle, rollbackeille, em. canary deploymentille (päästetään esim. 10% liikennettä uuteen versioon ja haistellaan tuotannossa onko kaikki kunnossa – ihanaa continuous deployment-microserviceille)

2017-11-29 08.06.09

Muita uusia palveluita jotka herättivät mielenkiintoa – Amazon Appsync on käytännössä GraphQL-kerros-palveluna, ja tarkoitettu eri asiakasohjelmien väliseen tilanhallintaan. Amazon MQ on käytännössä ActiveMQ-as-service. Storage-puolelle Aurora sai vahvistusta, siitä tuli Serverless ja Multi-Master vaihtoehdot, joten sekin alkaa vahvasti nostamaan profiiliaan vielä entisestä – muistuttaa paljolti Googlen Spanner-tarjontaa. DynamoDB veti AZ-replikoinnista Regionien väliseen replikointiin Global Tables-muodossa, ja sai parempia backup-vaihtoehtoja. Lopulta julkaistiin Neptune uutena palveluna – graph-database-as-service. Tämä vaatii itseltä vähän paneutumista ennen kuin uskallan sanoa juuta tahi jaata.

Mutta noista yhteenvetona, entistä enemmän saa taas palveluna, jolloin ei tarvitse maksaa tyhjästä ajasta, ja skaalautuminen ja päivitykset ovat vielä entistäkin automaattisempaa. Aurora ja DynamoDB vahvistavat kovasti asemiaan, ja uutta kivaa tulee. Eikä siinä vielä kaikki…

2017-11-29 08.29.29.jpg

S3 sai vahvistusta – nyt esim. analytiikan tarpeisiin pystyy louhimaan S3 tiedoista esisuodatuksella valikoiden, mitä haluaa sillä kertaa analysoida. Tässä siis kyseessä S3 select. Vieläkin huimempaa on Glacier select – valikoivaa louhintaa arkistoista. Aiemmin Glacier toimi lähinnä arkistoihin, joita ei koskaan/kovin usein kaivattu, ja sieltä tiedon haku kestää – otetaan ikäänkuin iso mappi kerrallaan tavaraa, vaikka käytettäisiin vain hippusta.

Machine Learning puolelle tuli vahvistusta, Deeplens, SageMaker muodossa. En sano näistä mitään kun en ole vielä syvällä teemassa, mutta isot pojat kohisevat näistä. SageMaker on käytännössä machine-learning-as-service, eli nostaa abstraktiotasoa tuoden sen helpommin muidenkin kuin superkoodaajien ulottuville. Deeplens laitteita on arvonnoissa luvassa per heti, ja jatkossa niitä saa muutamalla satalappusella. Niiden avulla voi opettaa koneita kuvamateriaalilla, ja siihen liittyen…

Amazon Rekognition Video ja Amazon Kinesis Video Streams – tunnistusta suoraan videolta/videovirrasta, ja tehokasta videovirtojen keruuta ja varastointia. Cool – and a bit scary stuff! Jo käytössä virkavallalla ainakin täällä jenkeissä… Suattaapi luoda jänniä hetkiä GDPR parissa täällä peräpohjolassa..

Ja lopulta, Amazon Translate, Amazon Comprehend, ja Amazon Transcribe. Kielen ymmärrystä ja käännöksiä, reaaliaikaisesti tai pidemmän, luonnollisen kielen mukaan. Puhetta tekstiksi. Palasia on ollut jo olemassa, mutta lisää korkeamman abstraktiotason palveluita, joissa koneoppiminen on jo sisäänrakennettuna. Sattuneesta syystä kiinnostaa kyllä!

Eikä siinä vielä kaikki, mutta onhan tätä jo tässsäkin! Huom! Julkistuksissa elinkaari vaihtelee, osa jo hienosti valmiina, osa vasta esimaistiaisena.

Kaiken kaikkiaan, AWS on pilvialustana isoin, vapain, ja energisin. Täällä tapahtuu ja on sykettä. Kehittäjillä ja rakentajilla on valinnan vapautta runsaasti. Vapauden myötä tulee tietysti myös suuri vastuu, kyllä näillä rakennuspalasilla voi ampua itseään pahasti jalkaan, ja yritys joka syöksyy suinpäin pilveen takamus edellä, maksaa kalliit läksyt virheistään. If you got one account for all you’re doing it wrong! If you’ve got personal accounts for builders you’re doing it wrong! Onneksi asiansa osaavat pilviarkkitehdit auttavat näissä asioissa mielellään. *oman hännän nosto*

Luonnollisesti keynoteen sisältyi myös ystävällismielistä ja vähän vähemmän ystävällismielistä kettuilua Oracle, Microsoft ja Google suuntaan. Syystäkin – AWS on iso, innovatiivinen, innostava ja … ihana? 😉 Lisää detaileja mm. Solitan dev-blogissa. Tällä alustalla tapahtuu!

2017-11-29 08.41.34

Linkkejä:

http://dev.solita.fi/

https://aws.amazon.com/blogs/aws/

https://aws.amazon.com/blogs/aws/introducing-amazon-appsync/

https://aws.amazon.com/blogs/aws/amazon-mq-managed-message-broker-service-for-activemq/

https://aws.amazon.com/blogs/aws/amazon-elastic-container-service-for-kubernetes/

https://aws.amazon.com/blogs/aws/aws-fargate/

https://aws.amazon.com/blogs/aws/in-the-works-amazon-aurora-serverless/

https://aws.amazon.com/blogs/aws/new-for-amazon-dynamodb-global-tables-and-on-demand-backup/

https://aws.amazon.com/blogs/aws/amazon-neptune-a-fully-managed-graph-database-service/

https://aws.amazon.com/blogs/aws/s3-glacier-select/

https://aws.amazon.com/blogs/aws/sagemaker/

https://aws.amazon.com/blogs/aws/deeplens/

https://aws.amazon.com/blogs/aws/launch-welcoming-amazon-rekognition-video-service/

https://aws.amazon.com/blogs/aws/amazon-kinesis-video-streams-serverless-video-ingestion-and-storage-for-vision-enabled-apps/

https://aws.amazon.com/blogs/aws/amazon-transcribe-scalable-and-accurate-automatic-speech-recognition/

https://aws.amazon.com/blogs/aws/introducing-amazon-translate-real-time-text-language-translation/

https://aws.amazon.com/blogs/aws/amazon-comprehend-continuously-trained-natural-language-processing/

https://aws.amazon.com/blogs/aws/aws-iot-device-management/

https://aws.amazon.com/blogs/aws/in-the-works-aws-sepio-secure-your-iot-fleet/

 

Mainokset

Pilven reunalle istumaan JEE serverin kera

Tänään koulutellessa Java EE ohjelmointia tuli vastaan kysymys siitä, mitkä suomalaiset web-hotellit tukevat Java EE softan asennusta ja ajamista. Itselle on tutuksi tulleet lähinnä Google App Engine sekä Amazon pilvipalvelut entuudestaan, mutta suomalaista tarjontaa en juuri tuntenut joten ei kun tutustumaan.

Tarjokkaita löytyi lopulta – pun intended – pilvin pimein. Mutta jostakin syystä käteen jäi itselle Jelastic, pystytin sinne trial hengessä pienen glassfish serverin, mysql kannan, ja noin 10 minuutin uurastuksella perinteiseen tapaan vältellen ohjeiden lukemista pystyssä oli hetken päästä toimiva ympäristö kurssin harjoituksille. Itse harjoitustehtävälle en tehnyt mitään muutoksia, tuuppasin paketoidun JPA:ta ja servlettejä sisältävän .war paketin suoraan Jelastic pilveen, mutta etukäteisvalmisteluna loin toki mysql kantaan uuden scheman, sille sopivat käyttäjätunnarit, kirjauduin glassfish hallintakonsoliin, loin mysql connection poolin, ja sen päälle datasourcen nimeltä jdbc/sample – jota harjoitustehtävä käytti.

Forum war paketti tuupattuna serverille

Yllättävän kivuton ja hauska prosessi. Toki trial serverillä serverien resurssit on kuristettu niin alas että sain sähköpostiin motkotuksia vähistä resursseista ja serverin kriittisestä tilasta. Mutta nehän korjautuvat rahalla, pilven idean mukaan sellaisen viipaleen saa mistä maksaa – ja mitä käytetään.

mysql_admin

 

glassfish_admin

Hauskaa oli havaita, että jopa serverin tiedostoihin pääsi vapaasti käsiksi. Serverin lib kansioon piti tietysti ladata mysql connector/j ajuri.

Näyttää että pilvet alkavat suomessakin olemaan elinvoimaisia. Odotellessa kummoisempia pilvistandardeja Java-maailmaan Java EE tekniikat toimivat jo hyvin ja sovellukset siirtyvät paikalliselta testipalvelimelta pilveen – toki oma oppimiskäyränsä on resursoinnissa ja hallinnassa, sekä vasteaikojen hiomisessa, mutta lupaavaa kumminkin. Taitaa olla takana ajat kun itsekin linux purnuja webin nurkalle pystyttelin oman huoneen nurkkaan :p

accesstoserverfilesandfolders

 

Tervetuloa vain mukaan pilven reunalle istuksimaan! 😉

 

Google App Engine pilvipalvelu ja Java EE 6, osa 3

No niin, huomasin etten ole mennyt paljonkaan yksityiskohtiin näissä pilvipalveluissa, eli ihan omaksi muistintueksikin, tässä yksityiskohtia. Varoitus, tästä tulee rumaa, kuten aina kun yksityiskohtiin mennään.

Toimiva Maven pom jossa on mukana JPA 1 ja JSF 2, on tässä:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>fi.tieturi</groupId>
  <artifactId>PilvenVeikko</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>PilvenVeikko Java EE 6 Webapp</name>
  <url>http://maven.apache.org</url>
  <repositories>
    <repository>
      <id>java.net2</id>
      <name>Repository hosting the jee6 artifacts</name>
      <url>http://download.java.net/maven/2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>maven-gae-plugin-repo</id>
      <name>maven-gae-plugin repository</name>
      <url>http://maven-gae-plugin.googlecode.com/svn/repository</url>
    </pluginRepository>
  </pluginRepositories>
  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>2.0.2</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>el-impl</artifactId>
      <version>2.2</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-jpa</artifactId>
      <version>1.1.5</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>persistence-api</artifactId>
      <version>1.0</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-core</artifactId>
      <version>1.1.5</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>javax.jdo</groupId>
      <artifactId>jdo2-api</artifactId>
      <version>2.3-eb</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-enhancer</artifactId>
      <version>1.1.4</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-rdbms</artifactId>
      <version>1.1.5</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.google</groupId>
      <artifactId>appengine-local-runtime-shared</artifactId>
      <version>1.2.0</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-appengine</artifactId>
      <version>1.0.7.final</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.google</groupId>
      <artifactId>appengine-sdk-api</artifactId>
      <version>1.3.8</version>
      <type>jar</type>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.0.2</version>
        <configuration>
           <source>1.6</source>
          <target>1.6</target>
       </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1-beta-1</version>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
    </plugin>
    <plugin>
        <groupId>net.kindleit</groupId>
        <artifactId>maven-gae-plugin</artifactId>
        <version>0.6.0</version>
       <configuration>
          <sdkDir>D:/java/appengine-java-sdk-1.3.8</sdkDir>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.datanucleus</groupId>
        <artifactId>maven-datanucleus-plugin</artifactId>
        <version>1.1.4</version>
        <configuration>
          <mappingincludes>**/domain/*.class</mappingincludes>
          <verbose>true</verbose>
          <enhancername>ASM</enhancername>
          <api>JPA</api>
        </configuration>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>enhance</goal>
            </goals>
          </execution>
      </executions>
      <dependencies>
        <dependency>
          <groupId>org.datanucleus</groupId>
          <artifactId>datanucleus-core</artifactId>
          <version>1.1.5</version>
          <exclusions>
           <exclusion>
              <groupId>javax.transaction</groupId>
              <artifactId>transaction-api</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
        <dependency>
          <groupId>org.datanucleus</groupId>
          <artifactId>datanucleus-rdbms</artifactId>
          <version>1.1.5</version>
        </dependency>
        <dependency>
          <groupId>org.datanucleus</groupId>
          <artifactId>datanucleus-enhancer</artifactId>
          <version>1.1.4</version>
        </dependency>
      </dependencies>
      </plugin>
    </plugins>
    <finalName>PilvenVeikko</finalName>
  </build>
  <profiles>
    <profile>
      <id>netbeans-private</id>
      <activation>
        <property>
          <name>netbeans.execution</name>
          <value>true</value>
        </property>
      </activation>
      <properties>
        <netbeans.deployment.server.id>[C:\Program Files (x86)\glassfish-3.0.1\glassfish]deployer:gfv3ee6:localhost:4848</netbeans.deployment.server.id>
      </properties>
    </profile>
  </profiles>
  <properties>
    <netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
  </properties>
</project>

Julkaisin tuon kokonaisena copy-pastea ajatellen. Pieni mutta tärkeä kohta on lopussa oleva DataNucleus enhancer plugin, koska DataNucleus käyttää vielä vanhanaikaista bytecode vahvistusta, tuo vaihe tehdään käännöksen jälkeen, tärkeää tarkistaa että pakettirakenne-parametri on oikein. Vierastan lisä ant scriptien käyttöä joten yritin tehdä kaiken Mavenillä ja näyttäisi toimivan.

Toinen jippo oli imaista gae kirjastot paikalliseen maven repositoryyn etukäteen, koska tietääkseni niitä ei globaaleista repositoryistä löydy. Kirjastot mitä näemmä tarvittiin olivat datanucleus-jpa, datanucleus-core, jdo2-api, datanucleus-enhancer, datanucleus-rdbms, appengine-local-runtime-shared, datanucleus-appengine, sekä appengine-sdk-api. Lisäksi javan core kirjastoista tarvitsin persistence-api ja servlet-api ja jsp-api pakettien lisäksi jsf-api ja jsf-impl kirjastot, versio 2, sekä el-impl. Huom! JSF-impl on google app enginelle tuunattu versio, johtuen parista rajoituksesta sen suhteen. Tässä pari linkkiä siihen:

Take a look at this site
http://javadocs.wordpress.com/2009/10/17/mojarra-jsf-2-0-rc2-and-google-app-engine-sdk-1-2-6/

and download this file
http://code.google.com/p/joshjcarrier/source/browse/trunk/Sun%20JSF%20GAE/jsf-impl-gae.jar

Rakensin tällaisen scriptin joka vie ne repositoryyn:

call mvn install:install-file -Dfile=lib/appengine-tools-api.jar -DgroupId=com.google -DartifactId=appengine-tools -Dversion=1.2.0 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/shared/appengine-local-runtime-shared.jar -DgroupId=com.google -DartifactId=appengine-local-runtime-shared -Dversion=1.2.0 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/appengine-api-1.0-sdk-1.3.8.jar -DgroupId=com.google -DartifactId=appengine-sdk-api -Dversion=1.3.8 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/datanucleus-appengine-1.0.7.final.jar -DgroupId=org.datanucleus -DartifactId=datanucleus-appengine -Dversion=1.0.7.final -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/datanucleus-core-1.1.5.jar -DgroupId=org.datanucleus -DartifactId=datanucleus-core -Dversion=1.1.5 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/datanucleus-jpa-1.1.5.jar -DgroupId=org.datanucleus -DartifactId=datanucleus-jpa -Dversion=1.1.5 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/jdo2-api-2.3-eb.jar -DgroupId=org.datanucleus -DartifactId=jdo2-api -Dversion=2.3 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/geronimo-jpa_3.0_spec-1.1.1.jar -DgroupId=org.geronimo -DartifactId=geronimo.jpa -Dversion=1.1.1 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/geronimo-jta_1.1_spec-1.1.1.jar -DgroupId=org.geronimo -DartifactId=geronimo.jpa -Dversion=1.1.5 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=jsf-impl-gae.jar -DgroupId=com.sun.faces -DartifactId=jsf-impl -Dversion=2.0.2 -Dpackaging=jar -DgeneratePom=true

No niin , ehkäpä siinä oli taas tarpeettoman paljon tietoa tällä kertaa 😉 Joka tapauksessa, itselleni muistiin mitä askelia tarvittiin pilveen pääsemiseen.

Google App Engine pilvipalvelu ja Java EE 6, osa 1

Olen aivan pilvessä.

No niin, vaikka Pilvi on uusi trendi, tuo on jo vitsinä vanha. Joka tapauksessa, tänään oli hetkonen aikaa kokeilla Google App Engine viritystä vähäsen, olen jo aiemmin sinne tehnyt palveluita mutta nyt ehti hetken kokeilla ajatuksella.

Google App Engine ideana on hostata ympäristö josta voi ostaa skaalautuvasti prosessointitehoa ja muistia ja levytilaa, niinsanotusti vääntöä. Palvelusta löytyy myös tietokantaratkaisuja, ja tukea löytyy useammalle ohjelmointikielelle. Liikkeellelähtö on ilmaista, mutta jos kapasiteetin tarpeet kasvavat, skaalautuvuutta saa rahalla.

Minua tietysti kiinnosti miten uudet Java EE 6 solakat ohjelmointitekniikat siellä pelaavat, ja pelasivathan ne, pienin virityksin. Sain iltapäivän aikana Maven vetoisen projektin nykäistyä kasaan, sinne tuki EE 6 piirteille kuten JSF 2, ja tietysti Netbeans editorina. Mitään kovin ihmeellistä en ole vielä koonnut palveluun mutta tämä on silti hyvä alku. Tuli peräti lämmin tunne kun omin silmin näki miten jsf softa jota hetki sitten oli ajanut omalla koneellaan pyöri nyt hostattuna Googlen myllytyksessä. Ja niillä pojilla muuten myllyä piisaa.

Tämä oli alku, ja jatkossa aion kytkeä CDI mekanismit päälle, tutkia miten JPA 2 alustalla pelaa, ja tehdä sinne jonkun sovelluksen. Tällä hetkellä kallistuisin työajanseurannan puoleen, ne ovat aina hätäisesti tehtyjä virityksiä ja tässä olisi tilaisuus tehdä helposti skaalattava softa suht vähällä vaivalla ja pistää pilvi koetukselle. Katsotaan miten käy. Jatko-osia siis tulossa jahka löydän lisää aikaa.