Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

本記事は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するプログラムを作成してみたいと思います。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away