AWSサポート関連の情報(Support Case & Trusted Advisor)にAPIアクセスする

サポート情報にAPIアクセスする

世の中にある様々な商品やサービスのサポート情報へのアクセスは、電話・メール・対面など、何かしら人が対応する必要があり、多少の工数追加は仕方ないと思う方も多いのではないでしょうか。AWSは、全てのリソースへのアクセスにAPIを用意するという理念の下(私が勝手に想像しましたw )、あらゆるサービスにAPIを用意しています。このたび、AWSサポートのビジネスとエンタープライズ向けにAWSサポート関連の情報へアクセスするためにAPIが用意されました!

用意されているAPI

現在公開されているAWSサポート情報アクセスのAPIはいかになります。

  • Support Case Management
  • AWS Trusted Advisor

Support Case Management

  • サポートケースをオープン
  • 一覧と詳細の表示
  • 解決済みを含む、日付や文字列による検索
  • やり取りしたり、連絡先のメールアドレスを記述
  • サポートケースを解決

AWS Trusted Advisor

  • チェック項目と名前の取得
  • アカウントとリソースに対してチェックを依頼
  • サマリーや詳細情報を取得
  • チェックの更新依頼
  • それぞれのチェックのステータスを取得

サポートケースに関するAPI

support-001

サービスとカテゴリ一覧

サポートケースを作成する際に、サービス名とカテゴリを指定します。どんなものが指定できるのか確認してみましょう。

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.support.AWSSupportClient;
import com.amazonaws.services.support.model.Category;
import com.amazonaws.services.support.model.DescribeServicesRequest;
import com.amazonaws.services.support.model.DescribeServicesResult;
import com.amazonaws.services.support.model.Service;

public class AWSSupportApp {

	public static void main(String[] args) {

		AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
		AWSSupportClient support = new AWSSupportClient(credentialsProvider);

		DescribeServicesRequest request = new DescribeServicesRequest();
		request.withLanguage("ja");
		DescribeServicesResult result = support.describeServices(request);
		for (Service service : result.getServices()) {
			System.out.println("サービス名 : " + service.getName() + "(" + service.getCode() + ")");
			for (Category category : service.getCategories()){
				System.out.println("	カテゴリ名 : " + category.getName() + "(" + category.getCode() + ")");
			}
		}

	}
}

実行結果は以下です。(件数が多いため省略して表示しています。)

・・・
サービス名 : Elastic Compute Cloud (EC2 - Linux)(amazon-elastic-compute-cloud-linux)
	カテゴリ名 : その他(other)
	カテゴリ名 : 新機能・改善のご要望(feature-request)
	カテゴリ名 : APIs(apis)
	カテゴリ名 : 一般的なご質問(general-guidance)
	カテゴリ名 : インスタンス関連(instance-issue)
	カテゴリ名 : Apache(apache)
	カテゴリ名 : ディスクの設定(disk-configurations)
	カテゴリ名 : Eメールサービス(email-services)
	カテゴリ名 : FTP(ftp)
	カテゴリ名 : MySQL(mysql)
	カテゴリ名 : VPNソリューション(vpn-solutions)
	カテゴリ名 : 予定されたイベント(scheduled-event)
・・・

優先順位

サポートケースを登録する際に指定する優先順位の一覧です。

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.support.AWSSupportClient;
import com.amazonaws.services.support.model.DescribeSeverityLevelsRequest;
import com.amazonaws.services.support.model.DescribeSeverityLevelsResult;
import com.amazonaws.services.support.model.SeverityLevel;

public class AWSSupportApp {

	public static void main(String[] args) {

		AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
		AWSSupportClient support = new AWSSupportClient(credentialsProvider);

		DescribeSeverityLevelsRequest request = new DescribeSeverityLevelsRequest();
		request.withLanguage("ja");
		DescribeSeverityLevelsResult result = support.describeSeverityLevels(request);
		for (SeverityLevel level : result.getSeverityLevels()) {
			System.out.println("優先順位 : " + level.getName() + "(" + level.getCode() + ")");
		}
	}
}

実行結果は以下です。

優先順位 : 低(low)
優先順位 : 標準(normal)
優先順位 : 高(high)
優先順位 : 緊急(urgent)

サポートケースの新規作成

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.support.AWSSupportClient;
import com.amazonaws.services.support.model.CreateCaseRequest;
import com.amazonaws.services.support.model.CreateCaseResult;

public class AWSSupportApp {

	public static void main(String[] args) {
		AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
		AWSSupportClient support = new AWSSupportClient(credentialsProvider);

		CreateCaseRequest request = new CreateCaseRequest()
				.withServiceCode("amazon-elastic-compute-cloud-linux")
				.withCategoryCode("feature-request")
				.withLanguage("ja")
				.withCcEmailAddresses("hogehoge@example.com")
				.withCommunicationBody("test support api from java programming")
				.withSubject("TEST SUPPORT")
				.withSeverityCode("low");

		CreateCaseResult result = support.createCase(request);
		System.out.println("ケースID : "+ result.getCaseId());
	}
}

