この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
IAM Roleの動作確認
以前、dynodeなどの非AWS謹製SDKを使ってIAM Roleの動作確認をしようとおもったら、やはりよろしく対応してくれていなくて困りました。そこで、今回は、AWS謹製のAWS SDK for Javaを使ってIAM Roleを使うと本当にCredential指定が必要ないのか!?を検証したいと思います。動作確認するEC2インスタンスは、事前にIAM Role指定で起動しておいてください。ポリシーは無しでお願いします。
AWS SDK for Javaのセットアップ
まずはJava開発用のインストール
$ sudo yum install ant
$ sudo yum install java-1.6.0-openjdk-devel
$ javac -version
javac 1.6.0_22
そして、AWS SDK for Javaのダウンロード
$ wget http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip
$ unzip aws-java-sdk.zip
これで下準備完了です。
Credential指定を外す
AWS SDK for Javaのサンプルプログラムを例にCredential指定を外したいと思います。今回は、DynamoDBのサンプルであるAmazonDynamoDBSample.javaを例にとります。
$ cd aws-java-sdk-1.3.11/samples/AmazonDynamoDB/
$ vi AmazonDynamoDBSample.java
initメソッドの中でCredential指定している部分をコメントアウトします。次に、ついでにEndpointを東京リージョンにします。って、リージョン指定もよろしく同じにしてほしいところです。
private static void init() throws Exception {
//AWSCredentials credentials = new PropertiesCredentials(
//AmazonDynamoDBSample.class.getResourceAsStream("AwsCredentials.properties"));
//dynamoDB = new AmazonDynamoDBClient(credentials);
dynamoDB = new AmazonDynamoDBClient();
dynamoDB.setEndpoint("https://dynamodb.ap-northeast-1.amazonaws.com");
}
Antで実行
そしてAntコマンドを実行すると、以下のようにエラーになりました。AccessDeniendということで期待通りです。これは、IAM Roleの設定をしていないからです。
$ ant
Buildfile: build.xml
run:
Caught an AmazonServiceException, which means your request made it to AWS, but was rejected with an error response for some reason.
Error Message:
HTTP Status Code: 400
AWS Error Code: AccessDeniedException
Error Type: Client
Request ID: ME2HGJS27FC67AKJKV4MRBBGB3VV4KQNSO5AEMVJF66Q9ASUAAJG
BUILD SUCCESSFUL
Total time: 3 seconds
以下はIAM Roleの画面でEC2インスタンスに付与したRoleのポリシー一覧です。何もありません。
そこで、DynamoDBへのアクセスポリシーを追加します。
ポリシー一覧からDynamoDBへのアクセス権限をもったポリシーを作成します。
はい、ポリシー付与完了です。
それでは、改めてantを使って動作確認します。
$ ant
Buildfile: build.xml
run:
Created Table: {TableName: my-favorite-movies-table, KeySchema: {HashKeyElement: {AttributeName: name, AttributeType: S, }, }, TableStatus: CREATING, CreationDateTime: Thu Jun 21 18:53:12 UTC 2012, ProvisionedThroughput: {ReadCapacityUnits: 10, WriteCapacityUnits: 10, }, }
Waiting for my-favorite-movies-table to become ACTIVE...
- current state: CREATING
- current state: ACTIVE
Table Description: {TableName: my-favorite-movies-table, KeySchema: {HashKeyElement: {AttributeName: name, AttributeType: S, }, }, TableStatus: ACTIVE, CreationDateTime: Thu Jun 21 18:53:12 UTC 2012, ProvisionedThroughput: {ReadCapacityUnits: 10, WriteCapacityUnits: 10, }, TableSizeBytes: 0, ItemCount: 0, }
Result: {ConsumedCapacityUnits: 1.0, }
Result: {ConsumedCapacityUnits: 1.0, }
Result: {Items: [{fans={SS: [James, Sara], }, name={S: Bill & Ted's Excellent Adventure, }, year={N: 1989, }, rating={S: ****, }}], Count: 1, ScannedCount: 2, ConsumedCapacityUnits: 0.5, }
BUILD SUCCESSFUL
Total time: 44 seconds
成功しましたね〜
まとめ
Credential指定無しで確かにアクセスすることができました!一切Credential情報を記述する事無く、起動するインスタンス毎にIAM Roleでポリシーを設定できるので、自作AMI公開時に機密情報が漏れる心配もありません。益々使いやすくなりましたね。今回、実はAWS Beanstalkでやろうと思ったのですが、IAM Roleの設定項目を管理コンソールから確認できなくてJavaの設定から行いました。Javaってクラスパスの設定が面倒ですね。Ant書くのも面倒。サクっと全自動でできないものでしょうか。最近はnode.jsに慣れすぎたかなw
参考資料
【AWS発表】IAM roles for EC2 instances – シンプルに安全にEC2からAWSサービスのAPIにアクセス可能に