2014年9月27日

Java SDKでリージョンを判断する方法

AWS Java Development Blog にリージョンを判断する方法が Post されていました。

API を呼び出すときは通常リージョンを指定する必要があります。
通常はリージョンをハードコーディングしたり、プロパティファイルに設定していますでしょうか?

こちらを動的にリージョンを判断することで、どのリージョンにデプロイしてもそのリージョンに限定した API を実行することができます。
たとえば東京リージョンのバックアップとしてシンガポールリージョンで動かそうとする場合、東京リージョンの API を呼び出すと意味が無くなります。

方法としてはブログにある通り、com.amazonaws.regions.Regions#getCurrentRegion() を呼び出すことになります。

Regions クラスのソースを確認すると、com.amazonaws.regions.EC2MetadataUtils#getInstanceInfo() を呼び出しています。
https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/regions/Regions.java

こちらを見ると、EC2 のメタデータ http://169.254.169.254//latest/dynamic/instance-identity/document/ から取得できる json の region を取得しているようです。
https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/util/EC2MetadataUtils.java

EC2 の MetaData はこんな感じで確認できます。確かに region がありますね。

$ curl 169.254.169.254/latest/dynamic/instance-identity/document/
{
"instanceId" : "i-12345678",
"billingProducts" : null,
"imageId" : "ami-12345678",
"pendingTime" : "2014-09-31T24:00:00Z",
"instanceType" : "t2.micro",
"architecture" : "x86_64",
"accountId" : "123456789012",
"ramdiskId" : null,
"kernelId" : "aki-12345678",
"region" : "ap-northeast-1",
"version" : "2010-08-31",
"privateIp" : "10.0.0.10",
"availabilityZone" : "ap-northeast-1c",
"devpayProductCodes" : null
}

JavaDoc に EC2 インスタンス上ではない場所で実行した場合には null となります。
これはインスタンスのメタデータが取れないからです。

これを活用してマルチリージョンでのデプロイを楽しみましょう~

0 コメント:

コメントを投稿