%% WARNING: DO NOT EDIT, AUTO-GENERATED CODE! %% See https://github.com/jkakar/aws-codegen for more details. %% @doc Amazon GameLift Service %% %% Welcome to the Amazon GameLift API Reference. Amazon GameLift is a %% managed Amazon Web Services (AWS) service for developers who need a %% scalable, server-based solution for multiplayer games. Amazon GameLift %% provides setup and deployment of game servers, and handles infrastructure %% scaling and session management. For more information about the GameLift %% service, including a feature overview, getting started guide, and %% tutorial, see the accompanying Amazon %% GameLift Developer Guide. %% %% This reference describes the low-level service API for GameLift. You can %% call this API directly or use the AWS SDK for your preferred %% language. The AWS SDK includes a set of high-level GameLift actions %% multiplayer game sessions. Alternatively, you can use the AWS command-line interface (CLI) %% tool, which includes commands for GameLift. For administrative actions, %% you can use the Amazon GameLift console. %% %% Setting Up Your Game Servers %% %% Use these administrative actions to configure GameLift to host your game %% servers. When configuring GameLift, you'll need to (1) configure a build %% for your game and provide build files, and (2) set up one or more fleets %% to host game sessions. %% %% %% Managing Game and Player Sessions Through GameLift %% %% Call these actions from your game clients and/or services to create and %% manage multiplayer game sessions. %% %% -module(aws_gamelift). -export([create_alias/2, create_alias/3, create_build/2, create_build/3, create_fleet/2, create_fleet/3, create_game_session/2, create_game_session/3, create_player_session/2, create_player_session/3, create_player_sessions/2, create_player_sessions/3, delete_alias/2, delete_alias/3, delete_build/2, delete_build/3, delete_fleet/2, delete_fleet/3, describe_alias/2, describe_alias/3, describe_build/2, describe_build/3, describe_e_c2_instance_limits/2, describe_e_c2_instance_limits/3, describe_fleet_attributes/2, describe_fleet_attributes/3, describe_fleet_capacity/2, describe_fleet_capacity/3, describe_fleet_events/2, describe_fleet_events/3, describe_fleet_port_settings/2, describe_fleet_port_settings/3, describe_fleet_utilization/2, describe_fleet_utilization/3, describe_game_sessions/2, describe_game_sessions/3, describe_player_sessions/2, describe_player_sessions/3, get_game_session_log_url/2, get_game_session_log_url/3, list_aliases/2, list_aliases/3, list_builds/2, list_builds/3, list_fleets/2, list_fleets/3, request_upload_credentials/2, request_upload_credentials/3, resolve_alias/2, resolve_alias/3, update_alias/2, update_alias/3, update_build/2, update_build/3, update_fleet_attributes/2, update_fleet_attributes/3, update_fleet_capacity/2, update_fleet_capacity/3, update_fleet_port_settings/2, update_fleet_port_settings/3, update_game_session/2, update_game_session/3]). -include_lib("hackney/include/hackney_lib.hrl"). %%==================================================================== %% API %%==================================================================== %% @doc Creates an alias for a fleet. You can use an alias to anonymize your %% fleet by referencing an alias instead of a specific fleet when you create %% game sessions. Amazon GameLift supports two types of routing strategies %% for aliases: simple and terminal. Use a simple alias to point to an active %% fleet. Use a terminal alias to display a message to incoming traffic %% instead of routing players to an active fleet. This option is useful when %% a game server is no longer supported but you want to provide better %% messaging than a standard 404 error. %% %% To create a fleet alias, specify an alias name, routing strategy, and %% optional description. If successful, a new alias record is returned, %% including an alias ID, which you can reference when creating a game %% session. To reassign the alias to another fleet ID, call %% UpdateAlias. create_alias(Client, Input) when is_map(Client), is_map(Input) -> create_alias(Client, Input, []). create_alias(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreateAlias">>, Input, Options). %% @doc Initializes a new build record and generates information required to %% upload a game build to Amazon GameLift. Once the build record has been %% created and is in an INITIALIZED state, you can upload your game build. %% %% To create a build, use the CLI command %% upload-build, which creates a new build record and uploads %% the build files in one step. (See the Amazon %% GameLift Developer Guide for more details on the CLI and the upload %% process.) Call the CreateBuild action only if you have your %% own Amazon Simple Storage Service (Amazon S3) client and need to manually %% upload your build files. %% %% To create a new build, optionally specify a build name and %% version. This metadata is stored with other properties in the build record %% and is displayed in the GameLift console (but not visible to players). If %% successful, this action returns the newly created build record along with %% an Amazon S3 storage location and AWS account credentials. Use the %% location and credentials to upload your game build. create_build(Client, Input) when is_map(Client), is_map(Input) -> create_build(Client, Input, []). create_build(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreateBuild">>, Input, Options). %% @doc Creates a new fleet to host game servers. A fleet consists of a set %% of Amazon Elastic Compute Cloud (Amazon EC2) instances of a certain type, %% which defines the CPU, memory, storage, and networking capacity of each %% host in the fleet. See Amazon EC2 Instance %% Types for more information. Each instance in the fleet hosts a game %% server created from the specified game build. Once a fleet is in an ACTIVE %% state, it can begin hosting game sessions. %% %% To create a new fleet, provide a name and the EC2 instance type for the %% new fleet, and specify the build and server launch path. Builds must be in %% a READY state before they can be used to build fleets. When configuring %% the new fleet, you can optionally (1) provide a set of launch parameters %% to be passed to a game server when activated; (2) limit incoming traffic %% to a specified range of IP addresses and port numbers; and (3) configure %% Amazon GameLift to store game session logs by specifying the path to the %% logs stored in your game server files. If the call is successful, Amazon %% GameLift performs the following tasks: %% %% Once a fleet is created, use the %% following actions to change certain fleet properties (server launch %% parameters and log paths cannot be changed): %% %% create_fleet(Client, Input) when is_map(Client), is_map(Input) -> create_fleet(Client, Input, []). create_fleet(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreateFleet">>, Input, Options). %% @doc Creates a multiplayer game session for players. This action creates a %% game session record and assigns the new session to an instance in the %% specified fleet, which activates the server initialization process in your %% game server. A fleet must be in an ACTIVE state before a game session can %% be created for it. %% %% To create a game session, specify either a fleet ID or an alias ID and %% indicate the maximum number of players the game session allows. You can %% also provide a name and a set of properties for your game (optional). If %% successful, a GameSession object is returned containing session %% properties, including an IP address. By default, newly created game %% sessions are set to accept adding any new players to the game session. Use %% UpdateGameSession to change the creation policy. create_game_session(Client, Input) when is_map(Client), is_map(Input) -> create_game_session(Client, Input, []). create_game_session(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreateGameSession">>, Input, Options). %% @doc Adds a player to a game session and creates a player session record. %% A game session must be in an ACTIVE state, have a creation policy of %% ALLOW_ALL, and have an open player slot before players can be added to the %% session. %% %% To create a player session, specify a game session ID and player ID. If %% successful, the player is added to the game session and a new %% PlayerSession object is returned. create_player_session(Client, Input) when is_map(Client), is_map(Input) -> create_player_session(Client, Input, []). create_player_session(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreatePlayerSession">>, Input, Options). %% @doc Adds a group of players to a game session. Similar to %% CreatePlayerSession, this action allows you to add multiple players %% in a single call, which is useful for games that provide party and/or %% matchmaking features. A game session must be in an ACTIVE state, have a %% creation policy of ALLOW_ALL, and have an open player slot before players %% can be added to the session. %% %% To create player sessions, specify a game session ID and a list of player %% IDs. If successful, the players are added to the game session and a set of %% new PlayerSession objects is returned. create_player_sessions(Client, Input) when is_map(Client), is_map(Input) -> create_player_sessions(Client, Input, []). create_player_sessions(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"CreatePlayerSessions">>, Input, Options). %% @doc Deletes an alias. This action removes all record of the alias; game %% clients attempting to access a game server using the deleted alias receive %% an error. To delete an alias, specify the alias ID to be deleted. delete_alias(Client, Input) when is_map(Client), is_map(Input) -> delete_alias(Client, Input, []). delete_alias(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DeleteAlias">>, Input, Options). %% @doc Deletes a build. This action permanently deletes the build record and %% any uploaded build files. %% %% To delete a build, specify its ID. Deleting a build does not affect the %% status of any active fleets, but you can no longer create new fleets for %% the deleted build. delete_build(Client, Input) when is_map(Client), is_map(Input) -> delete_build(Client, Input, []). delete_build(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DeleteBuild">>, Input, Options). %% @doc Deletes everything related to a fleet. Before deleting a fleet, you %% must set the fleet's desired capacity to zero. See %% UpdateFleetCapacity. %% %% This action removes the fleet's resources and the fleet record. Once a %% fleet is deleted, you can no longer use that fleet. delete_fleet(Client, Input) when is_map(Client), is_map(Input) -> delete_fleet(Client, Input, []). delete_fleet(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DeleteFleet">>, Input, Options). %% @doc Retrieves properties for a specified alias. To get the alias, specify %% an alias ID. If successful, an Alias object is returned. describe_alias(Client, Input) when is_map(Client), is_map(Input) -> describe_alias(Client, Input, []). describe_alias(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeAlias">>, Input, Options). %% @doc Retrieves properties for a build. To get a build record, specify a %% build ID. If successful, an object containing the build properties is %% returned. describe_build(Client, Input) when is_map(Client), is_map(Input) -> describe_build(Client, Input, []). describe_build(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeBuild">>, Input, Options). %% @doc Retrieves the maximum number of instances allowed, per AWS account, %% for each specified EC2 instance type. The current usage level for the AWS %% account is also retrieved. describe_e_c2_instance_limits(Client, Input) when is_map(Client), is_map(Input) -> describe_e_c2_instance_limits(Client, Input, []). describe_e_c2_instance_limits(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeEC2InstanceLimits">>, Input, Options). %% @doc Retrieves fleet properties, including metadata, status, and %% configuration, for one or more fleets. You can request attributes for all %% fleets, or specify a list of one or more fleet IDs. When requesting all %% fleets, use the pagination parameters to retrieve results as a set of %% sequential pages. If successful, a FleetAttributes object is %% returned for each requested fleet ID. When specifying a list of fleet IDs, %% attribute objects are returned only for fleets that currently exist. %% %% Some API actions may limit the number of fleet IDs allowed in one %% request. If a request exceeds this limit, the request fails and the error %% message includes the maximum allowed. %% %% describe_fleet_attributes(Client, Input) when is_map(Client), is_map(Input) -> describe_fleet_attributes(Client, Input, []). describe_fleet_attributes(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeFleetAttributes">>, Input, Options). %% @doc Retrieves the current status of fleet capacity for one or more %% fleets. This information includes the number of instances that have been %% requested for the fleet and the number currently active. You can request %% capacity for all fleets, or specify a list of one or more fleet IDs. When %% requesting all fleets, use the pagination parameters to retrieve results %% as a set of sequential pages. If successful, a FleetCapacity object %% is returned for each requested fleet ID. When specifying a list of fleet %% IDs, attribute objects are returned only for fleets that currently exist. %% %% Some API actions may limit the number of fleet IDs allowed in one %% request. If a request exceeds this limit, the request fails and the error %% message includes the maximum allowed. %% %% describe_fleet_capacity(Client, Input) when is_map(Client), is_map(Input) -> describe_fleet_capacity(Client, Input, []). describe_fleet_capacity(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeFleetCapacity">>, Input, Options). %% @doc Retrieves entries from the fleet event log. You can specify a time %% range to limit the result set. Use the pagination parameters to retrieve %% results as a set of sequential pages. If successful, a collection of event %% log entries matching the request are returned. describe_fleet_events(Client, Input) when is_map(Client), is_map(Input) -> describe_fleet_events(Client, Input, []). describe_fleet_events(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeFleetEvents">>, Input, Options). %% @doc Retrieves the port settings for a fleet. Port settings are used to %% limit incoming traffic access to game servers in the fleet. To get a %% fleet's port settings, specify a fleet ID. If successful, an %% IpPermission object is returned for the requested fleet ID. If the %% requested fleet has been deleted, the result set will be empty. describe_fleet_port_settings(Client, Input) when is_map(Client), is_map(Input) -> describe_fleet_port_settings(Client, Input, []). describe_fleet_port_settings(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeFleetPortSettings">>, Input, Options). %% @doc Retrieves utilization statistics for one or more fleets. You can %% request utilization data for all fleets, or specify a list of one or more %% fleet IDs. When requesting all fleets, use the pagination parameters to %% retrieve results as a set of sequential pages. If successful, a %% FleetUtilization object is returned for each requested fleet ID. %% When specifying a list of fleet IDs, utilization objects are returned only %% for fleets that currently exist. %% %% Some API actions may limit the number of fleet IDs allowed in one %% request. If a request exceeds this limit, the request fails and the error %% message includes the maximum allowed. %% %% describe_fleet_utilization(Client, Input) when is_map(Client), is_map(Input) -> describe_fleet_utilization(Client, Input, []). describe_fleet_utilization(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeFleetUtilization">>, Input, Options). %% @doc Retrieves properties for one or more game sessions. This action can %% be used in several ways: (1) provide a GameSessionId parameter to %% request properties for a specific game session; (2) provide a %% FleetId or AliasId parameter to request properties for all %% game sessions running on a fleet. %% %% To get game session record(s), specify only one of the following: game %% session ID, fleet ID, or alias ID. You can filter this request by game %% session status. Use the pagination parameters to retrieve results as a set %% of sequential pages. If successful, a GameSession object is %% returned for each session matching the request. describe_game_sessions(Client, Input) when is_map(Client), is_map(Input) -> describe_game_sessions(Client, Input, []). describe_game_sessions(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeGameSessions">>, Input, Options). %% @doc Retrieves properties for one or more player sessions. This action can %% be used in several ways: (1) provide a PlayerSessionId parameter to %% request properties for a specific player session; (2) provide a %% GameSessionId parameter to request properties for all player %% sessions in the specified game session; (3) provide a PlayerId %% parameter to request properties for all player sessions of a specified %% player. %% %% To get game session record(s), specify only one of the following: a player %% session ID, a game session ID, or a player ID. You can filter this request %% by player session status. Use the pagination parameters to retrieve %% results as a set of sequential pages. If successful, a %% PlayerSession object is returned for each session matching the %% request. describe_player_sessions(Client, Input) when is_map(Client), is_map(Input) -> describe_player_sessions(Client, Input, []). describe_player_sessions(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribePlayerSessions">>, Input, Options). %% @doc Retrieves the location of stored game session logs for a specified %% game session. When a game session is terminated, Amazon GameLift %% automatically stores the logs in Amazon S3. Use this URL to download the %% logs. %% %% See the AWS %% Service Limits page for maximum log file sizes. Log files that exceed %% this limit are not saved. %% %% get_game_session_log_url(Client, Input) when is_map(Client), is_map(Input) -> get_game_session_log_url(Client, Input, []). get_game_session_log_url(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"GetGameSessionLogUrl">>, Input, Options). %% @doc Retrieves a collection of alias records for this AWS account. You can %% filter the result set by alias name and/or routing strategy type. Use the %% pagination parameters to retrieve results in sequential pages. %% %% Aliases are not listed in any particular order. %% %% list_aliases(Client, Input) when is_map(Client), is_map(Input) -> list_aliases(Client, Input, []). list_aliases(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"ListAliases">>, Input, Options). %% @doc Retrieves build records for all builds associated with an AWS %% account. You can filter the result set by build status. Use the pagination %% parameters to retrieve results in a set of sequential pages. %% %% Build records are not listed in any particular order. %% %% list_builds(Client, Input) when is_map(Client), is_map(Input) -> list_builds(Client, Input, []). list_builds(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"ListBuilds">>, Input, Options). %% @doc Retrieves a collection of fleet records for this AWS account. You can %% filter the result set by build ID. Use the pagination parameters to %% retrieve results in sequential pages. %% %% Fleet records are not listed in any particular order. %% %% list_fleets(Client, Input) when is_map(Client), is_map(Input) -> list_fleets(Client, Input, []). list_fleets(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"ListFleets">>, Input, Options). %% @doc Retrieves a fresh set of upload credentials and the assigned Amazon %% S3 storage location for a specific build. Valid credentials are required %% to upload your game build files to Amazon S3. %% %% Call this action only if you need credentials for a build %% created with CreateBuild. This is a rare situation; in most cases, %% builds are created using the CLI command upload-build, which %% creates a build record and also uploads build files. %% %% Upload credentials are returned when you create the build, %% but they have a limited lifespan. You can get fresh credentials and use %% them to re-upload game files until the state of that build changes to %% READY. Once this happens, you must create a brand new build. request_upload_credentials(Client, Input) when is_map(Client), is_map(Input) -> request_upload_credentials(Client, Input, []). request_upload_credentials(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"RequestUploadCredentials">>, Input, Options). %% @doc Retrieves the fleet ID that a specified alias is currently pointing %% to. resolve_alias(Client, Input) when is_map(Client), is_map(Input) -> resolve_alias(Client, Input, []). resolve_alias(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"ResolveAlias">>, Input, Options). %% @doc Updates properties for an alias. To update properties, specify the %% alias ID to be updated and provide the information to be changed. To %% reassign an alias to another fleet, provide an updated routing strategy. %% If successful, the updated alias record is returned. update_alias(Client, Input) when is_map(Client), is_map(Input) -> update_alias(Client, Input, []). update_alias(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateAlias">>, Input, Options). %% @doc Updates metadata in a build record, including the build name and %% version. To update the metadata, specify the build ID to update and %% provide the new values. If successful, a build object containing the %% updated metadata is returned. update_build(Client, Input) when is_map(Client), is_map(Input) -> update_build(Client, Input, []). update_build(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateBuild">>, Input, Options). %% @doc Updates fleet properties, including name and description, for a %% fleet. To update metadata, specify the fleet ID and the property values %% you want to change. If successful, the fleet ID for the updated fleet is %% returned. update_fleet_attributes(Client, Input) when is_map(Client), is_map(Input) -> update_fleet_attributes(Client, Input, []). update_fleet_attributes(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateFleetAttributes">>, Input, Options). %% @doc Updates capacity settings for a fleet. Use this action to specify the %% number of EC2 instances (hosts) you want this fleet to contain. Before %% calling this action, you may want to call DescribeEC2InstanceLimits %% to get the maximum capacity based on the fleet's EC2 instance type. %% %% To update fleet capacity, specify the fleet ID and the desired number of %% instances. If successful, Amazon GameLift starts or terminates instances %% so that the fleet's active instance count matches the desired instance %% count. You can view a fleet's current capacity information by calling %% DescribeFleetCapacity. If the desired instance count is higher than %% the instance type's limit, the "Limit Exceeded" exception will occur. update_fleet_capacity(Client, Input) when is_map(Client), is_map(Input) -> update_fleet_capacity(Client, Input, []). update_fleet_capacity(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateFleetCapacity">>, Input, Options). %% @doc Updates port settings for a fleet. To update settings, specify the %% fleet ID to be updated and list the permissions you want to update. List %% the permissions you want to add in InboundPermissionAuthorizations, %% and permissions you want to remove in InboundPermissionRevocations. %% Permissions to be removed must match existing fleet permissions. If %% successful, the fleet ID for the updated fleet is returned. update_fleet_port_settings(Client, Input) when is_map(Client), is_map(Input) -> update_fleet_port_settings(Client, Input, []). update_fleet_port_settings(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateFleetPortSettings">>, Input, Options). %% @doc Updates game session properties. This includes the session name, %% maximum player count and the player session creation policy, which either %% allows or denies new players from joining the session. To update a game %% session, specify the game session ID and the values you want to change. If %% successful, an updated GameSession object is returned. update_game_session(Client, Input) when is_map(Client), is_map(Input) -> update_game_session(Client, Input, []). update_game_session(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"UpdateGameSession">>, 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 :: {binary(), binary()}. request(Client, Action, Input, Options) -> Client1 = Client#{service => <<"gamelift">>}, Host = get_host(<<"gamelift">>, Client1), URL = get_url(Host, Client1), Headers = [{<<"Host">>, Host}, {<<"Content-Type">>, <<"application/x-amz-json-1.1">>}, {<<"X-Amz-Target">>, << <<"GameLift.">>/binary, Action/binary>>}], Payload = jsx:encode(Input), Headers1 = aws_request:sign_request(Client1, <<"POST">>, URL, Headers, Payload), Response = hackney:request(post, URL, Headers1, 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, [return_maps]), {ok, Result, {200, ResponseHeaders, Client}} end; handle_response({ok, StatusCode, ResponseHeaders, Client}) -> {ok, Body} = hackney:body(Client), Error = jsx:decode(Body, [return_maps]), Exception = maps:get(<<"__type">>, Error, undefined), Reason = maps:get(<<"message">>, Error, undefined), {error, {Exception, Reason}, {StatusCode, ResponseHeaders, Client}}; handle_response({error, Reason}) -> {error, Reason}. get_host(_EndpointPrefix, #{region := <<"local">>}) -> <<"localhost">>; get_host(EndpointPrefix, #{region := Region, endpoint := Endpoint}) -> aws_util:binary_join([EndpointPrefix, <<".">>, Region, <<".">>, Endpoint], <<"">>). get_url(Host, Client) -> Proto = maps:get(proto, Client), Port = maps:get(port, Client), aws_util:binary_join([Proto, <<"://">>, Host, <<":">>, Port, <<"/">>], <<"">>).