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 コメント:
コメントを投稿