LoginSignup
0
0

More than 1 year has passed since last update.

EclipseからAWSの機械学習サービスを使用する

Posted at

はじめに

Eclipse(ローカル環境)で開発しているJava(Spring Boot)アプリケーションからAWSの機械学習サービスを使うのに苦労したので備忘録として残しておきます。

AWSの機械学習サービスといっても色々ありますが、今回私が使用したのはAmazon Comprehend(自然言語処理サービス)です。公式ドキュメントに従って設定すればよいのですが、簡単そうで意外とハマりました。

環境

以下、私の環境です。

  • Windows 10
  • Eclipse 2019
  • Java 11
  • Spring Boot 2.6.4

AWS IAMの作成

まずはIAMを作成します。

認証情報タイプは「アクセスキー・プログラムによるアクセス」を選択します。
1_プログラムによるアクセス.png

今回はポリシーとして"ComprehendFullAccess"を選択します。
2_ポリシー.png

IAMの作成を完了すると最後に「アクセスキーID」と「シークレットアクセスキー」が表示されますので、CSVをダウンロードして手元に控えておきましょう。

AWS SDKの導入

機械学習サービスに限らずですが、AWSをJavaアプリケーションから使うためのAPIとしてAWS SDK for Javaが提供されています。その中でもEclipse専用のSDKがあるため、Eclipseマーケットプレースからインストールします。
3_ツールキット.png

インストール後、Eclipseを再起動してこちらのポップアップが出た場合、先ほど控えたアクセスキー(「アクセスキーID」と「シークレットアクセスキー」)を入力します。
7_ポップアップ.png

ポップアップが出ない場合でも、[ウィンドウ] - [設定] - [AWSツールキット]から入力できます。
8_AWSツールキット.png

プロファイル名はひとまずdefaultのままで問題ありません。アクセスキーを入力し、[適用して閉じる]を押下すると、拡張子なしの証明書ファイル(credentials)がC:\Users\<ユーザ名>\.awsに自動的に作成されます。

証明書ファイルは以下のような内容になっています。

credentials
[default]
aws_access_key_id=<アクセスキーID>
aws_secret_access_key=<シークレットアクセスキー>

また、必要があればビルドツールもインストールしておきます。

環境変数の設定

次に下記3つの環境変数を設定します。

  • AWS_ACCESS_KEY_ID:アクセスキーID
  • AWS_REGION:今回は東京リージョンが利用可能なためap-northeast-1を設定しますが、使用するサービスが対応しているリージョンに適宜変更してください。
  • AWS_SECRET_ACCESS_KEY:シークレットアクセスキー
    5.png

サンプルコードを動かす

いよいよサンプルコードの動作確認です。今回は一例として、感情分析を行うDetectSentiment.javaをコピペして利用させていただきます。新規にSpringプロジェクト(ビルドツールはGradleを使用)を作成し、DetectSentiment.javaを配置します。サンプルコード内のクラス名やtextregionlanguageCodeを必要に応じて適宜変更します。

このままだとimport文のところでエラーが出るため、Setting up a Gradle projectを参考にbuild.gradleに下記を追記します。

build.gradle
dependencies {
    ...
    implementation platform('software.amazon.awssdk:bom:2.17.145')
    implementation 'software.amazon.awssdk:comprehend'
    ...
}

エラーが消えたのでDetectSentiment.javaを実行します!
が、Eclipseのコンソール上に下記のエラーが出力されました。

software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from system settings. Access key must be specified either via environment variable (AWS_ACCESS_KEY_ID) or system property (aws.accessKeyId).

環境変数にセットした「アクセスキーID」と「シークレットアクセスキー」がうまく読み込めてないと思われます・・・。

改めて公式ドキュメントUsing credentialsを確認したところ、EnvironmentVariableCredentialsProviderクラスを使用しないとシステム環境変数が読み込めないようです。ということでDetectSentiment.javaに下記を追記しました。

DetectSentiment.java
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;  //追記
...
ComprehendClient comClient = ComprehendClient.builder()
        .region(region) 
        .credentialsProvider(EnvironmentVariableCredentialsProvider.create())  //追記
        .build();
...

DetectSentiment.javaを再度実行!動きました!長いログがコンソールに出力されますが、下から13行目?くらいにThe Neutral value is 〇〇〇と分析結果が見事に出力されました。

補足

Amazon Comprehend Developer Guideのサンプルコードだとimport com.amazonawsの記述が見られます。一方、今回使用したAWS Code Sample Catalogではimport software.amazon.awssdkになっています。この違いはAWS SDK for Javaのバージョン違いによるものです(参考)。

最後に

AWSの機械学習サービスをJavaアプリケーションで使うという題材の日本語記事が非常に少なく、必然的に英語の公式ドキュメントで調べることになりました。振り返ってみると特別難しいことはしてないのですが、思ったより大変な道のりでした・・・。

また、EclipseからAmazon Comprehendを使用するときの設定について説明しましたが、その他のAWS機械学習サービスを使用する際にも共通的に使える部分が多いのではないかと思います。今後、JavaからAWS機械学習サービスを使うのに挑戦する方の一助になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0