きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

AWS SDK for Java 2.0 ×Windows 10 × 環境構築手順の忘備録

この記事の目的

この記事では、
JAVA & AWS初心者によるAWS開発の環境構築手順のメモ
を目的としています。

AWSJavaSDKを使っていろいろな操作を実装するために、開発環境を構築しようとしています。当初はVS Codeを使うことを検討しましたが、スキル不足で難しかったので、とりあえずはEclipseを中心とした基本的な開発環境を用意します。
以下の公式手順を進めたときに悩んだことのまとめです。


本題

AWSにサインアップし・・・

AWSでIAMユーザを作成するステップです。特に迷わず作成することができます。※AWSのアカウントさえあれば・・・。

docs.aws.amazon.com


SDKをセットアップする①

SDKをセットアップするには、適切なJava開発環境が必要となります。適切な開発環境は以下の通りです!

===
AWS SDK for Java には Java 8.0 以降が必要です。最新の Java SE Development Kit ソフトウェアは http://www.oracle.com/technetwork/java/javase/downloads/ からダウンロードできます。
AWS SDK for Java は OpenJDK と Amazon Corretto (Open Java Development Kit (OpenJDK) のディストリビューション) でも機能します。最新の OpenJDK バージョンは https://openjdk.java.net/install/index.html からダウンロードしてください。最新の Amazon Corretto 8 または Amazon Corretto 11 バージョンは https://aws.amazon.com/corretto/ からダウンロードしてください。
===

と、いうことで、JDKの最新版をダウンロードして、インストールします。
f:id:kinakomotitti:20190524195518p:plain
Windows 64bit環境なので、jdk-12.0.1_windows-x64_bin.zipをダウンロードしました。※ダウンロードには、Oracleのアカウントが必要となります。


SDKのセットアップには、JDKのほかに、AWSアカウントおよびアクセスキーが必要になります。これは、既にIAMを設定したときに確認ができているので大丈夫そうです。

最後に、AWSの認証情報の【設定】が必要になります。詳細は以下の通りです。※アクセスキーはAWSコンソールのIAMで生成することができますが、アクセスキーを表示できるのは、作成するタイミグのみとなるので、注意が必要です。
f:id:kinakomotitti:20190524195610p:plain

コマンドプロンプトで以下のコマンドを実行します。コマンド出なくても、システム環境の設定からも設定をすることができます。

set AWS_ACCESS_KEY_ID=【your_access_key_id】
set AWS_SECRET_ACCESS_KEY=【your_secret_access_key】

アクセスキーと同様に、AWSのサービスを配置するリージョンの設定も必要となります。会設定方法は以下の通りです。

set AWS_REGION=【your_aws_region】

なお、リージョンの英語名は以下のページで紹介されています。
docs.aws.amazon.com


ここまでで、SDKをプロジェクトに含めるための前提条件が整いました。


SDKをセットアップする②

次のステップでは、プロジェクトにSDKを含めていきます。ここで、MavenとGradleのどちらかのツールを選択して、JavaAWSSDK)をビルドすることができます。それぞれについてよくわかっていませんが、Mavenを使っていく方針で作業を進めていこうと思います。

まだ開発環境にMavenがインストールできていないので、まずは
インストールしていきます。以下のサイトを参考に作業を行いました。
https://qiita.com/ko2a/items/15343ea8fae4233e9438
※↑では、認証プロキシ環境下での設定もまとめられていてとても分かりやすかったです。

最終的に、【Maven -v】コマンドが実行できるところまで確認ができれば設定完了です。

Mavenの設定が完了したら、パッケージの作成を行います。以下のコマンドをコマンドプロンプトで実行します。※DgroupId、DartifactIdをそれぞれ、適切な完全パッケージ名前空間、プロジェクト名に置き換えて実行します。

mvn -B archetype:generate  -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=org.example.basicapp -DartifactId=myapp

このまま実行すると、カレントディレクトリに以下のようなプロジェクトが作成されます。

C:.
└───src
├───main
│ └───java
│ └───org
│ └───example
│ └───basicapp
└───test
└───java
└───org
└───example
└───basicapp

この後、Java1.8に対応したプロジェクトに変更するための作業がありますが、Mavenのコマンドを以下のようにして実行することで、その作業をスキップすることができます。POMファイルの変更とかやったことないので、とりあえず↓のコマンドで作業をすすめます。

mvn archetype:generate -B -DarchetypeGroupId=pl.org.miki  -DarchetypeArtifactId=java8-quickstart-archetype -DarchetypeVersion=1.0.0 -DgroupId=com.example -DartifactId=sdk-sandbox -Dversion=1.0 -Dpackage=com.example

最後に、Maven依存関係として、SDKを設定していきます。手順のサイトには、Version2.3.9が利用されていましたが、バージョンが更新されていたので、Ver 2.5.49を利用することにしました。最新バージョンについては、以下のサイトで確認することができます。
mvnrepository.com

なお、この記事Topで示した公式の手順サイトで張られているリンク先のMavenリポジトリは、SDK Versino 1.0のときのものなので、注意が必要です。

それでは、先ほど作成したプロジェクトのPOMファイルに、以下の情報を追加します。

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>software.amazon.awssdk</groupId>
			<artifactId>bom</artifactId>
			<version>2.5.49</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>


また、今回は、とりあえずSQSにメッセージを登録することでHelloWorldとさせていただこうと思いますw
ので、SQSに対するSDKの依存関係をPOMに登録します。
mvnrepository.com

