メモ2ブログ

メモtoウェブログ。旧ブログはこちら。 http://sakebook.blogspot.jp/

AWS LambdaでKotlinのコードを動かす

Web APIを作ってみたいと思い、AWS Lambdaを触ってみました。PythonかNodeかJavaが使えるとのことだったので、自分が一番書きやすいKotlinで動かしてみるところまでやりました。

まだ詳しくわかっていない部分が多いので、動作したことのメモ書き程度。

確認した順番

  1. チュートリアルを見ながらNodeの hello-world のblueprintで動作確認。
  2. IntelliJMavenプロジェクトでJavaファイルを作成して mvn clean package
  3. IntelliJでGradleプロジェクトでJavaファイルを作成して ./gradlew clean assemble
  4. IntelliJでGradleプロジェクトでktファイルを作成して ./gradlew clean build

上記のようにやっていくことで、問題の切り分けを行いながら確認しました。

詰まったところ

[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/PATH/target). Please verify you invoked Maven from the correct directory. -> [Help 1]

[2]の確認で起きました。Mavenでpackageコマンドを入力して起きました。めちゃくちゃ単純なのですが、一度 mvn package を実行して、成果物を確認するために target に移動したのを忘れてました。。

プロジェクトルートでコマンドを実行しないとだめです。

"errorType": "class java.lang.ClassNotFoundException"

[4]の確認で起きました。 ./gradlew clean assemble で生成した jar をLambdaの管理画面からuploadして、testをしたら発生したエラーです。

build.gradleにkotlinを使うための記述が漏れてました。ktファイルを作成するだけではなく、必要な記述を追記しましょう。よく見たら生成されたjarのファイルサイズがめちゃくちゃ小さいので気づけます。

必要な記述

Androidで使うように、同じように書いたら動きました。

  • build.gradle
apply plugin: "java"
apply plugin: "kotlin"

version = '1.0'

repositories {
    mavenCentral()
}

sourceSets {
    main.kotlin.srcDirs += 'src/main/kotlin'
    main.java.srcDirs += 'src/main/java'
}

dependencies {
    compile (
            'com.amazonaws:aws-lambda-java-core:1.1.0',
            'com.amazonaws:aws-lambda-java-events:1.1.0',
            "org.jetbrains.kotlin:kotlin-stdlib:1.0.4"
    )
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

task buildZip(type: Zip) {
    from compileJava
    from processResources
    into('lib') {
        from configurations.runtime
    }
}

build.dependsOn buildZip

buildscript {
    ext.kotlin_version = '1.0.4'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

"errorType": "java.lang.NoClassDefFoundError"

[4]の確認で起きました。 ./gradlew clean assemble で生成した jar をLambdaの管理画面からuploadして、testをしたら発生したエラーです。

これが一番詰まりました。。どうやら、 ./gradlew clean assemble で生成される jar ではなく、 ./gradlew clean build で生成される zip の方じゃないとだめみたいです。

jarはbuild/libsに生成されますが、zipはbuild/distributions に生成されます。

試してみて

まだアプリから使うところや、実際に利用するようなWeb APIには全くなっていないですが、自分の選択肢を増やせて良いなと思ったところです。

今回の検証結果はこちら。

github.com

参考

ステップ 2: HelloWorld Lambda 関数を作成してコンソールを探る / AWS Lambda

AWS LambdaがJava対応したので簡単チュートリアル / Qiita

Using Gradle / Kotlin Programming Language

SAMMY7th/aws-lambda-kotlin / GitHub

GenymotionにGooglePlayを入れるのが簡単になってた

以前もGenymotionでGooglePlayを動かせるようにする記事を書いたのですが、それよりも簡単な方法が、公式のQAで紹介されていました。

sakebook.hatenablog.com

次のサイトから、zipファイルを落として起動しているGenymotionのEmulatorに入れるだけです。ファイルが一つで済むようになってました。

  1. Platformは x86 を選択
  2. AndroidはGooglePlayを使えるようにしようとしているEmulatorのOSバージョンを選択
  3. Varientはnano を選択
  4. Downloadボタンを選択

ただし、Genymotionのバージョンが、 2.7.2以上 の必要があります。

時々失敗しますが、その場合はEmulatorを作り直して再度zipを入れるとうまくいきました。

参考

Frequently Asked Questions / Genymotion Android Emulator

Open GApps / The Open GApps Project

Shinjuku.aar第1回に参加した

Shinjuku.aarとは

Shinjuku.aarは、新宿界隈のAndroid技術者たちが 技術ネタで気軽にワイガヤできる コミュニティです。

発表ごとにディスカッションタイムを設けており、発表中の質問やツッコミも随時ウェルカム! さらに、ディスカッションが盛り上がるよう、発表者には参加者に向けた 問いかけを一つ入れるようお願いしています 。

もちろんその後は懇親会も用意しておりますので、思う存分ワイガヤしましょう!

http://shinjuku-aar.connpass.com/event/35434/

第1回で、新宿ということもあり参加してみました。

Few command line tools for help Android development

@tomorrowkeyさんの発表です。

www.slideshare.net

adbのコマンドと自作コマンドラインツールの紹介でした。 自分はapkの生成・配布以外はAndroid Studioでだいたい作業していたのですが、ビルドを途中で停止したり、アプリの設定を初期化したりなど、確かにAndroid Stuidoではなかなかやりにくいこともできるので、徐々に比率を移行していきたいなと思いました。

恥ずかしながらiTermのHotKeyを知らなかったのですが、設定すると切り替えが非常に楽で、移行に前向きになりました。

Chrome Custom Tabsを使いこなそう

自分の発表です。

speakerdeck.com

会場ではChrome Custom Tabsを使っている人が思ったより少なかったです。 24.0.0からの機能の紹介で、知らなかったという声も上がっていたので一安心しました。

AutoValue for Easier Life

@Shaunkawano さんの発表です。

speakerdeck.com

ボイラープレートを無くしていこう、ボイラープレートを書かないでいこう、という、決め事を掲げてチームで取り組むという姿勢が良いなと思いました。

AutoValueは知らなかったのですが、目的に即していると思いました。

DownloadProviderを改めて読む

@YusukeIwaki さん

資料は見つかりませんでした。。

Android標準のコンポーネントであるDownloadProviderの設計を、別の所でも使おうというお話。

雑感

会場の雰囲気作りとして、はじめに皆が自己紹介するという形式で、人数もそこまで多くなかったのでやりやすさはありました。 また10分の発表は初めてだったのですが、質問とかしながらしていく雰囲気もあり、時間があまるという感じにはなりませんでした。

他の発表者の方たちのスライドが皆英語のスライドで、デザイン性も高かったので次発表する機会があれば、英語でスライドを作ってみようと思いました。 英語で作ると、日本人以外でも見れるようになるし、スライドをただ読み上げることもなくなる気がします。