diff --git a/README.md b/README.md index 6eec94769dc08..cb1b2a453dd1e 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,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) + `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 7e4579669b4a8..0c8558266615c 100644 --- a/localstack/config.py +++ b/localstack/config.py @@ -21,6 +21,9 @@ # expose services on a specific host externally HOSTNAME_EXTERNAL = os.environ.get('HOSTNAME_EXTERNAL', '').strip() or LOCALHOST +# expose SQS on a specific port externally +SQS_PORT_EXTERNAL = int(os.environ.get('SQS_PORT_EXTERNAL') or 0) + # name of the host under which the LocalStack services are available LOCALSTACK_HOSTNAME = os.environ.get('LOCALSTACK_HOSTNAME', '').strip() or HOSTNAME @@ -74,6 +77,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(): diff --git a/localstack/services/sqs/sqs_listener.py b/localstack/services/sqs/sqs_listener.py index 2df0a1db86623..348d9cb0b1ffa 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, md5 from localstack.utils.analytics import event_publisher from localstack.services.awslambda import lambda_api @@ -91,7 +91,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 or 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