AWSのEC2インスタンスを使用して、AWS JavaSDKのアプリを実行しましょう。

　最近、AWSサービスが広がっています。自分でも、挑戦してみました。
　ずっと、Javaを使って、アプリやウエブサイトなどを作成して、今回もJavaでしましょう。
　
　課題：AWSのJava SDKで、EC2インスタンス上で動くアプリを使って、AWSサービスの資源をやり取りします。
　ちょっと調べると、複雑そうに見ました。
　
　・Mavenのインストール、Antのインストール、build.xmlの定義。。。Java環境の設定。。。うううう
　ちゃんと読むと、そのアプリはただ、AWS　JavaSDKのJarファイルを作る、使用は普通のJavaと同じだと思います。
　
　・Credentialについては、EC2インスタンスを作成するときは、Roleにつけて、作成すれば、安全です。
　また、ローカルのCredential設定しなくてもいいです。
　
　・RoleにつけられたEC2インスタンスのCredentialを習得するために、「InstanceProfileCredentialsProvider」クラスを使えば、よいです。
　
　・Maven使用しない、Antも使用しない、ただのJavaとAWS　JavaSDK
　よし、やりましょう。

１．EC2インスタンスを作成します。
・t2.micro（無料）
・Role：試のため、EC2AccessのAdmin権限を追加します。
（EC2の作成し方やRoleの作成方、みなさん、Googleさんに聞いてくださいね。（笑））

２．PuttyでSSHを経由して、EC2インスタンスをアクセスします。

>留意：コマンドがよく見えるように、スペースがわざと離れています。

２．１．Java環境の設定：
次のコマンドをゆっくりに入力しましょう。

 //EC2インスタンスをアップデートします。
 > sudo  yum  update  -y

 //javaとjavacが実行できるかどうか確認します。
 $ java  -version

>Java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

$ javac  -version
>コマンドがみつかりませんでした。

※この場合は、次のコマンドを実行しましょう。
$ sudo  yum  group  list
 > Java Development を覚えましょう。

$ sudo  yum  group  install  "Java Development"  -y 
 >Java 環境を設定します。終わったら、もう一度、javac -versionで確認します。
例：javac 1.8.0_65

以上。

２．２．AWSのJava SDKをダウンロードします。
次のコマンドをゆったり入力しましょう。
$wget http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip
>終わったら、解凍します。

$unzip aws-java-sdk.zip
>このフォルダが生成されました。「aws-java-sdk-1.10.45」

以上。

２．３．EC2インスタンスの本当のJavaパスを検出します。
次のコマンドをのんびり入力しましょう。
$ which java
>/usr/bin/java

\$ file $(which java)
>/usr/bin/java: symbolic link to /etc/alternatives/java

$ file /etc/alternatives/java
>/etc/alternatives/java: symbolic link to /usr/java/jdk1.8.0_65/jre/bin/java

$ file /usr/java/jdk1.8.0_65/jre/bin/java
>/usr/java/jdk1.8.0_65/jre/bin/java: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.9, BuildID[sha1]=bd74b7294ebbdd93e9ef3b729e5aab228a3f681b, not stripped

※Javaの本当のパスはこれだ：/usr/java/jdk1.8.0_65/jre/

以上。

２．４．AWSのJavaSDKライブラリを配置します。
次のコマンドをだらだら入力しましょう。
・コピー元：/home/ec2-user/aws-java-sdk-1.10.45/lib/
・コピー先：/usr/java/jdk1.8.0_65/jre/lib/ext
$ sudo 　cp 　/home/ec2-user/aws-java-sdk-1.10.45/lib/*.jar 　/usr/java/jdk1.8.0_65/jre/lib/ext
>すべてAWSのJavaSDKをコピーします。

$ sudo 　cp 　/home/ec2-user/aws-java-sdk-1.10.45/third-party/lib/*.jar 　/usr/java/jdk1.8.0_65/jre/lib/ext
>すべてAWSのThird-partyライブラリーをコピーします。

以上。

２．５．EC2インスタンスのCredentialのリージョンを設定しましょう。
・このEC2インスタンスはRoleつけて、作成されたものなので、アクセスキーや秘密キーを設定しなくても、いいですが。
ジージョンを設定しないといけません。
次のコマンドをささっとにゅうりょくしましょう。
$ aws  configure

>Enterキー
Enterキー
Default region name：ap-northeast-1
Enterキー

以上。


２．６．EC2インスタンスからAWSリソースをやり取りできるかを確認することをわすれずに。。。
・AWS CLIコマンドを入力してみましょう。

$ aws  ec2  describe-instances 
>AWS上の全部EC2インスタンスが表示されます。
※できない場合は確認の必要項目：
・EC2インスタンスを作成したとき、Roleにつけますか？
・Roleの権限はEC2Accessのですか？

以上。

３．Javaファイルを作成してみましょう。
・ファイル名：s3sample.java
・目的：S3にあるすべてのバケット名をゲットして、表示します。

```ruby:s3sample.rb

import java.util.*;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.*;
import com.amazonaws.auth.InstanceProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ListObjectsRequest;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;

public class s3sample{
  public static void main(String[] args){
    try {
      AmazonS3 s3client = new AmazonS3Client(new InstanceProfileCredentialsProvider());
      List<Bucket> listBuckets = s3client.listBuckets();
      int BucketElementNumbers = listBuckets.size();

      for (int i=0;i < BucketElementNumbers ; i++){
        Bucket aBucket = listBuckets.get(i);
        System.out.println(aBucket.getName());
      }
    }catch (AmazonServiceException e){
      System.out.println(e.getMessage());
    }
  }//end main
}//end class
```

以上です。

４．コンパイル
※普段のJavaファイルとして、コンパイルして、実行します。
$ javac s3sample.java
>warning: Supported source version 'RELEASE_6' from annotation processor 'com.amazonaws.eclipse.simpleworkflow.asynchrony.annotationprocessor.AsynchronyDeciderAnnotationProcessor' less than -source '1.8'
1 warning
>無視にします。

$java s3sample
>abc
>ghk
>owari


５．トラブル：
・「ClassNotFound」や「packageがみつかりません。」エラーが発生したら、JavaSDKのコピー先はシステムが使っているJAVA_HOMEかどうか確認しましょう。

・権限がない、EC2インスタンスのRoleを確認しましょう。

・アクセスキーや秘密キーを使いたい場合、２．５のステップに全部記入します。
「InstanceProfileCredentialsProvider」クラスを使わないで、「ProfileCredentialsProvider」クラスを使いましょう。
コードや使い方は「aws-java-sdk.zip」の中にある「Sample」フォルダーを読みましょう。

最後、Amazonサービスはただ、単体の一つサービスを使うことではなく、いっぱいサービスを使用して、システムを構築するのが得意です。
ほかのサービスにも、挑戦しましょう。