実行結果は以下です。

ケースID : case-XXXXXXXXXXXX-mjja-2013-8e1b13345c3bXXXX

サポートケースの一覧

import java.util.List;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.support.AWSSupportClient;
import com.amazonaws.services.support.model.CaseDetails;
import com.amazonaws.services.support.model.DescribeCasesRequest;
import com.amazonaws.services.support.model.DescribeCasesResult;

public class AWSSupportApp {

	public static void main(String[] args) {
		AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
		AWSSupportClient support = new AWSSupportClient(credentialsProvider);

		DescribeCasesRequest request = new DescribeCasesRequest()
			.withLanguage("ja")
			.withIncludeResolvedCases(true);

		DescribeCasesResult result = support.describeCases(request);
		List<CaseDetails> caseDetailsList = result.getCases();

		for (CaseDetails caseDetails : caseDetailsList) {
			System.out.println("ケースID : " + caseDetails.getCaseId());
			System.out.println("  表示ID : " + caseDetails.getDisplayId());
			System.out.println("  ステータス : " + caseDetails.getStatus());
			System.out.println("  題名 : " + caseDetails.getSubject());
		}
	}
}

実行結果は以下です。

ケースID : case-XXXXXXXXXXXX-mjja-2013-8e1b13345c3bXXXX
  表示ID : 4369823
  ステータス : resolved
  題名 : ホゲホゲについて1
ケースID : case-XXXXXXXXXXXX-mjja-2013-8e1b13345c3bYYYY
  表示ID : 4369833
  ステータス : resolved
  題名 : ホゲホゲについて2
・・・

サポートケースを解決済みにする

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.support.AWSSupportClient;
import com.amazonaws.services.support.model.ResolveCaseRequest;
import com.amazonaws.services.support.model.ResolveCaseResult;

public class AWSSupportApp {
	
	private static String caseId = "case-XXXXXXXXXXXX-mjja-2013-8e1b13345c3bXXXX";

	public static void main(String[] args) {
		AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
		AWSSupportClient support = new AWSSupportClient(credentialsProvider);

		ResolveCaseRequest request = new ResolveCaseRequest()
			.withCaseId(caseId);

		ResolveCaseResult result = support.resolveCase(request);
		System.out.println("Initial case status: " + result.getInitialCaseStatus());
		System.out.println("Final case status: " + result.getFinalCaseStatus());
	}
}

実行結果は以下です。

Initial case status: reopened
Final case status: resolved

Trusted Advisorに関するAPI

support-000

Trusted Advisorがチェックする項目一覧

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.support.AWSSupportClient;
import com.amazonaws.services.support.model.DescribeTrustedAdvisorChecksRequest;
import com.amazonaws.services.support.model.DescribeTrustedAdvisorChecksResult;
import com.amazonaws.services.support.model.TrustedAdvisorCheckDescription;

public class AWSSupportApp {

	public static void main(String[] args) {
		AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
		AWSSupportClient support = new AWSSupportClient(credentialsProvider);

		DescribeTrustedAdvisorChecksRequest request = new DescribeTrustedAdvisorChecksRequest()
				.withLanguage("ja");
		DescribeTrustedAdvisorChecksResult checks = support
				.describeTrustedAdvisorChecks(request);

		for (TrustedAdvisorCheckDescription check : checks.getChecks()) {
			System.out.println("ID : " + check.getId());
			System.out.println("  カテゴリ : " + check.getCategory());
			System.out.println("  名前 : " + check.getName());
			System.out.println("  メタデータ : " + check.getMetadata());
		}
	}
}

実行結果は以下です。

ID : 1MoPEMsKx6
  カテゴリ : cost_optimizing
  名前 : EC2 リザーブドインスタンスの最適化
  メタデータ : [リージョン/AZ, インスタンスタイプ, OS, 有効なRI数(1年か3年), 先月のインスタンス利用数 最大/平均/最小, 1年間RI台数のお勧め, 請求の見積もり(本AZにおいてのみ), 前払い, 予想請求額(最適なRI数), 月毎の予想割引, リージョン/AZ, インスタンスタイプ, OS, 有効なRI数(1年か3年), 先月のインスタンス利用数 最大/平均/最小, 3年間RI台数のお勧め, 請求の見積もり(本AZにおいてのみ), 前払い, 予想請求額(最適なRI数), 月毎の予想割引]
ID : HCP4007jGY
  カテゴリ : security
  名前 : セキュリティグループ - 開かれたポート
  メタデータ : [リージョン, セキュリティグループ名, セキュリティグループID, プロトコル, ステータス, ポート]
