AWS SDK for JavaでProfileに設定したCredential情報を取得する

AWS

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。

Talendで作ったジョブをAWS サービスを使う時にローカル開発とEC2で動かす時に同一のジョブ定義で動かしたいけど、 その時クレデンシャルの管理はこんなふうになるよねって話です。

  • AWS の各種サービスを用いる認証情報はEC2で動くアプリケーションならばEC2に付与しましょう。
  • ローカル開発環境では、環境変数なりシステムプロパティなりに、自分の持っているIAMのクレデンシャルを突っ込んでおきましょう。

これはのAWSで開発している人間からすれば耳タコなお話です。

IAMによるAWS権限管理運用ベストプラクティス (2)

フルスクラッチで作っている時は上記の方針でやれば問題ないのですが、さまざまなケースでIAM Roleが非対応だったり、 対応されていても、それローカル環境でどうやってつかうのって実装だったりすることがあったりもします。

要はTalendが上記のケースに合致します。 Talendは6.2からIAM Roleの対応をしているのですが、IAM Roleを用いようとすると必ずメタデータからクレデンシャルを取得しようとするため、 ローカル開発では用いることができません。

Talend Open Studio for Data Integration 6.2.0を触ってみた。 | Developers.IO

環境変数にcredentialを登録しておいてその値を参照するといったことも考えたのですが、Profileに設定することでAWS SDKから取得できるようにしました。

Profileに設定したCredentialの取得

検証環境

以下の環境で検証しました。

  • aws-cli 1.11.44
  • JAVA 1.8.0_25
  • aws-java-sdk 1.11.81

Profileの作成

AWS CLI から作成していきます。

$ aws configure --profile anothersystem
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]:
Default output format [None]:

補足 上記で用いているAccess Key とSecret Access KeyはAWS の公式ドキュメントで用いられているものを用いています。

アクセスキーについて | AWS

AWS SDK for JavaからCredentialの参照

こちらはAWS SDK for Javaを取り込んだプロジェクト内で実装を進めていきます。 今回は作例としての意図なので、単純に参照して出力しているだけの内容となります。

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;

public class Sample {
    public static void main(String args[]){
        AWSCredentialsProvider provider = new ProfileCredentialsProvider("anothersystem");
        System.out.println("Your AWS Access Key ID is "+  provider.getCredentials().getAWSAccessKeyId());
        System.out.println("Your Secret Access Key is " + provider.getCredentials().getAWSSecretKey());
    }
}

実際に実行してみると以下のように値が参照できているのがわかります。 Talendで用いるならば取得した値をglobalmap等に格納し、Credentialを用いることが可能となります。 上記を動かした結果が以下になります。

Your AWS Access Key ID is AKIAIOSFODNN7EXAMPLE
Your Secret Access Key is wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

まとめ

AWSのCredentialをコードには埋め込まず、かつSDKから取得する方法を探りました。

本来はIAM Roleを用いて、Credentialを取得するといったことはしないで実装としたいものですが、 ライブラリや使うツールの都合でそれらが難しい場合の解決作として上記の方法を考にしていただければと思います。