diff --git a/README.md b/README.md index 8786fd3aa8559..0cccb6ffdcc04 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,8 @@ You can pass the following environment variables to LocalStack: started in different containers using docker-compose. * `HOSTNAME_EXTERNAL`: Name of the host to expose the services externally (defaults to `localhost`). This host is used, e.g., when returning queue URLs from the SQS service to the client. +* `_PORT_EXTERNAL`: Number of the port to expose a specific service externally (defaults to service ports above) + This SQS_PORT_EXTERNAL, for example, is used when returning queue URLs from the SQS service to the client. * `USE_SSL`: Whether to use `https://...` URLs with SSL encryption (defaults to `false`). * `KINESIS_ERROR_PROBABILITY`: Decimal value between 0.0 (default) and 1.0 to randomly inject `ProvisionedThroughputExceededException` errors into Kinesis API responses. diff --git a/localstack/config.py b/localstack/config.py index 8b5f769a92967..f0222acdba3a4 100644 --- a/localstack/config.py +++ b/localstack/config.py @@ -70,6 +70,9 @@ backend_override_var = '%s_BACKEND' % key.upper().replace('-', '_') if os.environ.get(backend_override_var): CONFIG_ENV_VARS.append(backend_override_var) + port_external_override_var = '%s_PORT_EXTERNAL' % key.upper().replace('-', '_') + if os.environ.get(port_external_override_var): + CONFIG_ENV_VARS.append(port_external_override_var) def in_docker(): """ Returns: True if running in a docker container, else False """ diff --git a/localstack/services/sqs/sqs_listener.py b/localstack/services/sqs/sqs_listener.py index 3207071ca6cf7..3f596035d3e13 100644 --- a/localstack/services/sqs/sqs_listener.py +++ b/localstack/services/sqs/sqs_listener.py @@ -5,7 +5,7 @@ from six.moves.urllib.parse import urlencode from requests.models import Request, Response from localstack import config -from localstack.config import HOSTNAME_EXTERNAL +from localstack.config import HOSTNAME_EXTERNAL, SQS_PORT_EXTERNAL from localstack.utils.common import to_str from localstack.utils.analytics import event_publisher from localstack.services.generic_proxy import ProxyListener @@ -60,7 +60,7 @@ def return_response(self, method, path, data, headers, response, request_handler # return https://... if we're supposed to use SSL content_str = re.sub(r'\s*http://', r'https://', content_str) # expose external hostname:port - external_port = get_external_port(headers, request_handler) + external_port = SQS_PORT_EXTERNAL if SQS_PORT_EXTERNAL else get_external_port(headers, request_handler) content_str = re.sub(r'\s*([a-z]+)://[^<]*:([0-9]+)/([^<]*)\s*', r'\1://%s:%s/\3' % (HOSTNAME_EXTERNAL, external_port), content_str) new_response._content = content_str