読者です 読者をやめる 読者になる 読者になる

[AWS][EC2]最新のAmazonLinuxのAMI-IDを取得する

前回の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は積極的に利用した方がパフォーマンス的にも良いです。ワイルドカードも使えるので、極力絞る事をおすすめします。