はじめに
Eclipse(ローカル環境)で開発しているJava(Spring Boot)アプリケーションからAWSの機械学習サービスを使うのに苦労したので備忘録として残しておきます。
AWSの機械学習サービスといっても色々ありますが、今回私が使用したのはAmazon Comprehend(自然言語処理サービス)です。公式ドキュメントに従って設定すればよいのですが、簡単そうで意外とハマりました。
環境
以下、私の環境です。
- Windows 10
- Eclipse 2019
- Java 11
- Spring Boot 2.6.4
AWS IAMの作成
まずはIAMを作成します。
認証情報タイプは「アクセスキー・プログラムによるアクセス」を選択します。
今回はポリシーとして"ComprehendFullAccess"を選択します。
IAMの作成を完了すると最後に「アクセスキーID」と「シークレットアクセスキー」が表示されますので、CSVをダウンロードして手元に控えておきましょう。
AWS SDKの導入
機械学習サービスに限らずですが、AWSをJavaアプリケーションから使うためのAPIとしてAWS SDK for Javaが提供されています。その中でもEclipse専用のSDKがあるため、Eclipseマーケットプレースからインストールします。
インストール後、Eclipseを再起動してこちらのポップアップが出た場合、先ほど控えたアクセスキー(「アクセスキーID」と「シークレットアクセスキー」)を入力します。
ポップアップが出ない場合でも、[ウィンドウ] - [設定] - [AWSツールキット]から入力できます。
プロファイル名はひとまずdefault
のままで問題ありません。アクセスキーを入力し、[適用して閉じる]を押下すると、拡張子なしの証明書ファイル(credentials
)がC:\Users\<ユーザ名>\.aws
に自動的に作成されます。
証明書ファイルは以下のような内容になっています。
[default]
aws_access_key_id=<アクセスキーID>
aws_secret_access_key=<シークレットアクセスキー>
また、必要があればビルドツールもインストールしておきます。
- Mavenの場合:https://maven.apache.org/
- Gradleの場合:https://gradle.org/
環境変数の設定
次に下記3つの環境変数を設定します。
-
AWS_ACCESS_KEY_ID
:アクセスキーID -
AWS_REGION
:今回は東京リージョンが利用可能なためap-northeast-1
を設定しますが、使用するサービスが対応しているリージョンに適宜変更してください。 -
AWS_SECRET_ACCESS_KEY
:シークレットアクセスキー
サンプルコードを動かす
いよいよサンプルコードの動作確認です。今回は一例として、感情分析を行うDetectSentiment.javaをコピペして利用させていただきます。新規にSpringプロジェクト(ビルドツールはGradleを使用)を作成し、DetectSentiment.java
を配置します。サンプルコード内のクラス名やtext
、region
、languageCode
を必要に応じて適宜変更します。
このままだとimport
文のところでエラーが出るため、Setting up a Gradle projectを参考に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
に下記を追記しました。
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機械学習サービスを使うのに挑戦する方の一助になれば幸いです。