%% WARNING: DO NOT EDIT, AUTO-GENERATED CODE! %% See https://github.com/aws-beam/aws-codegen for more details. %% @doc You can use the Cost Explorer API to programmatically query your cost %% and usage data. %% %% You can query for aggregated data such as total monthly costs or total %% daily usage. You can also query for granular data. This might include the %% number of daily write operations for Amazon DynamoDB database tables in %% your production environment. %% %% Service Endpoint %% %% The Cost Explorer API provides the following endpoint: %% %% For information about the costs that are associated with the %% Cost Explorer API, see Amazon Web Services Cost Management Pricing. -module(aws_cost_explorer). -export([create_anomaly_monitor/2, create_anomaly_monitor/3, create_anomaly_subscription/2, create_anomaly_subscription/3, create_cost_category_definition/2, create_cost_category_definition/3, delete_anomaly_monitor/2, delete_anomaly_monitor/3, delete_anomaly_subscription/2, delete_anomaly_subscription/3, delete_cost_category_definition/2, delete_cost_category_definition/3, describe_cost_category_definition/2, describe_cost_category_definition/3, get_anomalies/2, get_anomalies/3, get_anomaly_monitors/2, get_anomaly_monitors/3, get_anomaly_subscriptions/2, get_anomaly_subscriptions/3, get_cost_and_usage/2, get_cost_and_usage/3, get_cost_and_usage_with_resources/2, get_cost_and_usage_with_resources/3, get_cost_categories/2, get_cost_categories/3, get_cost_forecast/2, get_cost_forecast/3, get_dimension_values/2, get_dimension_values/3, get_reservation_coverage/2, get_reservation_coverage/3, get_reservation_purchase_recommendation/2, get_reservation_purchase_recommendation/3, get_reservation_utilization/2, get_reservation_utilization/3, get_rightsizing_recommendation/2, get_rightsizing_recommendation/3, get_savings_plans_coverage/2, get_savings_plans_coverage/3, get_savings_plans_purchase_recommendation/2, get_savings_plans_purchase_recommendation/3, get_savings_plans_utilization/2, get_savings_plans_utilization/3, get_savings_plans_utilization_details/2, get_savings_plans_utilization_details/3, get_tags/2, get_tags/3, get_usage_forecast/2, get_usage_forecast/3, list_cost_category_definitions/2, list_cost_category_definitions/3, provide_anomaly_feedback/2, provide_anomaly_feedback/3, update_anomaly_monitor/2, update_anomaly_monitor/3, update_anomaly_subscription/2, update_anomaly_subscription/3, update_cost_category_definition/2, update_cost_category_definition/3]). -include_lib("hackney/include/hackney_lib.hrl"). %%==================================================================== %% API %%==================================================================== %% @doc Creates a new cost anomaly detection monitor with the requested type %% and monitor specification. create_anomaly_monitor(Client, Input) when is_map(Client), is_map(Input) -> create_anomaly_monitor(Client, Input, []). create_anomaly_monitor(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreateAnomalyMonitor">>, Input, Options). %% @doc Adds a subscription to a cost anomaly detection monitor. %% %% You can use each subscription to define subscribers with email or SNS %% notifications. Email subscribers can set a dollar threshold and a time %% frequency for receiving notifications. create_anomaly_subscription(Client, Input) when is_map(Client), is_map(Input) -> create_anomaly_subscription(Client, Input, []). create_anomaly_subscription(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreateAnomalySubscription">>, Input, Options). %% @doc Creates a new Cost Category with the requested name and rules. create_cost_category_definition(Client, Input) when is_map(Client), is_map(Input) -> create_cost_category_definition(Client, Input, []). create_cost_category_definition(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreateCostCategoryDefinition">>, Input, Options). %% @doc Deletes a cost anomaly monitor. delete_anomaly_monitor(Client, Input) when is_map(Client), is_map(Input) -> delete_anomaly_monitor(Client, Input, []). delete_anomaly_monitor(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DeleteAnomalyMonitor">>, Input, Options). %% @doc Deletes a cost anomaly subscription. delete_anomaly_subscription(Client, Input) when is_map(Client), is_map(Input) -> delete_anomaly_subscription(Client, Input, []). delete_anomaly_subscription(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DeleteAnomalySubscription">>, Input, Options). %% @doc Deletes a Cost Category. %% %% Expenses from this month going forward will no longer be categorized with %% this Cost Category. delete_cost_category_definition(Client, Input) when is_map(Client), is_map(Input) -> delete_cost_category_definition(Client, Input, []). delete_cost_category_definition(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DeleteCostCategoryDefinition">>, Input, Options). %% @doc Returns the name, ARN, rules, definition, and effective dates of a %% Cost Category that's defined in the account. %% %% You have the option to use `EffectiveOn' to return a Cost Category that is %% active on a specific date. If there is no `EffectiveOn' specified, you’ll %% see a Cost Category that is effective on the current date. If Cost %% Category is still effective, `EffectiveEnd' is omitted in the response. describe_cost_category_definition(Client, Input) when is_map(Client), is_map(Input) -> describe_cost_category_definition(Client, Input, []). describe_cost_category_definition(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeCostCategoryDefinition">>, Input, Options). %% @doc Retrieves all of the cost anomalies detected on your account during %% the time period that's specified by the `DateInterval' object. get_anomalies(Client, Input) when is_map(Client), is_map(Input) -> get_anomalies(Client, Input, []). get_anomalies(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetAnomalies">>, Input, Options). %% @doc Retrieves the cost anomaly monitor definitions for your account. %% %% You can filter using a list of cost anomaly monitor Amazon Resource Names %% (ARNs). get_anomaly_monitors(Client, Input) when is_map(Client), is_map(Input) -> get_anomaly_monitors(Client, Input, []). get_anomaly_monitors(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetAnomalyMonitors">>, Input, Options). %% @doc Retrieves the cost anomaly subscription objects for your account. %% %% You can filter using a list of cost anomaly monitor Amazon Resource Names %% (ARNs). get_anomaly_subscriptions(Client, Input) when is_map(Client), is_map(Input) -> get_anomaly_subscriptions(Client, Input, []). get_anomaly_subscriptions(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetAnomalySubscriptions">>, Input, Options). %% @doc Retrieves cost and usage metrics for your account. %% %% You can specify which cost and usage-related metric that you want the %% request to return. For example, you can specify `BlendedCosts' or %% `UsageQuantity'. You can also filter and group your data by various %% dimensions, such as `SERVICE' or `AZ', in a specific time range. For a %% complete list of valid dimensions, see the GetDimensionValues operation. %% Management account in an organization in Organizations have access to all %% member accounts. %% %% For information about filter limitations, see Quotas and restrictions in %% the Billing and Cost Management User Guide. get_cost_and_usage(Client, Input) when is_map(Client), is_map(Input) -> get_cost_and_usage(Client, Input, []). get_cost_and_usage(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetCostAndUsage">>, Input, Options). %% @doc Retrieves cost and usage metrics with resources for your account. %% %% You can specify which cost and usage-related metric, such as %% `BlendedCosts' or `UsageQuantity', that you want the request to return. %% You can also filter and group your data by various dimensions, such as %% `SERVICE' or `AZ', in a specific time range. For a complete list of valid %% dimensions, see the GetDimensionValues operation. Management account in an %% organization in Organizations have access to all member accounts. This API %% is currently available for the Amazon Elastic Compute Cloud – Compute %% service only. %% %% This is an opt-in only feature. You can enable this feature from the Cost %% Explorer Settings page. For information on how to access the Settings %% page, see Controlling Access for Cost Explorer in the Billing and Cost %% Management User Guide. get_cost_and_usage_with_resources(Client, Input) when is_map(Client), is_map(Input) -> get_cost_and_usage_with_resources(Client, Input, []). get_cost_and_usage_with_resources(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetCostAndUsageWithResources">>, Input, Options). %% @doc Retrieves an array of Cost Category names and values incurred cost. %% %% If some Cost Category names and values are not associated with any cost, %% they will not be returned by this API. get_cost_categories(Client, Input) when is_map(Client), is_map(Input) -> get_cost_categories(Client, Input, []). get_cost_categories(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetCostCategories">>, Input, Options). %% @doc Retrieves a forecast for how much Amazon Web Services predicts that %% you will spend over the forecast time period that you select, based on %% your past costs. get_cost_forecast(Client, Input) when is_map(Client), is_map(Input) -> get_cost_forecast(Client, Input, []). get_cost_forecast(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetCostForecast">>, Input, Options). %% @doc Retrieves all available filter values for a specified filter over a %% period of time. %% %% You can search the dimension values for an arbitrary string. get_dimension_values(Client, Input) when is_map(Client), is_map(Input) -> get_dimension_values(Client, Input, []). get_dimension_values(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetDimensionValues">>, Input, Options). %% @doc Retrieves the reservation coverage for your account. %% %% This enables you to see how much of your Amazon Elastic Compute Cloud, %% Amazon ElastiCache, Amazon Relational Database Service, or Amazon Redshift %% usage is covered by a reservation. An organization's management account %% can see the coverage of the associated member accounts. This supports %% dimensions, Cost Categories, and nested expressions. For any time period, %% you can filter data about reservation usage by the following dimensions: %% %% To determine valid values for a dimension, use the %% `GetDimensionValues' operation. get_reservation_coverage(Client, Input) when is_map(Client), is_map(Input) -> get_reservation_coverage(Client, Input, []). get_reservation_coverage(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetReservationCoverage">>, Input, Options). %% @doc Gets recommendations for which reservations to purchase. %% %% These recommendations could help you reduce your costs. Reservations %% provide a discounted hourly rate (up to 75%) compared to On-Demand %% pricing. %% %% Amazon Web Services generates your recommendations by identifying your %% On-Demand usage during a specific time period and collecting your usage %% into categories that are eligible for a reservation. After Amazon Web %% Services has these categories, it simulates every combination of %% reservations in each category of usage to identify the best number of each %% type of RI to purchase to maximize your estimated savings. %% %% For example, Amazon Web Services automatically aggregates your Amazon EC2 %% Linux, shared tenancy, and c4 family usage in the US West (Oregon) Region %% and recommends that you buy size-flexible regional reservations to apply %% to the c4 family usage. Amazon Web Services recommends the smallest size %% instance in an instance family. This makes it easier to purchase a %% size-flexible RI. Amazon Web Services also shows the equal number of %% normalized units so that you can purchase any instance size that you want. %% For this example, your RI recommendation would be for `c4.large' because %% that is the smallest size instance in the c4 instance family. get_reservation_purchase_recommendation(Client, Input) when is_map(Client), is_map(Input) -> get_reservation_purchase_recommendation(Client, Input, []). get_reservation_purchase_recommendation(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetReservationPurchaseRecommendation">>, Input, Options). %% @doc Retrieves the reservation utilization for your account. %% %% Management account in an organization have access to member accounts. You %% can filter data by dimensions in a time period. You can use %% `GetDimensionValues' to determine the possible dimension values. %% Currently, you can group only by `SUBSCRIPTION_ID'. get_reservation_utilization(Client, Input) when is_map(Client), is_map(Input) -> get_reservation_utilization(Client, Input, []). get_reservation_utilization(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetReservationUtilization">>, Input, Options). %% @doc Creates recommendations that help you save cost by identifying idle %% and underutilized Amazon EC2 instances. %% %% Recommendations are generated to either downsize or terminate instances, %% along with providing savings detail and metrics. For details on %% calculation and function, see Optimizing Your Cost with Rightsizing %% Recommendations in the Billing and Cost Management User Guide. get_rightsizing_recommendation(Client, Input) when is_map(Client), is_map(Input) -> get_rightsizing_recommendation(Client, Input, []). get_rightsizing_recommendation(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetRightsizingRecommendation">>, Input, Options). %% @doc Retrieves the Savings Plans covered for your account. %% %% This enables you to see how much of your cost is covered by a Savings %% Plan. An organization’s management account can see the coverage of the %% associated member accounts. This supports dimensions, Cost Categories, and %% nested expressions. For any time period, you can filter data for Savings %% Plans usage with the following dimensions: %% %% To determine valid values for a dimension, use the %% `GetDimensionValues' operation. get_savings_plans_coverage(Client, Input) when is_map(Client), is_map(Input) -> get_savings_plans_coverage(Client, Input, []). get_savings_plans_coverage(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetSavingsPlansCoverage">>, Input, Options). %% @doc Retrieves your request parameters, Savings Plan Recommendations %% Summary and Details. get_savings_plans_purchase_recommendation(Client, Input) when is_map(Client), is_map(Input) -> get_savings_plans_purchase_recommendation(Client, Input, []). get_savings_plans_purchase_recommendation(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetSavingsPlansPurchaseRecommendation">>, Input, Options). %% @doc Retrieves the Savings Plans utilization for your account across date %% ranges with daily or monthly granularity. %% %% Management account in an organization have access to member accounts. You %% can use `GetDimensionValues' in `SAVINGS_PLANS' to determine the possible %% dimension values. %% %% You cannot group by any dimension values for `GetSavingsPlansUtilization'. get_savings_plans_utilization(Client, Input) when is_map(Client), is_map(Input) -> get_savings_plans_utilization(Client, Input, []). get_savings_plans_utilization(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetSavingsPlansUtilization">>, Input, Options). %% @doc Retrieves attribute data along with aggregate utilization and savings %% data for a given time period. %% %% This doesn't support granular or grouped data (daily/monthly) in response. %% You can't retrieve data by dates in a single response similar to %% `GetSavingsPlanUtilization', but you have the option to make multiple %% calls to `GetSavingsPlanUtilizationDetails' by providing individual dates. %% You can use `GetDimensionValues' in `SAVINGS_PLANS' to determine the %% possible dimension values. %% %% `GetSavingsPlanUtilizationDetails' internally groups data by %% `SavingsPlansArn'. get_savings_plans_utilization_details(Client, Input) when is_map(Client), is_map(Input) -> get_savings_plans_utilization_details(Client, Input, []). get_savings_plans_utilization_details(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetSavingsPlansUtilizationDetails">>, Input, Options). %% @doc Queries for available tag keys and tag values for a specified period. %% %% You can search the tag values for an arbitrary string. get_tags(Client, Input) when is_map(Client), is_map(Input) -> get_tags(Client, Input, []). get_tags(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetTags">>, Input, Options). %% @doc Retrieves a forecast for how much Amazon Web Services predicts that %% you will use over the forecast time period that you select, based on your %% past usage. get_usage_forecast(Client, Input) when is_map(Client), is_map(Input) -> get_usage_forecast(Client, Input, []). get_usage_forecast(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetUsageForecast">>, Input, Options). %% @doc Returns the name, ARN, `NumberOfRules' and effective dates of all %% Cost Categories defined in the account. %% %% You have the option to use `EffectiveOn' to return a list of Cost %% Categories that were active on a specific date. If there is no %% `EffectiveOn' specified, you’ll see Cost Categories that are effective on %% the current date. If Cost Category is still effective, `EffectiveEnd' is %% omitted in the response. `ListCostCategoryDefinitions' supports %% pagination. The request can have a `MaxResults' range up to 100. list_cost_category_definitions(Client, Input) when is_map(Client), is_map(Input) -> list_cost_category_definitions(Client, Input, []). list_cost_category_definitions(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"ListCostCategoryDefinitions">>, Input, Options). %% @doc Modifies the feedback property of a given cost anomaly. provide_anomaly_feedback(Client, Input) when is_map(Client), is_map(Input) -> provide_anomaly_feedback(Client, Input, []). provide_anomaly_feedback(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"ProvideAnomalyFeedback">>, Input, Options). %% @doc Updates an existing cost anomaly monitor. %% %% The changes made are applied going forward, and doesn'tt change anomalies %% detected in the past. update_anomaly_monitor(Client, Input) when is_map(Client), is_map(Input) -> update_anomaly_monitor(Client, Input, []). update_anomaly_monitor(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateAnomalyMonitor">>, Input, Options). %% @doc Updates an existing cost anomaly monitor subscription. update_anomaly_subscription(Client, Input) when is_map(Client), is_map(Input) -> update_anomaly_subscription(Client, Input, []). update_anomaly_subscription(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateAnomalySubscription">>, Input, Options). %% @doc Updates an existing Cost Category. %% %% Changes made to the Cost Category rules will be used to categorize the %% current month’s expenses and future expenses. This won’t change %% categorization for the previous months. update_cost_category_definition(Client, Input) when is_map(Client), is_map(Input) -> update_cost_category_definition(Client, Input, []). update_cost_category_definition(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateCostCategoryDefinition">>, Input, Options). %%==================================================================== %% Internal functions %%==================================================================== -spec request(aws_client:aws_client(), binary(), map(), list()) -> {ok, Result, {integer(), list(), hackney:client()}} | {error, Error, {integer(), list(), hackney:client()}} | {error, term()} when Result :: map() | undefined, Error :: map(). request(Client, Action, Input, Options) -> RequestFun = fun() -> do_request(Client, Action, Input, Options) end, aws_request:request(RequestFun, Options). do_request(Client, Action, Input0, Options) -> Client1 = Client#{service => <<"ce">>, region => <<"us-east-1">>}, Host = build_host(<<"ce">>, Client1), URL = build_url(Host, Client1), Headers = [ {<<"Host">>, Host}, {<<"Content-Type">>, <<"application/x-amz-json-1.1">>}, {<<"X-Amz-Target">>, <<"AWSInsightsIndexService.", Action/binary>>} ], Input = Input0, Payload = jsx:encode(Input), SignedHeaders = aws_request:sign_request(Client1, <<"POST">>, URL, Headers, Payload), Response = hackney:request(post, URL, SignedHeaders, Payload, Options), handle_response(Response). handle_response({ok, 200, ResponseHeaders, Client}) -> case hackney:body(Client) of {ok, <<>>} -> {ok, undefined, {200, ResponseHeaders, Client}}; {ok, Body} -> Result = jsx:decode(Body), {ok, Result, {200, ResponseHeaders, Client}} end; handle_response({ok, StatusCode, ResponseHeaders, Client}) -> {ok, Body} = hackney:body(Client), Error = jsx:decode(Body), {error, Error, {StatusCode, ResponseHeaders, Client}}; handle_response({error, Reason}) -> {error, Reason}. build_host(_EndpointPrefix, #{region := <<"local">>, endpoint := Endpoint}) -> Endpoint; build_host(_EndpointPrefix, #{region := <<"local">>}) -> <<"localhost">>; build_host(EndpointPrefix, #{endpoint := Endpoint}) -> aws_util:binary_join([EndpointPrefix, Endpoint], <<".">>). build_url(Host, Client) -> Proto = maps:get(proto, Client), Port = maps:get(port, Client), aws_util:binary_join([Proto, <<"://">>, Host, <<":">>, Port, <<"/">>], <<"">>).