ID : iqdCTZKCUp
  カテゴリ : fault_tolerance
  名前 : Elastic Load Balancer の最適化
  メタデータ : [リージョン, ELB名, ゾーン数, ゾーン a 内インスタンス, ゾーン b 内インスタンス, ゾーン c 内インスタンス, ゾーン d 内インスタンス, ゾーン e 内インスタンス, ステータス, 理由]
・・・

Trusted Advisorのチェック結果

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.support.AWSSupportClient;
import com.amazonaws.services.support.model.DescribeTrustedAdvisorCheckResultRequest;
import com.amazonaws.services.support.model.DescribeTrustedAdvisorCheckResultResult;
import com.amazonaws.services.support.model.TrustedAdvisorCheckResult;

public class AWSSupportApp {

	private static String checkId = "iqdCTZKCUp";

	public static void main(String[] args) {
		AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
		AWSSupportClient support = new AWSSupportClient(credentialsProvider);

		DescribeTrustedAdvisorCheckResultRequest checkResultRequest = new DescribeTrustedAdvisorCheckResultRequest()
				.withCheckId(checkId);
		DescribeTrustedAdvisorCheckResultResult checkResult = support
				.describeTrustedAdvisorCheckResult(checkResultRequest);
		TrustedAdvisorCheckResult result = checkResult.getResult();

		System.out.println("チェックID : " + result.getCheckId());
		System.out.println("  ステータス : " + result.getStatus());
		System.out.println("  カテゴリーサマリー : "
				+ result.getCategorySpecificSummary());
		System.out.println("  リソースサマリー : " + result.getResourcesSummary());
		System.out.println("  リソース詳細 : " + result.getFlaggedResources());
	}
}

実行結果は以下です。

チェックID : iqdCTZKCUp
  ステータス : warning
  カテゴリーサマリー : {CostOptimizing: {EstimatedMonthlySavings: 0.0,EstimatedPercentMonthlySavings: 0.0}}
  リソースサマリー : {ResourcesProcessed: 2,ResourcesFlagged: 2,ResourcesIgnored: 0,ResourcesSuppressed: 0}
  リソース詳細 : [{Status: warning,Region: ap-northeast-1,ResourceId: hpieQxCif67yD9jZpxC1--7Ccy80smINC0pXf2C82fs,IsSuppressed: false,Metadata: [ap-northeast-1, awseb-e-h-AWSEBLoa-S59KFWFPRRR1, 3, 0, 1, 0, 0, 0, Yellow, Single AZ]}, {Status: warning,Region: ap-northeast-1,ResourceId: Q9lZLAh_vTFu_D7AVBdSEQY4WjQNZTpskIgOis70Gok,IsSuppressed: false,Metadata: [ap-northeast-1, jmeter, 1, 0, 1, 0, 0, 0, Yellow, Single AZ]}]

Trusted Advisorによるチェック進捗

import java.util.List;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.services.support.AWSSupportClient;
import com.amazonaws.services.support.model.DescribeTrustedAdvisorCheckRefreshStatusesRequest;
import com.amazonaws.services.support.model.DescribeTrustedAdvisorCheckRefreshStatusesResult;
import com.amazonaws.services.support.model.TrustedAdvisorCheckRefreshStatus;

public class AWSSupportApp {

	private static String checkId = "iqdCTZKCUp";

	public static void main(String[] args) {
		AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
		AWSSupportClient support = new AWSSupportClient(credentialsProvider);

		DescribeTrustedAdvisorCheckRefreshStatusesRequest request = 
				new DescribeTrustedAdvisorCheckRefreshStatusesRequest()
				.withCheckIds(checkId);

		DescribeTrustedAdvisorCheckRefreshStatusesResult result = 
				support.describeTrustedAdvisorCheckRefreshStatuses(request);

		List<TrustedAdvisorCheckRefreshStatus> list = result.getStatuses();
		for (TrustedAdvisorCheckRefreshStatus status : list) {
			System.out.println("チェックID : " + status.getCheckId());
			System.out.println("  ステータス : " + status.getStatus());
			System.out.println("  次の更新まで : "
					+ status.getMillisUntilNextRefreshable());
		}
	}
}

実行結果は以下です。

チェックID : iqdCTZKCUp
  ステータス : success
  次の更新まで : 115049

まとめ

AWSサポートが画面で提供しているSupport CaseとTrusted Advisorの機能に関して、ほぼ全ての情報にアクセスできることが分かりました。これでサポートに関してシステム間連携もできますね。そのうち、よくある質問内容に関してコード番号が振られて、AWSサポートの方々が手作業でチェックしなくても、自動で確認して回答できるようになるのではと期待しています。

参考資料

AWS Support - Developer Guide (API Version 2013-04-15)

AWS Support - API Reference (API Version 2013-04-15)