AWS Consolidated Billingの管理下アカウント一覧を取得する

AWS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Consolidated Billingの管理下アカウント

AWSでは、支払いに関してアカウントをリンクさせて一括支払いをすることができます。今回はこの情報をプログラムから取得したいと思います。

AWS Account Billingからリンクアカウントを取得する

AWS Account BillingのProgrammatic Accessによって生成されるCSVの中には、リンクアカウントの情報が含まれています。そこで、今回はリンクアカウントの一覧を取得したいと思います。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Iterator;

import au.com.bytecode.opencsv.CSVReader;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;

public class ConsolidatedBillingAccounts {

	private static String MY_ACCOUNT_NUMBER = "XXXXXXXXXXXX";
	private static String BILLING_BUCKET_NAME = "cm-billing";
	private static String YEAR = "2012";
	private static String MONTH = "06";
	private static int ACCOUNT_COLUMN = 2;

	public static void main(String[] args) throws IOException {

		AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(
				ConsolidatedBillingAccounts.class
						.getResourceAsStream("AwsCredentials.properties")));

		String objectName = MY_ACCOUNT_NUMBER + "-aws-billing-csv-" + YEAR + "-" + MONTH + ".csv";

		try {
			S3Object object = s3.getObject(new GetObjectRequest(BILLING_BUCKET_NAME, objectName));
			displayTextInputStream(object.getObjectContent());
		} catch (AmazonServiceException ase) {
			System.out.println(ase);
		} catch (AmazonClientException ace) {
			System.out.println(ace);
		}
	}

	private static void displayTextInputStream(InputStream input)
			throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(input));
		CSVReader reader = new CSVReader(br);
		String[] nextLine;
		HashSet<String> set = new HashSet<String>();
		
		while (true) {
			nextLine = reader.readNext();
			if (nextLine == null)break;
			if(!isEmpty(nextLine[ACCOUNT_COLUMN])){
				if(!nextLine[ACCOUNT_COLUMN].equals("LinkedAccountId")){
					set.add(nextLine[ACCOUNT_COLUMN]);									
				}
			}
		}
		
		Iterator<String> linkedAccountIterator = set.iterator();
		int count = 0;
		while (linkedAccountIterator.hasNext()) {
			String linkedAccount = linkedAccountIterator.next();
			count++;
			System.out.println(linkedAccount);
		}
		System.out.println("Account Count : "+count);
	}
	

	private static boolean isEmpty(Object obj){
		if(obj == null){
			return true;
		}
		if(obj instanceof String){
			if(((String)obj).equals("")){
				return true;
			}
		}
		return false;
	}

}

以下は実行結果です。

XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
Account Count : 10

まとめ

AWS Account BillingのProgrammatic Accessから出力されるCSVを使って、AWS Consolidated Billingの管理下アカウント一覧を取得することができました。さらにアカウント毎で使用しているサービスの使用額も分かりますので、かなり詳細な情報をプログラムから取得できそうです。今日から君も複数の魔法を唱える大魔導士!!