前回のBlogがエイプリルフールのネタで、このままだと不真面目と思われかねないのでAWSネタでフタを。
AWS SDKでEC2を起動するためのコードを書く場合にAMIのIDを指定しますが、一度IDを埋め込んでしまうとAMIの更新があって古いAMIが消えてしまう場合(往々にしてAmazonLinuxを使っている場合に発生)、正しくコードが動かなくなってしまいます。
過去に客先デモでこのシチュエーションにハマって今は自前AMIのIDを使用する事で事なきを得ていますが、常に直近のAMIが使いたい場合には対応出来ません。
ということで、試しに直近のAmazonLinuxのAMI-IDを取得するコードを書いてみました。コードは例によってJavaです。
public static void main(String[] args) throws Exception { AWSCredentials credentials = new PropertiesCredentials( EC2StopEducationSample.class .getResourceAsStream("/AwsCredentials.properties")); AmazonEC2 ec2 = new AmazonEC2Client(credentials); ec2.setEndpoint("ec2.ap-northeast-1.amazonaws.com"); DescribeImagesResult result = ec2.describeImages(new DescribeImagesRequest().withOwners("amazon") .withFilters(new Filter("root-device-type").withValues("ebs")) .withFilters(new Filter("virtualization-type").withValues("paravirtual")) .withFilters(new Filter("architecture").withValues("x86_64")) .withFilters(new Filter("owner-id").withValues("137112412989")) .withFilters(new Filter("name").withValues("amzn-ami-pv-*")) ); List<Image> images = result.getImages(); Collections.sort(images,new Comparator<Image>() { public int compare(Image o1, Image o2) { return -o1.getName().compareTo(o2.getName()); }; }); String amiId = images.get(0).getImageId(); System.out.println(amiId); }
キモはFilter部分でになります。owner-idやname部分は今現在のAmazonLinuxから取れる情報に頼っているため、ここが変わるとこのコードは使えなくなりますがしばらくは大丈夫でしょう。
ちなみにdescribe系のAPIを使用するときは、Filterは積極的に利用した方がパフォーマンス的にも良いです。ワイルドカードも使えるので、極力絞る事をおすすめします。