<dependency>
	<groupId>software.amazon.awssdk</groupId>
	<artifactId>sqs</artifactId>
</dependency>


ここまで設定することで、プロジェクトの設定が完了しました。ここまでの設定が適切に行われているか確認するため、プロジェクトのビルドを実行します。以下のコマンドを実行し、Build Successになることを確認します。

cd プロジェクトフォルダ
mvn package



SDKをセットアップする③

SDKのセットアップ作業の最後の作業は、SDKコンパイルするとのことです。Mavenで依存関係解決しただけではだめなのか・・・

SDKのビルドは、GitHubからソースコードをダウンロードし、Mavenのコマンドを使って実行します。あらかじめ、環境変数JAVA_HOMEが設定されているか確認しておくと良いかと思います。自分の環境ではまずそこで躓きましたw

以下のコマンドを実行し、SDKのビルドとインストールを行います。

mvn clean install



・・・ここでエラーが発生!

原因不明のため、別の方針で作業を進めます。


EclipseMavenで環境構築

まず、Eclipseを以下のサイトからダウンロードして、適当な場所に展開します。自分の環境では、Cドライブ直下に配置しました。
mergedoc.osdn.jp


次に、以下のサイトを参考に、Mavenプロジェクトを作成します。ここで一つ注意点があります。上記の失敗例でやってきたとおり、デフォルトの設定でMavenプロジェクトを作成すると、JavaSE-1.5を参照する設定のプロジェクトが出来上がります。AWS SDKのVersion2からは、1.8以上が必要となるため、プロジェクト作成後、Javaのビルドパスから、JREシステムライブラリのバージョンを変更する必要があります。
yuu.1000quu.com
f:id:kinakomotitti:20190524195634p:plain

また、依存関係は、以下のサイトから、必要なものを追加していきます。自分の環境では、SQSのSDKだけあればよいので、SQSだけ設定しました。
mvnrepository.com
f:id:kinakomotitti:20190524195640p:plain


Javaコードの実装

公式ドキュメント+公式Githubのサンプルを参考に、以下のコードを実装し動作確認をします。正常にコンパイルができ、実行することができると、先の手順で設定したIAMユーザー情報を利用し、設定したリージョンにSQSのキューが作成され、Helloworldというメッセージが登録されます。キューの名前の設定上、実行するたびに新しいキューが作成されていくので、試すときには注意が必要です。
docs.aws.amazon.com

package groupIs.artifact;

import software.amazon.awssdk.regions.Region;
//snippet-start:[sqs.java.sqs_example.import]
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;
import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;
import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;
import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;
import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;
import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;
import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;
import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;
import software.amazon.awssdk.services.sqs.model.Message;
import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;
import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

/**
 * Hello world!
 *
 */
public class App
{
    public static void main( String[] args )
    {
        String queueName = "queue" + System.currentTimeMillis();
        SqsClient sqsClient = SqsClient.builder().region(Region.US_WEST_2).build();

        System.out.println("\nCreate Queue");
        // snippet-start:[sqs.java.sqs_example.create_queue]
        CreateQueueRequest createQueueRequest = CreateQueueRequest.builder().queueName(queueName).build();
        sqsClient.createQueue(createQueueRequest);
        // snippet-end:[sqs.java.sqs_example.create_queue]

        System.out.println("\nGet queue url");
        // snippet-start:[sqs.java.sqs_example.get_queue]
        GetQueueUrlResponse getQueueUrlResponse =
                sqsClient.getQueueUrl(GetQueueUrlRequest.builder().queueName(queueName).build());
        String queueUrl = getQueueUrlResponse.queueUrl();
        System.out.println(queueUrl);
        // snippet-end:[sqs.java.sqs_example.get_queue]


        System.out.println("\nList Queues");
        // snippet-start:[sqs.java.sqs_example.list_queues]
        String prefix = "que";
        ListQueuesRequest listQueuesRequest = ListQueuesRequest.builder().queueNamePrefix(prefix).build();
        ListQueuesResponse listQueuesResponse = sqsClient.listQueues(listQueuesRequest);
        for (String url : listQueuesResponse.queueUrls()) {
        	System.out.println(url);
        }
        // snippet-end:[sqs.java.sqs_example.list_queues]

        // List queues with filters
        String name_prefix = "queue";
        ListQueuesRequest filterListRequest = ListQueuesRequest.builder()
        		.queueNamePrefix(name_prefix).build();

        ListQueuesResponse listQueuesFilteredResponse = sqsClient.listQueues(filterListRequest);
        System.out.println("Queue URLs with prefix: " + name_prefix);
        for (String url : listQueuesFilteredResponse.queueUrls()) {
            System.out.println(url);
        }

        System.out.println("\nSend message");
        // snippet-start:[sqs.java.sqs_example.send_message]
        sqsClient.sendMessage(SendMessageRequest.builder()
                .queueUrl(queueUrl)
                .messageBody("Hello world!")
                .delaySeconds(10)
                .build());
    }
}


★実行結果

無事、登録されていることを確認できました。
f:id:kinakomotitti:20190524195655p:plain


まとめ

AWSSDKで開発を始めるには、
1)EclipseJavaのインストール。
2)Mavenプロジェクトの作成。
3)依存関係の解決(登録?)。
4)環境変数に、IAMのシークレット情報の登録+リージョン設定
で行けるっぽい!

注意点としては、SDKのバージョンによって、参照するサイトが違うので、今見ているサイトがどちらのバージョンであるか確認しておかないと迷子になるということがあげられます。