1. yut0201

    Posted

    yut0201
Changes in title
+Lambda@javaでS3オブジェクトをEC2のDBにINSERTするまで:java編
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,231 @@
+はじめに
+--
+
+本記事はAWS、java(ほぼ)初心者がLambda@javaでS3オブジェクトをEC2のDB(SQL Server)にINSERTするまでにやったことの備忘録です。
+
+[1.AWS編](https://qiita.com/yut0201/items/bbedbb46d6a44204af26)
+2.Java編[前編] <-- 本編
+3.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]を選択。
+
+<img width="857" alt="01_eclipse_wizard.png" src="https://qiita-image-store.s3.amazonaws.com/0/265621/8829dfc7-3f95-e4c2-9295-2dbdf8a2bc05.png">
+
+[次へ]を選択すると新たにウィザードが表示されるので、"アーティファクトID" および "グループID" を入力。
+アーティファクトID及びグループIDの詳細については以下のようなイメージ。
+
+> グループId:プロジェクトを一意に識別する名前を付ける。
+> アーティファクトId:プロジェクトのパッケージング名。jarファイルなどにつける名前のイメージ。
+
+<img width="858" alt="02_eclipse_wizard.png" src="https://qiita-image-store.s3.amazonaws.com/0/265621/c4fb9a17-e79d-65fe-bf2a-95ef4f2d28e5.png">
+
+他の項目はデフォルトのまま、[完了]でプロジェクトを作成しましょう。
+
+プロジェクトの作成直後は、概ね次のようなディレクトリ構造になっていると思います。
+<img width="279" alt="03_directories.png" src="https://qiita-image-store.s3.amazonaws.com/0/265621/2818a559-5879-b8e9-5988-1a68a43ff620.png">
+注意) コンパイラ準拠レベルは1.8に変更してください。
+
+それでは早速編集していきましょう。
+
+pom.xmlの編集
+--
+
+デフォルトのpom.xmlをダブルクリックで開くと下のようになっていると思います。
+jUnitが入っていなかったりするともう少し短い記述になるでしょう。
+
+```xml: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 で保存します。
+
+編集後↓
+
+```xml: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>
+
+ <dependency>
+ <groupId>com.amazonaws</groupId>
+ <artifactId>aws-lambda-java-events</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+
+ </dependencies>
+</project>
+
+```
+
+これによりMaven依存関係の中にAWS関連の複数のjarが追加され、扱えるようになります。
+
+続いて、デフォルトで作成されている App.java クラスを編集していきましょう。
+
+オブジェクト名の一覧取得
+--
+
+デフォルトでは以下のようになっています。
+
+```java:App.java
+package S3test.S3toLambda;
+
+/**
+ * Hello world!
+ *
+ */
+public class App
+{
+ public static void main( String[] args )
+ {
+ System.out.println( "Hello World!" );
+ }
+}
+```
+
+不要なコメントを削除し、クラス名を ReadS3Object とします。
+さらにメソッド名を listingNames としておきます。
+
+編集後↓
+
+```java: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のマネジメントコンソールに接続します。
+画面上部の[関数の作成]をクリックし、作成画面へ移動します。
+
+[一から作成]が選択されていることを確認し、中央のフォームを入力していきます。
+<img width="1637" alt="04_Lambda.png" src="https://qiita-image-store.s3.amazonaws.com/0/265621/b610b108-6758-1495-9bf9-f7668c755886.png">
+ここではファンクション名を "test-function" とし、ランタイムをJava 8に設定します。
+既存のロールを選択、で前回作成したロールを選択します(キャプチャでは前回から名前を変えています)。
+
+[関数を作成]を実行すると Java 8 の実行環境が作成されるので、ここに先ほどの jar をアップロードしてみましょう。
+
+<img width="1637" alt="05_Lambda.png" src="https://qiita-image-store.s3.amazonaws.com/0/265621/ac87e630-794e-fb06-c8d2-945232e119b7.png">
+矢印部分の[ハンドラ]内は"パッケージ名.クラス名::実行メソッド名"と記述します。
+
+アップロードが完了したら、画面上部の [保存] -> [テスト]をクリックしましょう。
+
+初回のみテストデータの作成を促されますが、今回は特に意識する必要はないのでデータはそのまま、適当なイベント名をつけておきます。
+<img width="820" alt="スクリーンショット 2018-09-13 11.45.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/265621/5d118554-5412-3734-ba3c-802ca1a61292.png">
+
+[作成]をクリックするとLambdaファンクションが実行され、結果が出力されます。
+次のように、S3バケットにアップロードしたテストファイルの名前が表示されていれば成功です。
+<img width="1600" alt="06_Lambda_execute.png" src="https://qiita-image-store.s3.amazonaws.com/0/265621/4458e353-5482-0172-e223-a8a1d327c5d2.png">
+
+次回はS3バケットに何らかのファイルをアップロードしたことを検知して、メールで教えてくれるようなプログラムを作成してみたいと思います。
+