Java
AWS
EC2
S3
lambda

Lambda@javaでS3オブジェクトをEC2のDBにINSERTするまで:Java編[前編]

はじめに

本記事はLambda@javaでS3オブジェクトをEC2のDB(SQL Server)にINSERTするまでにやったことの備忘録です。
別解などあればご指摘お願いします。

1 : AWS編
2 : Java編[前編] <-- 本編
3 : Java編[後編]
3.5 : Java編[続]
となります。

以下は前回の続き、EC2インスタンス作成後からとなります。

事前準備

補足:Eclipse とは

eclipse とは、IBMによって開発された統合開発環境 (IDE) の一つ。高機能ながらオープンソースであり、Javaをはじめとするいくつかの言語に対応する。
eclipse自体はJavaで記述されている。

注意)業務上すでにインストール済みだったため、本記事のeclipseのバージョンは Oxygen.3a Release (4.7.3a) を想定します。
別のバージョンを使用したい場合は https://www.eclipse.org/downloads/ よりダウンロードしてください。
また、eclipse のインストールはウィザードにしたがって適宜カスタマイズしてください。

プロジェクトの作成

eclipseのインストールが完了したら、起動し[ファイル]->[新規]->[Mavenプロジェクト]を選択、プロジェクトを作成します。

  • 任意のワークスペースを選択後、[次へ]。
  • 2つ目のウィザードでMavenプロジェクトのアーキタイプを選択する。
    • 今回は特にこだわる部分は無いので[Maven-archetype-quickstart]を選択。

01_eclipse_wizard.png

[次へ]を選択すると新たにウィザードが表示されるので、"アーティファクトID" および "グループID" を入力。
アーティファクトID及びグループIDの詳細については以下のようなイメージ。

グループId:プロジェクトを一意に識別する名前を付ける。
アーティファクトId:プロジェクトのパッケージング名。jarファイルなどにつける名前のイメージ。

02_eclipse_wizard.png

他の項目はデフォルトのまま、[完了]でプロジェクトを作成しましょう。

プロジェクトの作成直後は、概ね次のようなディレクトリ構造になっていると思います。
03_directories.png
注意) コンパイラ準拠レベルは1.8に変更してください。

それでは早速編集していきましょう。

pom.xmlの編集

デフォルトのpom.xmlをダブルクリックで開くと下のようになっていると思います。
jUnitが入っていなかったりするともう少し短い記述になるでしょう。

pom.xml
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>S3test</groupId>
  <artifactId>S3toLambda</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>S3toLambda</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

AWS関連のライブラリを追加するため、dependencies ブロックの中に記述を追加しましょう。Ctrl + s で保存します。

編集後↓

pom.xml
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>S3test</groupId>
  <artifactId>S3toLambda</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>S3toLambda</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core -->
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.0.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-events -->
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-events</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

これによりMaven依存関係の中にAWS関連の複数のjarが追加され、扱えるようになります。

続いて、デフォルトで作成されている App.java クラスを編集していきましょう。

オブジェクト名の一覧取得

デフォルトでは以下のようになっています。

App.java
package S3test.S3toLambda;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

不要なコメントを削除し、クラス名を ReadS3Object とします。
さらにメソッド名を listingNames としておきます。

編集後↓

ReadS3Object.java
package S3test.S3toLambda;

import java.util.List;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListObjectsRequest;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class ReadS3Object
{
    public static void listingNames( String[] args )
    {
        @SuppressWarnings("deprecation")
        AmazonS3 client = new AmazonS3Client(
                new BasicAWSCredentials(
                        "<accessKey>",
                        "<secertKey>"));

        ListObjectsRequest request = new ListObjectsRequest()
                .withBucketName("<bucketName>");
        ObjectListing objectList = client.listObjects(request);

        // オブジェクト一覧の取得
        List<S3ObjectSummary> objects = list.getObjectSummaries();
        System.out.println("objectList:");
        objects.forEach(object -> System.out.println(object.getKey()));
    }
}

<accessKey>, <secretKey> にはそれぞれAWS編で作成したIAMユーザのアクセスキー及びシークレットアクセスキーを指定。
<bucketName> には作成したS3バケット名を入力します。

この状態で、一度プロジェクトをビルドしてjarファイルを作成します。

プロジェクト名を右クリック->[実行]->[Mavenビルド]を選択すると実行構成の編集用ポップアップが表示されるので、
ゴール部分に "package shade:shade" を入力して、依存関係のあるライブラリも含めてパッケージングします。

実行すると、プロジェクト名/target/
に <projectName>-0.0.1-SNAPSHOT.jar が作成されるので、これをLambdaにアップロードします。

jarのアップロードとLambdaファンクションの実行

Lambdaのマネジメントコンソールに接続します。
画面上部の[関数の作成]をクリックし、作成画面へ移動します。

[一から作成]が選択されていることを確認し、中央のフォームを入力していきます。
04_Lambda.png
ここではファンクション名を "test-function" とし、ランタイムをJava 8に設定します。
既存のロールを選択、で前回作成したロールを選択します(キャプチャでは前回から名前を変えています)。

[関数を作成]を実行すると Java 8 の実行環境が作成されるので、ここに先ほどの jar をアップロードしてみましょう。

05_Lambda.png
矢印部分の[ハンドラ]内は"パッケージ名.クラス名::実行メソッド名"と記述します。

アップロードが完了したら、画面上部の [保存] -> [テスト]をクリックしましょう。

初回のみテストデータの作成を促されますが、今回は特に意識する必要はないのでデータはそのまま、適当なイベント名をつけておきます。
スクリーンショット 2018-09-13 11.45.30.png

[作成]をクリックするとLambdaファンクションが実行され、結果が出力されます。
次のように、S3バケットにアップロードしたテストファイルの名前が表示されていれば成功です。
06_Lambda_execute.png

次回はS3バケットに何らかのファイルをアップロードしたことを検知して、メールで通知するプログラムと、DBへINSERTするプログラムを作成してみたいと思います。