

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Trusted Advisor 做為 Web 服務
<a name="trustedadvisor"></a>

 AWS 支援 服務可讓您撰寫與 互動的應用程式[AWS Trusted Advisor](https://aws.amazon.com/premiumsupport/trustedadvisor/)。本主題說明如何取得 Trusted Advisor 檢查清單、重新整理其中一個，然後從檢查取得詳細結果。這些任務以 Java 示範。如需其他語言支援的資訊，請參閱[適用於 Amazon Web Services 的工具](https://aws.amazon.com/tools/)。

**Topics**
+ [取得可用 Trusted Advisor 檢查的清單](#Get_TA_Checks)
+ [重新整理可用 Trusted Advisor 檢查的清單](#Request_TA_Data)
+ [輪詢狀態變更的 Trusted Advisor 檢查](#getcheckstatus)
+ [請求 Trusted Advisor 檢查結果](#requestcheck)
+ [顯示 Trusted Advisor 檢查的詳細資訊](#printdetails)

## 取得可用 Trusted Advisor 檢查的清單
<a name="Get_TA_Checks"></a>

下列 Java 程式碼片段會建立 支援 用戶端的執行個體，可用來呼叫所有 Trusted Advisor API 操作。接下來，程式碼會呼叫 [DescribeTrustedAdvisorChecks](https://docs.aws.amazon.com/awssupport/latest/APIReference/API_DescribeTrustedAdvisorChecks.html) API 操作，以取得 Trusted Advisor 檢查及其對應`CheckId`值的清單。您可以使用這些資訊來建立使用者界面，讓使用者選擇他們要執行或重新整理的檢查。

```
private static AWSSupport createClient()
{
    return AWSSupportClientBuilder.defaultClient();
}
// Get the List of Available Trusted Advisor Checks
public static void getTAChecks() {
    // Possible language parameters: "en" (English), "ja" (Japanese), "fr" (French), "zh" (Chinese)
    DescribeTrustedAdvisorChecksRequest request = new DescribeTrustedAdvisorChecksRequest().withLanguage("en");
    DescribeTrustedAdvisorChecksResult result = createClient().describeTrustedAdvisorChecks(request);
    for (TrustedAdvisorCheckDescription description : result.getChecks()) {
        // Do something with check description.
        System.out.println(description.getId());
        System.out.println(description.getName());
    }
}
```

## 重新整理可用 Trusted Advisor 檢查的清單
<a name="Request_TA_Data"></a>

下列 Java 程式碼片段會建立 支援 用戶端的執行個體，供您用來重新整理 Trusted Advisor 資料。

```
// Refresh a Trusted Advisor Check
// Note: Some checks are refreshed automatically, and they cannot be refreshed by using this operation.
// Specifying the check ID of a check that is automatically refreshed causes an InvalidParameterValue error.
public static void refreshTACheck(final String checkId) {
    RefreshTrustedAdvisorCheckRequest request = new RefreshTrustedAdvisorCheckRequest().withCheckId(checkId);
    RefreshTrustedAdvisorCheckResult result = createClient().refreshTrustedAdvisorCheck(request);
    System.out.println("CheckId: " + result.getStatus().getCheckId());
    System.out.println("Milliseconds until refreshable: " + result.getStatus().getMillisUntilNextRefreshable());
    System.out.println("Refresh Status: " + result.getStatus().getStatus());
}
```

## 輪詢狀態變更的 Trusted Advisor 檢查
<a name="getcheckstatus"></a>

在您提交執行 Trusted Advisor 檢查以產生最新狀態資料的請求之後，您可以使用 [DescribeTrustedAdvisorCheckRefreshStatuses](https://docs.aws.amazon.com/awssupport/latest/APIReference/API_DescribeTrustedAdvisorCheckRefreshStatuses.html) API 操作來請求檢查執行的進度，以及新資料準備好進行檢查時。

以下 Java 程式碼片段會使用與 `CheckId` 變數對應的值，取得以下部分請求的檢查狀態。此外，程式碼會示範 Trusted Advisor 服務的多種其他用途：

1. 您可以透過周遊包含在 `DescribeTrustedAdvisorCheckRefreshStatusesResult` 執行個體中的物件，以呼叫 `getMillisUntilNextRefreshable`。您可以使用傳回的值測試您是否希望您的程式碼進行重新整理檢查。

1. 如果 `timeUntilRefreshable` 等於零，您可以請求重新整理檢查。

1. 您可以使用傳回的狀態，持續輪詢狀態變更；程式碼片段會將輪詢間隔設定為建議的 10 秒。如果狀態為 `enqueued` 或 `in_progress`，迴圈將傳回並請求另一個狀態。如果呼叫傳回 `successful`，迴圈將會終止。

1. 最後，程式碼會傳回 `DescribeTrustedAdvisorCheckResultResult` 資料類型的執行個體，您可以用它來周遊檢查所產生的資訊。

**附註：**使用單一重新整理請求，再輪詢請求的狀態。

```
// Retrieves TA refresh statuses. Multiple checkId's can be submitted.
public static List<TrustedAdvisorCheckRefreshStatus> getTARefreshStatus(final String... checkIds) {
    DescribeTrustedAdvisorCheckRefreshStatusesRequest request =
            new DescribeTrustedAdvisorCheckRefreshStatusesRequest().withCheckIds(checkIds);
    DescribeTrustedAdvisorCheckRefreshStatusesResult result =
            createClient().describeTrustedAdvisorCheckRefreshStatuses(request);
    return result.getStatuses();
}
// Retrieves a TA check status, and checks to see if it has finished processing.
public static boolean isTACheckStatusInTerminalState(final String checkId) {
    // Since we only submitted one checkId to getTARefreshStatus, just retrieve the only element in the list.
    TrustedAdvisorCheckRefreshStatus status = getTARefreshStatus(checkId).get(0);
    // Valid statuses are:
    // 1. "none", the check has never been refreshed before.
    // 2. "enqueued", the check is waiting to be processed.
    // 3. "processing", the check is in the midst of being processed.
    // 4. "success", the check has succeeded and finished processing - refresh data is available.
    // 5. "abandoned", the check has failed to process.
    return status.getStatus().equals("abandoned") || status.getStatus().equals("success");
}
// Enqueues a Trusted Advisor check refresh. Periodically polls the check refresh status for completion.
public static TrustedAdvisorCheckResult getFreshTACheckResult(final String checkId) throws InterruptedException {
    refreshTACheck(checkId);
    while(!isTACheckStatusInTerminalState(checkId)) {
        Thread.sleep(10000);
    }
    return getTACheckResult(checkId);
}
// Retrieves fresh TA check data whenever possible.
// Note: Some checks are refreshed automatically, and they cannot be refreshed by using this operation. This method
// is only functional for checks that can be refreshed using the RefreshTrustedAdvisorCheck operation.
public static void pollForTACheckResultChanges(final String checkId) throws InterruptedException {
    String checkResultStatus = null;
    do {
        TrustedAdvisorCheckResult result = getFreshTACheckResult(checkId);
        if (checkResultStatus != null && !checkResultStatus.equals(result.getStatus())) {
            break;
        }
        checkResultStatus = result.getStatus();
        // The rule refresh has completed, but due to throttling rules the checks may not be refreshed again
        // for a short period of time.
        // Since we only submitted one checkId to getTARefreshStatus, just retrieve the only element in the list.
        TrustedAdvisorCheckRefreshStatus refreshStatus = getTARefreshStatus(checkId).get(0);
        Thread.sleep(refreshStatus.getMillisUntilNextRefreshable());
    } while(true);
    // Signal that a TA check has changed check result status here.
}
```

## 請求 Trusted Advisor 檢查結果
<a name="requestcheck"></a>

選取您要取得詳細結果的檢查之後，請使用 [DescribeTrustedAdvisorCheckResult](https://docs.aws.amazon.com/awssupport/latest/APIReference/API_DescribeTrustedAdvisorCheckResult.html) API 作業提交請求。

**提示**  
 Trusted Advisor 檢查的名稱和描述可能會有所變更。建議您在程式碼中指定檢查 ID，以唯一識別某項檢查。您可以使用 [DescribeTrustedAdvisorChecks](https://docs.aws.amazon.com/awssupport/latest/APIReference/API_DescribeTrustedAdvisorChecks.html) API 作業取得檢查 ID。

以下 Java 程式碼片段使用 (以上述程式碼片段取得的) `result` 變數參考的 `DescribeTrustedAdvisorChecksResult` 執行個體。在您提交請求執行該程式碼片段之後，其並非透過使用者界面以互動方式定義檢查，而是由每次 `result.getChecks().get(0)` 呼叫中指定索引值 0，以提交請求執行清單中的第一項檢查。接著，程式碼定義 `DescribeTrustedAdvisorCheckResultRequest` 執行個體，它會傳送到呼叫 `checkResult` 的 `DescribeTrustedAdvisorCheckResultResult` 執行個體。您可以使用此資料類型的成員結構，以檢視檢查的結果。

```
// Request a Trusted Advisor Check Result
public static TrustedAdvisorCheckResult getTACheckResult(final String checkId) {
    DescribeTrustedAdvisorCheckResultRequest request = new DescribeTrustedAdvisorCheckResultRequest()
            // Possible language parameters: "en" (English), "ja" (Japanese), "fr" (French), "zh" (Chinese)
            .withLanguage("en")
            .withCheckId(checkId);
    DescribeTrustedAdvisorCheckResultResult requestResult = createClient().describeTrustedAdvisorCheckResult(request);
    return requestResult.getResult();
}
```

**注意：**請求 Trusted Advisor 檢查結果不會產生更新的結果資料。

## 顯示 Trusted Advisor 檢查的詳細資訊
<a name="printdetails"></a>

下列 Java 程式碼片段會反覆運算上前一節傳回的`DescribeTrustedAdvisorCheckResultResult`執行個體，以取得由 Trusted Advisor 檢查標記的資源清單。

```
// Show ResourceIds for flagged resources.
for (TrustedAdvisorResourceDetail flaggedResource :
    result1.getResult().getFlaggedResources())
{
    System.out.println(
        "The resource for this ResourceID has been flagged: " +
        flaggedResource.getResourceId());
}
```