diff --git a/clients/client-trustedadvisor/README.md b/clients/client-trustedadvisor/README.md index d4bfbeab7de1..19effc78b1b1 100644 --- a/clients/client-trustedadvisor/README.md +++ b/clients/client-trustedadvisor/README.md @@ -203,6 +203,14 @@ see LICENSE for more information. ## Client Commands (Operations List) +
+ +BatchUpdateRecommendationResourceExclusion + + +[Command API Reference](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/trustedadvisor/command/BatchUpdateRecommendationResourceExclusionCommand/) / [Input](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-trustedadvisor/Interface/BatchUpdateRecommendationResourceExclusionCommandInput/) / [Output](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-trustedadvisor/Interface/BatchUpdateRecommendationResourceExclusionCommandOutput/) + +
GetOrganizationRecommendation diff --git a/clients/client-trustedadvisor/src/TrustedAdvisor.ts b/clients/client-trustedadvisor/src/TrustedAdvisor.ts index 2a854f15bd32..e5aab9b3c1ae 100644 --- a/clients/client-trustedadvisor/src/TrustedAdvisor.ts +++ b/clients/client-trustedadvisor/src/TrustedAdvisor.ts @@ -2,6 +2,11 @@ import { createAggregatedClient } from "@smithy/smithy-client"; import { HttpHandlerOptions as __HttpHandlerOptions } from "@smithy/types"; +import { + BatchUpdateRecommendationResourceExclusionCommand, + BatchUpdateRecommendationResourceExclusionCommandInput, + BatchUpdateRecommendationResourceExclusionCommandOutput, +} from "./commands/BatchUpdateRecommendationResourceExclusionCommand"; import { GetOrganizationRecommendationCommand, GetOrganizationRecommendationCommandInput, @@ -51,6 +56,7 @@ import { import { TrustedAdvisorClient, TrustedAdvisorClientConfig } from "./TrustedAdvisorClient"; const commands = { + BatchUpdateRecommendationResourceExclusionCommand, GetOrganizationRecommendationCommand, GetRecommendationCommand, ListChecksCommand, @@ -64,6 +70,23 @@ const commands = { }; export interface TrustedAdvisor { + /** + * @see {@link BatchUpdateRecommendationResourceExclusionCommand} + */ + batchUpdateRecommendationResourceExclusion( + args: BatchUpdateRecommendationResourceExclusionCommandInput, + options?: __HttpHandlerOptions + ): Promise; + batchUpdateRecommendationResourceExclusion( + args: BatchUpdateRecommendationResourceExclusionCommandInput, + cb: (err: any, data?: BatchUpdateRecommendationResourceExclusionCommandOutput) => void + ): void; + batchUpdateRecommendationResourceExclusion( + args: BatchUpdateRecommendationResourceExclusionCommandInput, + options: __HttpHandlerOptions, + cb: (err: any, data?: BatchUpdateRecommendationResourceExclusionCommandOutput) => void + ): void; + /** * @see {@link GetOrganizationRecommendationCommand} */ diff --git a/clients/client-trustedadvisor/src/TrustedAdvisorClient.ts b/clients/client-trustedadvisor/src/TrustedAdvisorClient.ts index 4edaff148f82..05a4416694a5 100644 --- a/clients/client-trustedadvisor/src/TrustedAdvisorClient.ts +++ b/clients/client-trustedadvisor/src/TrustedAdvisorClient.ts @@ -53,6 +53,10 @@ import { HttpAuthSchemeResolvedConfig, resolveHttpAuthSchemeConfig, } from "./auth/httpAuthSchemeProvider"; +import { + BatchUpdateRecommendationResourceExclusionCommandInput, + BatchUpdateRecommendationResourceExclusionCommandOutput, +} from "./commands/BatchUpdateRecommendationResourceExclusionCommand"; import { GetOrganizationRecommendationCommandInput, GetOrganizationRecommendationCommandOutput, @@ -102,6 +106,7 @@ export { __Client }; * @public */ export type ServiceInputTypes = + | BatchUpdateRecommendationResourceExclusionCommandInput | GetOrganizationRecommendationCommandInput | GetRecommendationCommandInput | ListChecksCommandInput @@ -117,6 +122,7 @@ export type ServiceInputTypes = * @public */ export type ServiceOutputTypes = + | BatchUpdateRecommendationResourceExclusionCommandOutput | GetOrganizationRecommendationCommandOutput | GetRecommendationCommandOutput | ListChecksCommandOutput diff --git a/clients/client-trustedadvisor/src/commands/BatchUpdateRecommendationResourceExclusionCommand.ts b/clients/client-trustedadvisor/src/commands/BatchUpdateRecommendationResourceExclusionCommand.ts new file mode 100644 index 000000000000..5682ebfb589f --- /dev/null +++ b/clients/client-trustedadvisor/src/commands/BatchUpdateRecommendationResourceExclusionCommand.ts @@ -0,0 +1,116 @@ +// smithy-typescript generated code +import { getEndpointPlugin } from "@smithy/middleware-endpoint"; +import { getSerdePlugin } from "@smithy/middleware-serde"; +import { Command as $Command } from "@smithy/smithy-client"; +import { MetadataBearer as __MetadataBearer } from "@smithy/types"; + +import { commonParams } from "../endpoint/EndpointParameters"; +import { + BatchUpdateRecommendationResourceExclusionRequest, + BatchUpdateRecommendationResourceExclusionResponse, +} from "../models/models_0"; +import { + de_BatchUpdateRecommendationResourceExclusionCommand, + se_BatchUpdateRecommendationResourceExclusionCommand, +} from "../protocols/Aws_restJson1"; +import { ServiceInputTypes, ServiceOutputTypes, TrustedAdvisorClientResolvedConfig } from "../TrustedAdvisorClient"; + +/** + * @public + */ +export { __MetadataBearer, $Command }; +/** + * @public + * + * The input for {@link BatchUpdateRecommendationResourceExclusionCommand}. + */ +export interface BatchUpdateRecommendationResourceExclusionCommandInput + extends BatchUpdateRecommendationResourceExclusionRequest {} +/** + * @public + * + * The output of {@link BatchUpdateRecommendationResourceExclusionCommand}. + */ +export interface BatchUpdateRecommendationResourceExclusionCommandOutput + extends BatchUpdateRecommendationResourceExclusionResponse, + __MetadataBearer {} + +/** + *

Update one or more exclusion status for a list of recommendation resources

+ * @example + * Use a bare-bones client and the command you need to make an API call. + * ```javascript + * import { TrustedAdvisorClient, BatchUpdateRecommendationResourceExclusionCommand } from "@aws-sdk/client-trustedadvisor"; // ES Modules import + * // const { TrustedAdvisorClient, BatchUpdateRecommendationResourceExclusionCommand } = require("@aws-sdk/client-trustedadvisor"); // CommonJS import + * const client = new TrustedAdvisorClient(config); + * const input = { // BatchUpdateRecommendationResourceExclusionRequest + * recommendationResourceExclusions: [ // RecommendationResourceExclusionList // required + * { // RecommendationResourceExclusion + * arn: "STRING_VALUE", // required + * isExcluded: true || false, // required + * }, + * ], + * }; + * const command = new BatchUpdateRecommendationResourceExclusionCommand(input); + * const response = await client.send(command); + * // { // BatchUpdateRecommendationResourceExclusionResponse + * // batchUpdateRecommendationResourceExclusionErrors: [ // UpdateRecommendationResourceExclusionErrorList // required + * // { // UpdateRecommendationResourceExclusionError + * // arn: "STRING_VALUE", + * // errorCode: "STRING_VALUE", + * // errorMessage: "STRING_VALUE", + * // }, + * // ], + * // }; + * + * ``` + * + * @param BatchUpdateRecommendationResourceExclusionCommandInput - {@link BatchUpdateRecommendationResourceExclusionCommandInput} + * @returns {@link BatchUpdateRecommendationResourceExclusionCommandOutput} + * @see {@link BatchUpdateRecommendationResourceExclusionCommandInput} for command's `input` shape. + * @see {@link BatchUpdateRecommendationResourceExclusionCommandOutput} for command's `response` shape. + * @see {@link TrustedAdvisorClientResolvedConfig | config} for TrustedAdvisorClient's `config` shape. + * + * @throws {@link AccessDeniedException} (client fault) + *

Exception that access has been denied due to insufficient access

+ * + * @throws {@link ConflictException} (client fault) + *

Exception that the request was denied due to conflictions in state

+ * + * @throws {@link InternalServerException} (server fault) + *

Exception to notify that an unexpected internal error occurred during processing of the request

+ * + * @throws {@link ThrottlingException} (client fault) + *

Exception to notify that requests are being throttled

+ * + * @throws {@link ValidationException} (client fault) + *

Exception that the request failed to satisfy service constraints

+ * + * @throws {@link TrustedAdvisorServiceException} + *

Base exception class for all service exceptions from TrustedAdvisor service.

+ * + * @public + */ +export class BatchUpdateRecommendationResourceExclusionCommand extends $Command + .classBuilder< + BatchUpdateRecommendationResourceExclusionCommandInput, + BatchUpdateRecommendationResourceExclusionCommandOutput, + TrustedAdvisorClientResolvedConfig, + ServiceInputTypes, + ServiceOutputTypes + >() + .ep({ + ...commonParams, + }) + .m(function (this: any, Command: any, cs: any, config: TrustedAdvisorClientResolvedConfig, o: any) { + return [ + getSerdePlugin(config, this.serialize, this.deserialize), + getEndpointPlugin(config, Command.getEndpointParameterInstructions()), + ]; + }) + .s("TrustedAdvisor", "BatchUpdateRecommendationResourceExclusion", {}) + .n("TrustedAdvisorClient", "BatchUpdateRecommendationResourceExclusionCommand") + .f(void 0, void 0) + .ser(se_BatchUpdateRecommendationResourceExclusionCommand) + .de(de_BatchUpdateRecommendationResourceExclusionCommand) + .build() {} diff --git a/clients/client-trustedadvisor/src/commands/ListOrganizationRecommendationResourcesCommand.ts b/clients/client-trustedadvisor/src/commands/ListOrganizationRecommendationResourcesCommand.ts index 35e68e2174ad..0a13d78b00c1 100644 --- a/clients/client-trustedadvisor/src/commands/ListOrganizationRecommendationResourcesCommand.ts +++ b/clients/client-trustedadvisor/src/commands/ListOrganizationRecommendationResourcesCommand.ts @@ -49,6 +49,7 @@ export interface ListOrganizationRecommendationResourcesCommandOutput * nextToken: "STRING_VALUE", * maxResults: Number("int"), * status: "ok" || "warning" || "error", + * exclusionStatus: "excluded" || "included", * regionCode: "STRING_VALUE", * organizationRecommendationIdentifier: "STRING_VALUE", // required * affectedAccountId: "STRING_VALUE", @@ -68,6 +69,7 @@ export interface ListOrganizationRecommendationResourcesCommandOutput * // "": "STRING_VALUE", * // }, * // lastUpdatedAt: new Date("TIMESTAMP"), // required + * // exclusionStatus: "excluded" || "included", * // accountId: "STRING_VALUE", * // recommendationArn: "STRING_VALUE", // required * // }, diff --git a/clients/client-trustedadvisor/src/commands/ListRecommendationResourcesCommand.ts b/clients/client-trustedadvisor/src/commands/ListRecommendationResourcesCommand.ts index 1b3148c64982..103448cd47fa 100644 --- a/clients/client-trustedadvisor/src/commands/ListRecommendationResourcesCommand.ts +++ b/clients/client-trustedadvisor/src/commands/ListRecommendationResourcesCommand.ts @@ -43,6 +43,7 @@ export interface ListRecommendationResourcesCommandOutput * nextToken: "STRING_VALUE", * maxResults: Number("int"), * status: "ok" || "warning" || "error", + * exclusionStatus: "excluded" || "included", * regionCode: "STRING_VALUE", * recommendationIdentifier: "STRING_VALUE", // required * }; @@ -61,6 +62,7 @@ export interface ListRecommendationResourcesCommandOutput * // "": "STRING_VALUE", * // }, * // lastUpdatedAt: new Date("TIMESTAMP"), // required + * // exclusionStatus: "excluded" || "included", * // recommendationArn: "STRING_VALUE", // required * // }, * // ], diff --git a/clients/client-trustedadvisor/src/commands/UpdateOrganizationRecommendationLifecycleCommand.ts b/clients/client-trustedadvisor/src/commands/UpdateOrganizationRecommendationLifecycleCommand.ts index a466beb8153c..86c4be06a334 100644 --- a/clients/client-trustedadvisor/src/commands/UpdateOrganizationRecommendationLifecycleCommand.ts +++ b/clients/client-trustedadvisor/src/commands/UpdateOrganizationRecommendationLifecycleCommand.ts @@ -34,7 +34,7 @@ export interface UpdateOrganizationRecommendationLifecycleCommandInput export interface UpdateOrganizationRecommendationLifecycleCommandOutput extends __MetadataBearer {} /** - *

Update the lifecyle of a Recommendation within an Organization. This API only supports prioritized + *

Update the lifecycle of a Recommendation within an Organization. This API only supports prioritized * recommendations. *

* @example diff --git a/clients/client-trustedadvisor/src/commands/index.ts b/clients/client-trustedadvisor/src/commands/index.ts index 5d05b3e1dd7f..02c09f01fad7 100644 --- a/clients/client-trustedadvisor/src/commands/index.ts +++ b/clients/client-trustedadvisor/src/commands/index.ts @@ -1,4 +1,5 @@ // smithy-typescript generated code +export * from "./BatchUpdateRecommendationResourceExclusionCommand"; export * from "./GetOrganizationRecommendationCommand"; export * from "./GetRecommendationCommand"; export * from "./ListChecksCommand"; diff --git a/clients/client-trustedadvisor/src/models/models_0.ts b/clients/client-trustedadvisor/src/models/models_0.ts index c1f801a2f3f5..fab99bcd1a1c 100644 --- a/clients/client-trustedadvisor/src/models/models_0.ts +++ b/clients/client-trustedadvisor/src/models/models_0.ts @@ -120,6 +120,154 @@ export interface AccountRecommendationLifecycleSummary { lastUpdatedAt?: Date; } +/** + *

The request entry for Recommendation Resource exclusion. Each entry is a combination of Recommendation Resource ARN and corresponding exclusion status

+ * @public + */ +export interface RecommendationResourceExclusion { + /** + *

The ARN of the Recommendation Resource

+ * @public + */ + arn: string | undefined; + + /** + *

The exclusion status

+ * @public + */ + isExcluded: boolean | undefined; +} + +/** + * @public + */ +export interface BatchUpdateRecommendationResourceExclusionRequest { + /** + *

A list of recommendation resource ARNs and exclusion status to update

+ * @public + */ + recommendationResourceExclusions: RecommendationResourceExclusion[] | undefined; +} + +/** + *

The error entry for Recommendation Resource exclusion. Each entry is a combination of Recommendation Resource ARN, error code and error message

+ * @public + */ +export interface UpdateRecommendationResourceExclusionError { + /** + *

The ARN of the Recommendation Resource

+ * @public + */ + arn?: string; + + /** + *

The error code

+ * @public + */ + errorCode?: string; + + /** + *

The error message

+ * @public + */ + errorMessage?: string; +} + +/** + * @public + */ +export interface BatchUpdateRecommendationResourceExclusionResponse { + /** + *

A list of recommendation resource ARNs whose exclusion status failed to update, if any

+ * @public + */ + batchUpdateRecommendationResourceExclusionErrors: UpdateRecommendationResourceExclusionError[] | undefined; +} + +/** + *

Exception that the request was denied due to conflictions in state

+ * @public + */ +export class ConflictException extends __BaseException { + readonly name: "ConflictException" = "ConflictException"; + readonly $fault: "client" = "client"; + /** + * @internal + */ + constructor(opts: __ExceptionOptionType) { + super({ + name: "ConflictException", + $fault: "client", + ...opts, + }); + Object.setPrototypeOf(this, ConflictException.prototype); + } +} + +/** + *

Exception to notify that an unexpected internal error occurred during processing of the request

+ * @public + */ +export class InternalServerException extends __BaseException { + readonly name: "InternalServerException" = "InternalServerException"; + readonly $fault: "server" = "server"; + $retryable = {}; + /** + * @internal + */ + constructor(opts: __ExceptionOptionType) { + super({ + name: "InternalServerException", + $fault: "server", + ...opts, + }); + Object.setPrototypeOf(this, InternalServerException.prototype); + } +} + +/** + *

Exception to notify that requests are being throttled

+ * @public + */ +export class ThrottlingException extends __BaseException { + readonly name: "ThrottlingException" = "ThrottlingException"; + readonly $fault: "client" = "client"; + $retryable = { + throttling: true, + }; + /** + * @internal + */ + constructor(opts: __ExceptionOptionType) { + super({ + name: "ThrottlingException", + $fault: "client", + ...opts, + }); + Object.setPrototypeOf(this, ThrottlingException.prototype); + } +} + +/** + *

Exception that the request failed to satisfy service constraints

+ * @public + */ +export class ValidationException extends __BaseException { + readonly name: "ValidationException" = "ValidationException"; + readonly $fault: "client" = "client"; + /** + * @internal + */ + constructor(opts: __ExceptionOptionType) { + super({ + name: "ValidationException", + $fault: "client", + ...opts, + }); + Object.setPrototypeOf(this, ValidationException.prototype); + } +} + /** * @public * @enum @@ -218,24 +366,18 @@ export interface CheckSummary { } /** - *

Exception that the request was denied due to conflictions in state

* @public + * @enum */ -export class ConflictException extends __BaseException { - readonly name: "ConflictException" = "ConflictException"; - readonly $fault: "client" = "client"; - /** - * @internal - */ - constructor(opts: __ExceptionOptionType) { - super({ - name: "ConflictException", - $fault: "client", - ...opts, - }); - Object.setPrototypeOf(this, ConflictException.prototype); - } -} +export const ExclusionStatus = { + EXCLUDED: "excluded", + INCLUDED: "included", +} as const; + +/** + * @public + */ +export type ExclusionStatus = (typeof ExclusionStatus)[keyof typeof ExclusionStatus]; /** * @public @@ -481,27 +623,6 @@ export interface GetOrganizationRecommendationResponse { organizationRecommendation?: OrganizationRecommendation; } -/** - *

Exception to notify that an unexpected internal error occurred during processing of the request

- * @public - */ -export class InternalServerException extends __BaseException { - readonly name: "InternalServerException" = "InternalServerException"; - readonly $fault: "server" = "server"; - $retryable = {}; - /** - * @internal - */ - constructor(opts: __ExceptionOptionType) { - super({ - name: "InternalServerException", - $fault: "server", - ...opts, - }); - Object.setPrototypeOf(this, InternalServerException.prototype); - } -} - /** *

Exception that the requested resource has not been found

* @public @@ -522,49 +643,6 @@ export class ResourceNotFoundException extends __BaseException { } } -/** - *

Exception to notify that requests are being throttled

- * @public - */ -export class ThrottlingException extends __BaseException { - readonly name: "ThrottlingException" = "ThrottlingException"; - readonly $fault: "client" = "client"; - $retryable = { - throttling: true, - }; - /** - * @internal - */ - constructor(opts: __ExceptionOptionType) { - super({ - name: "ThrottlingException", - $fault: "client", - ...opts, - }); - Object.setPrototypeOf(this, ThrottlingException.prototype); - } -} - -/** - *

Exception that the request failed to satisfy service constraints

- * @public - */ -export class ValidationException extends __BaseException { - readonly name: "ValidationException" = "ValidationException"; - readonly $fault: "client" = "client"; - /** - * @internal - */ - constructor(opts: __ExceptionOptionType) { - super({ - name: "ValidationException", - $fault: "client", - ...opts, - }); - Object.setPrototypeOf(this, ValidationException.prototype); - } -} - /** * @public */ @@ -899,6 +977,12 @@ export interface ListOrganizationRecommendationResourcesRequest { */ status?: ResourceStatus; + /** + *

The exclusion status of the resource

+ * @public + */ + exclusionStatus?: ExclusionStatus; + /** *

The AWS Region code of the resource

* @public @@ -965,6 +1049,12 @@ export interface OrganizationRecommendationResourceSummary { */ lastUpdatedAt: Date | undefined; + /** + *

The exclusion status of the Recommendation Resource

+ * @public + */ + exclusionStatus?: ExclusionStatus; + /** *

The AWS account ID

* @public @@ -1197,6 +1287,12 @@ export interface ListRecommendationResourcesRequest { */ status?: ResourceStatus; + /** + *

The exclusion status of the resource

+ * @public + */ + exclusionStatus?: ExclusionStatus; + /** *

The AWS Region code of the resource

* @public @@ -1257,6 +1353,12 @@ export interface RecommendationResourceSummary { */ lastUpdatedAt: Date | undefined; + /** + *

The exclusion status of the Recommendation Resource

+ * @public + */ + exclusionStatus?: ExclusionStatus; + /** *

The Recommendation ARN

* @public diff --git a/clients/client-trustedadvisor/src/protocols/Aws_restJson1.ts b/clients/client-trustedadvisor/src/protocols/Aws_restJson1.ts index 5b87a1a1cc99..e92faa3a1fe6 100644 --- a/clients/client-trustedadvisor/src/protocols/Aws_restJson1.ts +++ b/clients/client-trustedadvisor/src/protocols/Aws_restJson1.ts @@ -23,6 +23,10 @@ import { SerdeContext as __SerdeContext, } from "@smithy/types"; +import { + BatchUpdateRecommendationResourceExclusionCommandInput, + BatchUpdateRecommendationResourceExclusionCommandOutput, +} from "../commands/BatchUpdateRecommendationResourceExclusionCommand"; import { GetOrganizationRecommendationCommandInput, GetOrganizationRecommendationCommandOutput, @@ -68,6 +72,7 @@ import { Recommendation, RecommendationCostOptimizingAggregates, RecommendationPillarSpecificAggregates, + RecommendationResourceExclusion, RecommendationResourceSummary, RecommendationSummary, ResourceNotFoundException, @@ -76,6 +81,28 @@ import { } from "../models/models_0"; import { TrustedAdvisorServiceException as __BaseException } from "../models/TrustedAdvisorServiceException"; +/** + * serializeAws_restJson1BatchUpdateRecommendationResourceExclusionCommand + */ +export const se_BatchUpdateRecommendationResourceExclusionCommand = async ( + input: BatchUpdateRecommendationResourceExclusionCommandInput, + context: __SerdeContext +): Promise<__HttpRequest> => { + const b = rb(input, context); + const headers: any = { + "content-type": "application/json", + }; + b.bp("/v1/batch-update-recommendation-resource-exclusion"); + let body: any; + body = JSON.stringify( + take(input, { + recommendationResourceExclusions: (_) => _json(_), + }) + ); + b.m("PUT").h(headers).b(body); + return b.build(); +}; + /** * serializeAws_restJson1GetOrganizationRecommendationCommand */ @@ -182,6 +209,7 @@ export const se_ListOrganizationRecommendationResourcesCommand = async ( [_nT]: [, input[_nT]!], [_mR]: [() => input.maxResults !== void 0, () => input[_mR]!.toString()], [_st]: [, input[_st]!], + [_eS]: [, input[_eS]!], [_rC]: [, input[_rC]!], [_aAI]: [, input[_aAI]!], }); @@ -238,6 +266,7 @@ export const se_ListRecommendationResourcesCommand = async ( [_nT]: [, input[_nT]!], [_mR]: [() => input.maxResults !== void 0, () => input[_mR]!.toString()], [_st]: [, input[_st]!], + [_eS]: [, input[_eS]!], [_rC]: [, input[_rC]!], }); let body: any; @@ -333,6 +362,27 @@ export const se_UpdateRecommendationLifecycleCommand = async ( return b.build(); }; +/** + * deserializeAws_restJson1BatchUpdateRecommendationResourceExclusionCommand + */ +export const de_BatchUpdateRecommendationResourceExclusionCommand = async ( + output: __HttpResponse, + context: __SerdeContext +): Promise => { + if (output.statusCode !== 200 && output.statusCode >= 300) { + return de_CommandError(output, context); + } + const contents: any = map({ + $metadata: deserializeMetadata(output), + }); + const data: Record = __expectNonNull(__expectObject(await parseBody(output.body, context)), "body"); + const doc = take(data, { + batchUpdateRecommendationResourceExclusionErrors: _json, + }); + Object.assign(contents, doc); + return contents; +}; + /** * deserializeAws_restJson1GetOrganizationRecommendationCommand */ @@ -554,21 +604,21 @@ const de_CommandError = async (output: __HttpResponse, context: __SerdeContext): case "AccessDeniedException": case "com.amazonaws.trustedadvisor#AccessDeniedException": throw await de_AccessDeniedExceptionRes(parsedOutput, context); + case "ConflictException": + case "com.amazonaws.trustedadvisor#ConflictException": + throw await de_ConflictExceptionRes(parsedOutput, context); case "InternalServerException": case "com.amazonaws.trustedadvisor#InternalServerException": throw await de_InternalServerExceptionRes(parsedOutput, context); - case "ResourceNotFoundException": - case "com.amazonaws.trustedadvisor#ResourceNotFoundException": - throw await de_ResourceNotFoundExceptionRes(parsedOutput, context); case "ThrottlingException": case "com.amazonaws.trustedadvisor#ThrottlingException": throw await de_ThrottlingExceptionRes(parsedOutput, context); case "ValidationException": case "com.amazonaws.trustedadvisor#ValidationException": throw await de_ValidationExceptionRes(parsedOutput, context); - case "ConflictException": - case "com.amazonaws.trustedadvisor#ConflictException": - throw await de_ConflictExceptionRes(parsedOutput, context); + case "ResourceNotFoundException": + case "com.amazonaws.trustedadvisor#ResourceNotFoundException": + throw await de_ResourceNotFoundExceptionRes(parsedOutput, context); default: const parsedBody = parsedOutput.body; return throwDefaultError({ @@ -691,6 +741,10 @@ const de_ValidationExceptionRes = async (parsedOutput: any, context: __SerdeCont return __decorateServiceException(exception, parsedOutput.body); }; +// se_RecommendationResourceExclusion omitted. + +// se_RecommendationResourceExclusionList omitted. + /** * deserializeAws_restJson1AccountRecommendationLifecycleSummary */ @@ -769,6 +823,7 @@ const de_OrganizationRecommendationResourceSummary = ( accountId: __expectString, arn: __expectString, awsResourceId: __expectString, + exclusionStatus: __expectString, id: __expectString, lastUpdatedAt: (_: any) => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), metadata: _json, @@ -900,6 +955,7 @@ const de_RecommendationResourceSummary = (output: any, context: __SerdeContext): return take(output, { arn: __expectString, awsResourceId: __expectString, + exclusionStatus: __expectString, id: __expectString, lastUpdatedAt: (_: any) => __expectNonNull(__parseRfc3339DateTimeWithOffset(_)), metadata: _json, @@ -960,6 +1016,10 @@ const de_RecommendationSummaryList = (output: any, context: __SerdeContext): Rec // de_StringMap omitted. +// de_UpdateRecommendationResourceExclusionError omitted. + +// de_UpdateRecommendationResourceExclusionErrorList omitted. + const deserializeMetadata = (output: __HttpResponse): __ResponseMetadata => ({ httpStatusCode: output.statusCode, requestId: @@ -984,6 +1044,7 @@ const _aLUA = "afterLastUpdatedAt"; const _aS = "awsService"; const _bLUA = "beforeLastUpdatedAt"; const _cI = "checkIdentifier"; +const _eS = "exclusionStatus"; const _l = "language"; const _mR = "maxResults"; const _nT = "nextToken"; diff --git a/codegen/sdk-codegen/aws-models/trustedadvisor.json b/codegen/sdk-codegen/aws-models/trustedadvisor.json index 6c761a1e2eea..0174343ff913 100644 --- a/codegen/sdk-codegen/aws-models/trustedadvisor.json +++ b/codegen/sdk-codegen/aws-models/trustedadvisor.json @@ -110,6 +110,94 @@ "target": "com.amazonaws.trustedadvisor#AccountRecommendationLifecycleSummary" } }, + "com.amazonaws.trustedadvisor#BatchUpdateRecommendationResourceExclusion": { + "type": "operation", + "input": { + "target": "com.amazonaws.trustedadvisor#BatchUpdateRecommendationResourceExclusionRequest" + }, + "output": { + "target": "com.amazonaws.trustedadvisor#BatchUpdateRecommendationResourceExclusionResponse" + }, + "errors": [ + { + "target": "com.amazonaws.trustedadvisor#AccessDeniedException" + }, + { + "target": "com.amazonaws.trustedadvisor#ConflictException" + }, + { + "target": "com.amazonaws.trustedadvisor#InternalServerException" + }, + { + "target": "com.amazonaws.trustedadvisor#ThrottlingException" + }, + { + "target": "com.amazonaws.trustedadvisor#ValidationException" + } + ], + "traits": { + "smithy.api#documentation": "

Update one or more exclusion status for a list of recommendation resources

", + "smithy.api#examples": [ + { + "title": "Batch updates the exclusion status for a list of recommendation resources", + "input": { + "recommendationResourceExclusions": [ + { + "arn": "arn:aws:trustedadvisor::000000000000:recommendation-resource/55fa4d2e-bbb7-491a-833b-5773e9589578/18959a1f1973cff8e706e9d9bde28bba36cd602a6b2cb86c8b61252835236010", + "isExcluded": true + } + ] + }, + "output": { + "batchUpdateRecommendationResourceExclusionErrors": [ + { + "arn": "arn:aws:trustedadvisor::000000000000:recommendation-resource/55fa4d2e-bbb7-491a-833b-5773e9589578/18959a1f1973cff8e706e9d9bde28bba36cd602a6b2cb86c8b61252835236010", + "errorCode": "404", + "errorMessage": "Exception that the requested resource has not been found" + } + ] + } + } + ], + "smithy.api#http": { + "method": "PUT", + "uri": "/v1/batch-update-recommendation-resource-exclusion", + "code": 200 + }, + "smithy.api#idempotent": {}, + "smithy.api#tags": [] + } + }, + "com.amazonaws.trustedadvisor#BatchUpdateRecommendationResourceExclusionRequest": { + "type": "structure", + "members": { + "recommendationResourceExclusions": { + "target": "com.amazonaws.trustedadvisor#RecommendationResourceExclusionList", + "traits": { + "smithy.api#documentation": "

A list of recommendation resource ARNs and exclusion status to update

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.trustedadvisor#BatchUpdateRecommendationResourceExclusionResponse": { + "type": "structure", + "members": { + "batchUpdateRecommendationResourceExclusionErrors": { + "target": "com.amazonaws.trustedadvisor#UpdateRecommendationResourceExclusionErrorList", + "traits": { + "smithy.api#documentation": "

A list of recommendation resource ARNs whose exclusion status failed to update, if any

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.trustedadvisor#CheckArn": { "type": "string", "traits": { @@ -216,6 +304,23 @@ "smithy.api#httpError": 409 } }, + "com.amazonaws.trustedadvisor#ExclusionStatus": { + "type": "enum", + "members": { + "EXCLUDED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "excluded" + } + }, + "INCLUDED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "included" + } + } + } + }, "com.amazonaws.trustedadvisor#GetOrganizationRecommendation": { "type": "operation", "input": { @@ -260,13 +365,13 @@ "lifecycleStage": "resolved", "pillars": ["security"], "resourcesAggregates": { - "errorCount": 150, - "okCount": 500, - "warningCount": 100 + "errorCount": 0, + "okCount": 0, + "warningCount": 0 }, "source": "ta_check", - "status": "ok", - "type": "standard" + "status": "warning", + "type": "priority" } } } @@ -360,7 +465,7 @@ }, "pillars": ["security"], "resourcesAggregates": { - "errorCount": 0, + "errorCount": 1, "okCount": 0, "warningCount": 0 }, @@ -462,7 +567,15 @@ "awsServices": ["EC2"], "description": "Checks security groups for rules that allow unrestricted access to a resource. Unrestricted access increases opportunities for malicious activity (hacking, denial-of-service attacks, loss of data).\n
\n
Note: This check only evaluates security groups that you create and their inbound rules for IPv4 addresses. Security groups created by AWS Directory Services are flagged as red or yellow, but they don’t pose a security risk and can be safely ignored or excluded. For more information, see the Trusted Advisor FAQ.\n
\n
\n

Alert Criteria

\n
\nRed: A security group rule has a source IP address with a /0 suffix for ports other than 25, 80, or 443.\n
\n
\n

Recommended Action

\n
\nRestrict access to only those IP addresses that require it. To restrict access to a specific IP address, set the suffix to /32 (for example, 192.0.2.10/32). Be sure to delete overly permissive rules after creating rules that are more restrictive.\n
\n
\n

Additional Resources

\n
Amazon EC2 Security Groups
\nClassless Inter-Domain Routing (Wikipedia)", "id": "1iG5NDGVre", - "metadata": {}, + "metadata": { + "0": "Region", + "1": "Security Group Name", + "2": "Security Group ID", + "3": "Protocol", + "4": "Port", + "5": "Status", + "6": "IP Range" + }, "name": "Security Groups - Unrestricted Access", "pillars": ["security"], "source": "ta_check" @@ -473,22 +586,22 @@ "description": "Checks your usage of RDS and provides recommendations on purchase of Reserved Instances to help reduce costs incurred from using RDS On-Demand. AWS generates these recommendations by analyzing your On-Demand usage for the past 30 days. We then simulate every combination of reservations in the generated category of usage in order to identify the best number of each type of Reserved Instance to purchase to maximize your savings. This check covers recommendations based on partial upfront payment option with 1-year or 3-year commitment. This check is not available to accounts linked in Consolidated Billing. Recommendations are only available for the Paying Account.

\r\n

Alert Criteria


\nYellow: Optimizing the purchase of RDS Reserved Instances can help reduce costs.

\r\n

Recommended Action


\r\nSee the Cost Explorer page for more detailed recommendations, customization options (e.g. look-back period, payment option, etc.) and to purchase RDS Reserved Instances.\n
\n
\n

Additional Resources


\nInformation on RDS Reserved Instances and how they can save you money can be found here.
\nFor more information on this recommendation, see Reserved Instance Optimization Check Questions in the Trusted Advisor FAQs.
\nFor more detailed description of fields, see Cost Explorer documentation", "id": "1qazXsw23e", "metadata": { - "properties.averageUtilization": "Expected Average Reserved Instance Utilization", - "properties.databaseEdition": "Database Edition", - "properties.databaseEngine": "Database Engine", - "properties.deploymentOption": "Deployment Option", - "properties.estimatedBreakEvenInMonths": "Estimated Break Even (months)", - "properties.estimatedMonthlyOnDemandCost": "Estimated On-Demand Cost Post Recommended Reserved Instance Purchase (monthly)", - "properties.estimatedMonthlySavingsAmount": "Estimated Savings with Recommendation (monthly)", - "properties.family": "Family", - "properties.instanceType": "Instance Type", - "properties.licenseModel": "License Model", - "properties.lookbackPeriodInDays": "Lookback Period (days)", - "properties.recommendedNumberOfInstancesToPurchase": "Recommended number of Reserved Instances to purchase", - "properties.recurringStandardMonthlyCost": "Estimated cost of Reserved Instances (monthly)", - "properties.region": "Region", - "properties.termInYears": "Term (years)", - "properties.upfrontCost": "Upfront Cost of Reserved Instances" + "0": "Region", + "1": "Family", + "10": "Upfront Cost of Reserved Instances", + "11": "Estimated cost of Reserved Instances (monthly)", + "12": "Estimated On-Demand Cost Post Recommended Reserved Instance Purchase (monthly)", + "13": "Estimated Break Even (months)", + "14": "Lookback Period (days)", + "15": "Term (years)", + "2": "Instance Type", + "3": "License Model", + "4": "Database Edition", + "5": "Database Engine", + "6": "Deployment Option", + "7": "Recommended number of Reserved Instances to purchase", + "8": "Expected Average Reserved Instance Utilization", + "9": "Estimated Savings with Recommendation (monthly)" }, "name": "Amazon Relational Database Service (RDS) Reserved Instance Optimization", "pillars": ["cost_optimizing"], @@ -500,25 +613,25 @@ "description": "Checks your usage of Redshift and provides recommendations on purchase of Reserved Nodes to help reduce costs incurred from using Redshift On-Demand. AWS generates these recommendations by analyzing your On-Demand usage for the past 30 days. We then simulate every combination of reservations in the generated category of usage in order to identify the best number of each type of Reserved Nodes to purchase to maximize your savings. This check covers recommendations based on partial upfront payment option with 1-year or 3-year commitment. This check is not available to accounts linked in Consolidated Billing. Recommendations are only available for the Paying Account.

\n

Alert Criteria


Yellow: Optimizing the purchase of Redshift Reserved Nodes can help reduce costs.

\n

Recommended Action


See the Cost Explorer page for more detailed recommendations, customization options (e.g. look-back period, payment option, etc.) and to purchase Redshift Reserved Nodes.

\n

Additional Resources


Information on Redshift Reserved Nodes and how they can save you money can be found here.
\nFor more information on this recommendation, see Reserved Instance Optimization Check Questions in the Trusted Advisor FAQs.
\nFor more detailed description of fields, see Cost Explorer documentation", "id": "1qw23er45t", "metadata": { - "properties.averageUtilization": "Expected Average Reserved Node Utilization", - "properties.estimatedBreakEvenInMonths": "Estimated Break Even (months)", - "properties.estimatedMonthlyOnDemandCost": "Estimated On-Demand Cost Post Recommended Reserved Nodes Purchase (monthly)", - "properties.estimatedMonthlySavingsAmount": "Estimated Savings with Recommendation (monthly)", - "properties.family": "Family", - "properties.lookbackPeriodInDays": "Lookback Period (days)", - "properties.nodeType": "Node Type", - "properties.recommendedNumberOfInstancesToPurchase": "Recommended number of Reserved Nodes to purchase", - "properties.recurringStandardMonthlyCost": "Estimated cost of Reserved Nodes (monthly)", - "properties.region": "Region", - "properties.termInYears": "Term (years)", - "properties.upfrontCost": "Upfront Cost of Reserved Nodes" + "0": "Region", + "1": "Family", + "10": "Lookback Period (days)", + "11": "Term (years)", + "2": "Node Type", + "3": "Recommended number of Reserved Nodes to purchase", + "4": "Expected Average Reserved Node Utilization", + "5": "Estimated Savings with Recommendation (monthly)", + "6": "Upfront Cost of Reserved Nodes", + "7": "Estimated cost of Reserved Nodes (monthly)", + "8": "Estimated On-Demand Cost Post Recommended Reserved Nodes Purchase (monthly)", + "9": "Estimated Break Even (months)" }, "name": "Amazon Redshift Reserved Node Optimization", "pillars": ["cost_optimizing"], "source": "ta_check" } ], - "nextToken": "AAMA-EFRSURBSGhRVGVBMmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBRVVwQzBxdDBCOFAzZDRJczV2aGN0cUFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTWxoM2N4K1JBTm9TM2tqVHNBZ0VRZ0R0U1hlNzVJNG4vZHljU0plUWN6NHJONVVHZmVEQ1FsT3pQdmx3V29lUndJMWs4QldJZ3FIRnNJMDUzSTRNSnlWQUsxeCtJN1ROM2hrcmZPUT09sJdl-7H5vLEjKO0UvvSHSUgK48BRPR5gU8d9MbO68zE_aQsbJcIiW0AAVnc6YGhUFEcdpnIszLoB6QHKZwTnEIXv5jkt7nFhorlfeT_YqCAPMrQsbJKGwCRAyTkHYPbQCHZtlE-hb9TnGmBO1I44yB9yoqE2iy9BwsdGm_GDAtBkDWng_WJP0_qWBnZlbtGnJrseVbV5UN1vNfTvxFJ1TQ8JSQpiFwgQ_JIMcj3fVyhON1K1QoWGn6fPpYyN5ZwNh4imjrIBl3O3RoKz5EXpJG3yFqA_UhXIfQa0eaNcRqNadbYkLok=" + "nextToken": "" } } ], @@ -658,10 +771,13 @@ { "accountId": "000000000000", "accountRecommendationArn": "arn:aws:trustedadvisor::000000000000:recommendation/9534ec9b-bf3a-44e8-8213-2ed68b39d9d5", - "lifecycleStage": "resolved" + "lifecycleStage": "resolved", + "updateReason": "Resolved issue", + "updateReasonCode": "valid_business_case", + "lastUpdatedAt": "2023-01-17T18:25:44.552Z" } ], - "nextToken": "AAMA-EFRSURBSGhRVGVBMmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBRXh1QXZLTHlrTTFGcExuNmxVbWcxdEFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTUY2WWU5NVVZZXVBY0ZyOS9BZ0VRZ0RzZmZWdkFNYWU3akxUS0Fmc1dBUmdsTlJadWI3ZDhGWHF5eTNBOTloenpzNUJ3WUZnWjY3MzM1N3B2eGVQcDhQMHl3NGJrSFlHMTNEN0NaQT09KF3n6Ghj-Z9I8pjzwpxNB8fZMSZCS2Eh5pZdfoz5BP87e0KUXIzWLwupY-OGmK_klEh_J6lQMjVZmvR_C1BqTqZs0t3O0UNh29UPNdvfxIC2y2Wkrl4vKf8Zjs60ysx_eP9vVX01kpv1mxacIji9gp6lCRkMEAMmCfqW8a4bUKLZ93umoGVdYCPn_nKZHMHvqDtpHO-zHMeW2hXf8RQNQKR9pfWDsp_NBjWBqkaTuNyjOE3ardMrFnyK7CMvIHjBwn8_8guzGpY0UKVNldWzyUQRbgVXTxF-xkSMzxrOm6rxMXFbrAE=" + "nextToken": "" } } ], @@ -791,18 +907,19 @@ "id": "bb38affc0ce0681d9a6cd13f302383ba03a8f63dfe7a379dc403c619119d86af", "lastUpdatedAt": "2023-11-01T15:09:51.891Z", "metadata": { - "daysSinceLastConnection": "14", - "estimatedMonthlySavings": "208.79999999999998", - "instanceName": "database-1-instance-1", - "instanceType": "db.r5.large", - "multiAZ": "false", - "region": "us-west-2", - "resourceARN": "arn:aws:rds:us-west-2:000000000000:db:database-1-instance-1", - "storageSizeGB": "1" + "0": "14", + "1": "208.79999999999998", + "2": "database-1-instance-1", + "3": "db.r5.large", + "4": "false", + "5": "us-west-2", + "6": "arn:aws:rds:us-west-2:000000000000:db:database-1-instance-1", + "7": "1" }, "recommendationArn": "arn:aws:trustedadvisor:::organization-recommendation/5a694939-2e54-45a2-ae72-730598fa89d0", "regionCode": "us-west-2", - "status": "warning" + "status": "warning", + "exclusionStatus": "excluded" }, { "arn": "arn:aws:trustedadvisor::000000000000:recommendation-resource/5a694939-2e54-45a2-ae72-730598fa89d0/51fded4d7a3278818df9cfe344ff5762cec46c095a6763d1ba1ba53bd0e1b0e6", @@ -810,18 +927,19 @@ "id": "51fded4d7a3278818df9cfe344ff5762cec46c095a6763d1ba1ba53bd0e1b0e6", "lastUpdatedAt": "2023-11-01T15:09:51.891Z", "metadata": { - "daysSinceLastConnection": "14", - "estimatedMonthlySavings": "31.679999999999996", - "instanceName": "database-1", - "instanceType": "db.t3.small", - "multiAZ": "false", - "region": "us-west-2", - "resourceARN": "arn:aws:rds:us-west-2:000000000000:db:database-1", - "storageSizeGB": "20" + "0": "14", + "1": "31.679999999999996", + "2": "database-1", + "3": "db.t3.small", + "4": "false", + "5": "us-west-2", + "6": "arn:aws:rds:us-west-2:000000000000:db:database-1", + "7": "20" }, "recommendationArn": "arn:aws:trustedadvisor:::organization-recommendation/5a694939-2e54-45a2-ae72-730598fa89d0", "regionCode": "us-west-2", - "status": "warning" + "status": "warning", + "exclusionStatus": "excluded" }, { "arn": "arn:aws:trustedadvisor::000000000000:recommendation-resource/5a694939-2e54-45a2-ae72-730598fa89d0/f4d01bd20f4cd5372062aafc8786c489e48f0ead7cdab121463bf9f89e40a36b", @@ -829,21 +947,22 @@ "id": "f4d01bd20f4cd5372062aafc8786c489e48f0ead7cdab121463bf9f89e40a36b", "lastUpdatedAt": "2023-11-01T15:09:51.891Z", "metadata": { - "daysSinceLastConnection": "14", - "estimatedMonthlySavings": "187.20000000000002", - "instanceName": "database-2-instance-1-us-west-2a", - "instanceType": "db.r6g.large", - "multiAZ": "true", - "region": "us-west-2", - "resourceARN": "arn:aws:rds:us-west-2:000000000000:db:database-2-instance-1-us-west-2a", - "storageSizeGB": "1" + "0": "14", + "1": "187.20000000000002", + "2": "database-2-instance-1-us-west-2a", + "3": "db.r6g.large", + "4": "true", + "5": "us-west-2", + "6": "arn:aws:rds:us-west-2:000000000000:db:database-2-instance-1-us-west-2a", + "7": "1" }, "recommendationArn": "arn:aws:trustedadvisor:::organization-recommendation/5a694939-2e54-45a2-ae72-730598fa89d0", "regionCode": "us-west-2", - "status": "warning" + "status": "warning", + "exclusionStatus": "included" } ], - "nextToken": "AAMA-EFRSURBSGhRVGVBMmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBRkh6azN0L1pnN1RldmE4L0N2TjRBOUFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTTF2dEdvL0hyYjgrekZxL3FBZ0VRZ0Rzem5HWHZiV2NhOG5TdEE5ZmFoWHpSRm1xU0dUcVAvOFBteW5OWFFkZjNKT3NMUXNDblVsMTlCUnZHS3BKQnFZTlNwbXl2VEllaGFEU1gvUT09W0JMIfQ6puz70ZdK2v6sV1XDCgBIh_e6D-jVUuQQjUaIoy0uLO9QfGrlcSiJ-WvNfhbg8zO0JLcNl6s6bXqZZPZYtnMXiZ_-ygAQhajX_ObCAOedCjpcfikGf6d6KwrjVUplGOaO_NA0Xp6LJExCnViusJCzmKbLOHoBSsdEknb4kY88-iZ1lebblumsWBxsZ8ADcguSLon5IXlejoDf6UukwoM3Z7EjIue3O_OR0gT9DST52shjyNObOzPizO-auI2ZoNKE1y4bzIKtWHzqRfAHHMT4VspFBm58564FqedKqF-D71k=" + "nextToken": "" } } ], @@ -894,6 +1013,13 @@ "smithy.api#httpQuery": "status" } }, + "exclusionStatus": { + "target": "com.amazonaws.trustedadvisor#ExclusionStatus", + "traits": { + "smithy.api#documentation": "

The exclusion status of the resource

", + "smithy.api#httpQuery": "exclusionStatus" + } + }, "regionCode": { "target": "smithy.api#String", "traits": { @@ -985,13 +1111,13 @@ "lifecycleStage": "resolved", "pillars": ["security"], "resourcesAggregates": { - "errorCount": 150, - "okCount": 500, - "warningCount": 100 + "errorCount": 0, + "okCount": 0, + "warningCount": 0 }, "source": "ta_check", - "status": "ok", - "type": "standard" + "status": "warning", + "type": "priority" }, { "arn": "arn:aws:trustedadvisor:::organization-recommendation/4ecff4d4-1bc1-4c99-a5b8-0fff9ee500d6", @@ -1002,23 +1128,23 @@ "lifecycleStage": "resolved", "pillars": ["security"], "resourcesAggregates": { - "errorCount": 150, - "okCount": 500, - "warningCount": 100 + "errorCount": 0, + "okCount": 0, + "warningCount": 0 }, "source": "ta_check", - "status": "ok", - "type": "standard" + "status": "warning", + "type": "priority" } ], - "nextToken": "AAMA-EFRSURBSGhRVGVBCmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBSEwveUo0WGtzUERDZUEweDdjVXNJUkFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVA1Q0tvVHlvaVBMMXBheFJBZ0VRZ0R0M3NSQXhJNVNoNVJGdFpXN2tjc3JRenlDSDFqaHRkbXp6VTYxZkw0V2lKbkhWeTFqZllaY2prNERPd1hUM2lZVjdZdnJpblRjRFNIVHExZz09wONgOWmSmHcQa82lL7tfrIIiz5kwiP348ZRHDFnNtRRBmuyjwEy8nWAjw_ldisYaifLWtlT31JCln5EAe7tt9c5D_pn2gh-m6EIakcQKX61DY-wuxYIKfeu1ibferY2wq_dTEbqXY6OVN-0N84GKe2azBRV9N80PLouIpG-bt9VjsqdTviEFs3eQnEDJnxRGQmgXrJQFTZIqSLDSsC2-niOVkY7HNvWtLT3fHvXUfFDfD5XlMeWL3DBbnD9beij553VbvnbuKj50BcoV2zWqgc8_eFM4xM0Gsc16OajX0Xio6ZdmwOM=" + "nextToken": "" } }, { "title": "Filter and return a max of one AWS Organization Recommendation that is a part of the \"security\" pillar", "input": { "pillar": "security", - "maxResults": 1 + "maxResults": 100 }, "output": { "organizationRecommendationSummaries": [ @@ -1031,24 +1157,24 @@ "lifecycleStage": "resolved", "pillars": ["security"], "resourcesAggregates": { - "errorCount": 150, - "okCount": 500, - "warningCount": 100 + "errorCount": 0, + "okCount": 0, + "warningCount": 0 }, "source": "ta_check", - "status": "ok", - "type": "standard" + "status": "warning", + "type": "priority" } ], - "nextToken": "AAMA-EFRSURBSGhRVGVBMmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBSG15cmpVYXd3bUtUM0J2dzhleUsyakFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTUFadFFiRTl2VmlCZWN4WHNBZ0VRZ0RzdWRPMTFVWDNjUW9MNStEeTU0QktWQlNMeDBSa3RoeG9UZVJONjRFQzJBUDdvMTdvRTMxTWlJL1FvdE9neGtYWk1aZmx1dFpybHBwRjRTUT093orMKsmELla57p7di2_DnzTGQJxzgjD9HBZApR3831zITqaZo5aTHJ8q59gon_DhD0s2sm3dY8f3SmZxI7IevqI6Vz1UTY0C3IIsyA6XrQiXwfNo36mumo_W7eSf9xNk1CD_to2qwxq-b6m1-88SfNzfvzoA4x52DBczJZNYERmdQRkh-CRs3CSnTdFdXvb8fuyONmJnJuSB5x06IIBpMhLIQqNYLkofnsWRxDUAppOE0aRNfzC4iajmWq9JiYytfc9yGsbU4bqplPYerEtSIRau0QfBrnfifJL7VilfaIwrEs_j_ekqLQ==" + "nextToken": "" } }, { "title": "Use the \"nextToken\" returned from a previous request to fetch the next page of filtered AWS Organization Recommendations that are a part of the \"security\" pillar", "input": { - "nextToken": "AAMA-EFRSURBSGhRVGVBMmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBSG15cmpVYXd3bUtUM0J2dzhleUsyakFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTUFadFFiRTl2VmlCZWN4WHNBZ0VRZ0RzdWRPMTFVWDNjUW9MNStEeTU0QktWQlNMeDBSa3RoeG9UZVJONjRFQzJBUDdvMTdvRTMxTWlJL1FvdE9neGtYWk1aZmx1dFpybHBwRjRTUT093orMKsmELla57p7di2_DnzTGQJxzgjD9HBZApR3831zITqaZo5aTHJ8q59gon_DhD0s2sm3dY8f3SmZxI7IevqI6Vz1UTY0C3IIsyA6XrQiXwfNo36mumo_W7eSf9xNk1CD_to2qwxq-b6m1-88SfNzfvzoA4x52DBczJZNYERmdQRkh-CRs3CSnTdFdXvb8fuyONmJnJuSB5x06IIBpMhLIQqNYLkofnsWRxDUAppOE0aRNfzC4iajmWq9JiYytfc9yGsbU4bqplPYerEtSIRau0QfBrnfifJL7VilfaIwrEs_j_ekqLQ==", + "nextToken": "", "pillar": "security", - "maxResults": 1 + "maxResults": 100 }, "output": { "organizationRecommendationSummaries": [ @@ -1061,13 +1187,13 @@ "lifecycleStage": "resolved", "pillars": ["security"], "resourcesAggregates": { - "errorCount": 150, - "okCount": 500, - "warningCount": 100 + "errorCount": 0, + "okCount": 0, + "warningCount": 0 }, "source": "ta_check", - "status": "ok", - "type": "standard" + "status": "warning", + "type": "priority" } ] } @@ -1240,18 +1366,19 @@ "awsResourceId": "webcms-dev-01", "lastUpdatedAt": "2023-11-01T15:09:51.891Z", "metadata": { - "daysSinceLastConnection": "14", - "estimatedMonthlySavings": "123.12000000000002", - "instanceName": "webcms-dev-01", - "instanceType": "db.m6i.large", - "multiAZ": "false", - "region": "us-east-1", - "resourceARN": "arn:aws:rds:us-east-1:000000000000:db:webcms-dev-01", - "storageSizeGB": "20" + "0": "14", + "1": "123.12000000000002", + "2": "webcms-dev-01", + "3": "db.m6i.large", + "4": "false", + "5": "us-east-1", + "6": "arn:aws:rds:us-east-1:000000000000:db:webcms-dev-01", + "7": "20" }, "recommendationArn": "arn:aws:trustedadvisor::000000000000:recommendation/55fa4d2e-bbb7-491a-833b-5773e9589578", "regionCode": "us-east-1", - "status": "warning" + "status": "warning", + "exclusionStatus": "excluded" }, { "arn": "arn:aws:trustedadvisor::000000000000:recommendation-resource/55fa4d2e-bbb7-491a-833b-5773e9589578/e6367ff500ac90db8e4adeb4892e39ee9c36bbf812dcbce4b9e4fefcec9eb63e", @@ -1259,18 +1386,19 @@ "awsResourceId": "aws-dev-db-stack-instance-1", "lastUpdatedAt": "2023-11-01T15:09:51.891Z", "metadata": { - "daysSinceLastConnection": "14", - "estimatedMonthlySavings": "29.52", - "instanceName": "aws-dev-db-stack-instance-1", - "instanceType": "db.t2.small", - "multiAZ": "false", - "region": "us-east-1", - "resourceARN": "arn:aws:rds:us-east-1:000000000000:db:aws-dev-db-stack-instance-1", - "storageSizeGB": "1" + "0": "14", + "1": "29.52", + "2": "aws-dev-db-stack-instance-1", + "3": "db.t2.small", + "4": "false", + "5": "us-east-1", + "6": "arn:aws:rds:us-east-1:000000000000:db:aws-dev-db-stack-instance-1", + "7": "1" }, "recommendationArn": "arn:aws:trustedadvisor::000000000000:recommendation/55fa4d2e-bbb7-491a-833b-5773e9589578", "regionCode": "us-east-1", - "status": "warning" + "status": "warning", + "exclusionStatus": "included" }, { "arn": "arn:aws:trustedadvisor::000000000000:recommendation-resource/55fa4d2e-bbb7-491a-833b-5773e9589578/31aa78ba050a5015d2d38cca7f5f1ce88f70857c4e1c3ad03f8f9fd95dad7459", @@ -1278,21 +1406,22 @@ "awsResourceId": "aws-awesome-apps-stack-db", "lastUpdatedAt": "2023-11-01T15:09:51.891Z", "metadata": { - "daysSinceLastConnection": "14", - "estimatedMonthlySavings": "114.48000000000002", - "instanceName": "aws-awesome-apps-stack-db", - "instanceType": "db.m6g.large", - "multiAZ": "false", - "region": "us-east-1", - "resourceARN": "arn:aws:rds:us-east-1:000000000000:db:aws-awesome-apps-stack-db", - "storageSizeGB": "100" + "0": "14", + "1": "114.48000000000002", + "2": "aws-awesome-apps-stack-db", + "3": "db.m6g.large", + "4": "false", + "5": "us-east-1", + "6": "arn:aws:rds:us-east-1:000000000000:db:aws-awesome-apps-stack-db", + "7": "100" }, "recommendationArn": "arn:aws:trustedadvisor::000000000000:recommendation/55fa4d2e-bbb7-491a-833b-5773e9589578", "regionCode": "us-east-1", - "status": "warning" + "status": "warning", + "exclusionStatus": "excluded" } ], - "nextToken": "AAMA-EFRSURBSGhRVGVBMmJTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBRmZpZ2taY09rdSt5VXhocEdLR0k3TUFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTWZoU3BQNUxtMkt3THpCTG5BZ0VRZ0R2WjBHdzljc3RsV2ZiSkg0QkcvUkJQZDhIc0dGTHNLOXhLc1p5bU8vVlBtYy90dThSYmVKVUhxM3RTS1JwUDB4bWp2dU1jSGQxV3BOTU40UT09pyOzpADaUjX5i75XDGEpw6TEkHoxZsepcoWjQtXjvAYrKILVkdI0lpSZqghK4mPnFGgecInr0_-BJ4ud9TPCZmnNxr7MuYTYJVFWArAaddEw3oJFOY8YLQHjJ37LsY_dEpMN6oDwdAdcdyEZBUBeK71f6XPQa0S1sw5Si_NYuJEvQ3bPZiS8V07IUkUUhe_gE1_xjGK2mA3eTW0wiylW0l8jfz3u8lC6md_5GmvVrtphEkWoc4A9DIfR9CsX_bmvOa4P3NI9rZ9-gezuhkd3k3nXqH52hZPI1fl5iyd4vSFXlvaeawI=" + "nextToken": "" } } ], @@ -1343,6 +1472,13 @@ "smithy.api#httpQuery": "status" } }, + "exclusionStatus": { + "target": "com.amazonaws.trustedadvisor#ExclusionStatus", + "traits": { + "smithy.api#documentation": "

The exclusion status of the resource

", + "smithy.api#httpQuery": "exclusionStatus" + } + }, "regionCode": { "target": "smithy.api#String", "traits": { @@ -1433,7 +1569,7 @@ }, "pillars": ["security"], "resourcesAggregates": { - "errorCount": 0, + "errorCount": 1, "okCount": 0, "warningCount": 0 }, @@ -1457,22 +1593,22 @@ "pillars": ["service_limits"], "resourcesAggregates": { "errorCount": 0, - "okCount": 0, - "warningCount": 0 + "okCount": 3, + "warningCount": 6 }, "source": "ta_check", - "status": "ok", + "status": "warning", "type": "standard" } ], - "nextToken": "AAMA-EFRSURBSGhRVGVBMmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBR3RUWW1ma3MwY0plS0llWENTZHV0SkFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTUVSUDNkclhLblpkd3h4MW5BZ0VRZ0RzTFBpOTlzZmppYXJxMjJoMHlRWDV6bkFuRGZna3FOZEpKaWtuUGloUWpFRzFrSnR6eWV2UGVjWFZudEw1RHQ0dkdvQ1RXL2hGeERFNG44QT09NZONpU850LXJxneOHiAMVmAkpDmCUH5-ob34VBXNqkq9y3s54mW4se3VGv6Ds85WwEaW9uEAM3HpLWMLJjw6u3rLFdwzvNsmicgmGvBd_kZVXJ_bo3Oqgo9koXDg5ltCZt8nxhp-6FnU8dyBDdSENAlQ3ldIb6QIyyRCH5185coh7UYIjbtd7Ne-TMgHk2HsLongKnbz1Lq6dfOm3mqHyJHAmrU8Qnbm10X2Ph9ZsolloEw4HiGMdEKL5-DnGRgXp3gZLuOTrAuukHwqpd1-cRZYHxmjaIUFiSuVuSC4QlWDeeiqlPo=" + "nextToken": "" } }, { "title": "Filter and return a max of one Recommendation that is a part of AWS IAM", "input": { "awsService": "iam", - "maxResults": 1 + "maxResults": 100 }, "output": { "recommendationSummaries": [ @@ -1491,7 +1627,7 @@ }, "pillars": ["security"], "resourcesAggregates": { - "errorCount": 0, + "errorCount": 1, "okCount": 0, "warningCount": 0 }, @@ -1500,15 +1636,15 @@ "type": "standard" } ], - "nextToken": "AAMA-EFRSURBSGhRVGVBMmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBR01zYktEMDlmSm5nSkM1TGYzaWtTNkFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVlwVDdDRk01cTdzV0JnRmhBZ0VRZ0R1dVg4dkVOYjZYTHJ6WVhvUlBWQVg1YU5KZkkraElsNk5lTjh3TXpzWkhHUEVzWXNkbXI2bTZzNTl1TEhKWUN2dGpqOENpTzVzM0FDT3BqZz09S35zPCUsSxxYFtdXw7z8BaSuDmz9P1Toit_MFrXsfpnPmDd6Q1f1NaJhi3O8NoZvzinXknKoKxTeqSumUaHe7W3n6Xa3661LF979aPdhifpKw3-MQpb5oGdXGgU7UMlXHzwISkND7sLlh_s0V-jkRvWPZjLHwLg4dUCQnIqMEwo5G3IG6Ffn-SKHhqPimTnzgOrxK2i9LA0EEj6msvH00h4YXuG9M3hFP9X52T19ZGZfdDPhVKCtSshXtQ8zcCUB8ykgw8ROJvAwzQk8I1PMIS4dirHySKOgoowu4Um3bZE6hHex-zXsjA==" + "nextToken": "" } }, { - "title": "Use the \"nextToken\" returned from a previous request to fetch the next page of filtered Recommendations that are a part of AWS IAM", + "title": "Use the \"nextToken\" returned from a previous request to fetch the next page of filtered Recommendations", "input": { - "nextToken": "AAMA-EFRSURBSGhRVGVBMmRTaGNReVg2WmJuREtyc2QxUDBYdktFVDg3dXVCMkM2UHVseVBBR01zYktEMDlmSm5nSkM1TGYzaWtTNkFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVlwVDdDRk01cTdzV0JnRmhBZ0VRZ0R1dVg4dkVOYjZYTHJ6WVhvUlBWQVg1YU5KZkkraElsNk5lTjh3TXpzWkhHUEVzWXNkbXI2bTZzNTl1TEhKWUN2dGpqOENpTzVzM0FDT3BqZz09S35zPCUsSxxYFtdXw7z8BaSuDmz9P1Toit_MFrXsfpnPmDd6Q1f1NaJhi3O8NoZvzinXknKoKxTeqSumUaHe7W3n6Xa3661LF979aPdhifpKw3-MQpb5oGdXGgU7UMlXHzwISkND7sLlh_s0V-jkRvWPZjLHwLg4dUCQnIqMEwo5G3IG6Ffn-SKHhqPimTnzgOrxK2i9LA0EEj6msvH00h4YXuG9M3hFP9X52T19ZGZfdDPhVKCtSshXtQ8zcCUB8ykgw8ROJvAwzQk8I1PMIS4dirHySKOgoowu4Um3bZE6hHex-zXsjA==", - "awsService": "iam", - "maxResults": 1 + "nextToken": "", + "awsService": "rds", + "maxResults": 100 }, "output": { "recommendationSummaries": [ @@ -1528,11 +1664,11 @@ "pillars": ["service_limits"], "resourcesAggregates": { "errorCount": 0, - "okCount": 0, - "warningCount": 0 + "okCount": 3, + "warningCount": 6 }, "source": "ta_check", - "status": "ok", + "status": "warning", "type": "standard" } ] @@ -1884,6 +2020,13 @@ "smithy.api#timestampFormat": "date-time" } }, + "exclusionStatus": { + "target": "com.amazonaws.trustedadvisor#ExclusionStatus", + "traits": { + "smithy.api#default": "included", + "smithy.api#documentation": "

The exclusion status of the Recommendation Resource

" + } + }, "accountId": { "target": "com.amazonaws.trustedadvisor#AccountId", "traits": { @@ -2385,6 +2528,41 @@ "smithy.api#pattern": "^arn:[\\w-]+:trustedadvisor::\\d{12}:recommendation-resource\\/[\\w-]+\\/[\\w-]+$" } }, + "com.amazonaws.trustedadvisor#RecommendationResourceExclusion": { + "type": "structure", + "members": { + "arn": { + "target": "com.amazonaws.trustedadvisor#RecommendationResourceArn", + "traits": { + "smithy.api#documentation": "

The ARN of the Recommendation Resource

", + "smithy.api#required": {} + } + }, + "isExcluded": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "

The exclusion status

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#documentation": "

The request entry for Recommendation Resource exclusion. Each entry is a combination of Recommendation Resource ARN and corresponding exclusion status

" + } + }, + "com.amazonaws.trustedadvisor#RecommendationResourceExclusionList": { + "type": "list", + "member": { + "target": "com.amazonaws.trustedadvisor#RecommendationResourceExclusion" + }, + "traits": { + "smithy.api#length": { + "min": 1, + "max": 100 + }, + "smithy.api#uniqueItems": {} + } + }, "com.amazonaws.trustedadvisor#RecommendationResourceSummary": { "type": "structure", "members": { @@ -2438,6 +2616,13 @@ "smithy.api#timestampFormat": "date-time" } }, + "exclusionStatus": { + "target": "com.amazonaws.trustedadvisor#ExclusionStatus", + "traits": { + "smithy.api#default": "included", + "smithy.api#documentation": "

The exclusion status of the Recommendation Resource

" + } + }, "recommendationArn": { "target": "com.amazonaws.trustedadvisor#AccountRecommendationArn", "traits": { @@ -2798,6 +2983,9 @@ "type": "service", "version": "2022-09-15", "operations": [ + { + "target": "com.amazonaws.trustedadvisor#BatchUpdateRecommendationResourceExclusion" + }, { "target": "com.amazonaws.trustedadvisor#GetOrganizationRecommendation" }, @@ -3572,7 +3760,7 @@ } ], "traits": { - "smithy.api#documentation": "

Update the lifecyle of a Recommendation within an Organization. This API only supports prioritized\n recommendations.\n

", + "smithy.api#documentation": "

Update the lifecycle of a Recommendation within an Organization. This API only supports prioritized\n recommendations.\n

", "smithy.api#examples": [ { "title": "Update the lifecycle stage of an AWS Organization's Recommendation that is managed by AWS Trusted Advisor Priority", @@ -3791,6 +3979,38 @@ } } }, + "com.amazonaws.trustedadvisor#UpdateRecommendationResourceExclusionError": { + "type": "structure", + "members": { + "arn": { + "target": "com.amazonaws.trustedadvisor#RecommendationResourceArn", + "traits": { + "smithy.api#documentation": "

The ARN of the Recommendation Resource

" + } + }, + "errorCode": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "

The error code

" + } + }, + "errorMessage": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "

The error message

" + } + } + }, + "traits": { + "smithy.api#documentation": "

The error entry for Recommendation Resource exclusion. Each entry is a combination of Recommendation Resource ARN, error code and error message

" + } + }, + "com.amazonaws.trustedadvisor#UpdateRecommendationResourceExclusionErrorList": { + "type": "list", + "member": { + "target": "com.amazonaws.trustedadvisor#UpdateRecommendationResourceExclusionError" + } + }, "com.amazonaws.trustedadvisor#ValidationException": { "type": "structure", "members": {