241 lines
6.6 KiB
ReStructuredText
241 lines
6.6 KiB
ReStructuredText
.. _server_mode:
|
|
|
|
.. role:: bash(code)
|
|
:language: bash
|
|
|
|
.. role:: raw-html(raw)
|
|
:format: html
|
|
|
|
================================
|
|
Non-Python SDK's / Server Mode
|
|
================================
|
|
|
|
Moto has a stand-alone server mode. This allows you to use Moto with any of the official AWS SDK's.
|
|
|
|
Installation
|
|
-------------
|
|
|
|
Install the required dependencies using:
|
|
|
|
.. code:: bash
|
|
|
|
pip install moto[server]
|
|
|
|
|
|
You can then start it like this:
|
|
|
|
.. code:: bash
|
|
|
|
$ moto_server
|
|
|
|
You can also pass the port:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ moto_server -p3000
|
|
* Running on http://127.0.0.1:3000/
|
|
|
|
If you want to be able to use the server externally you can pass an IP
|
|
address to bind to as a hostname or allow any of your external
|
|
interfaces with 0.0.0.0:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ moto_server -H 0.0.0.0
|
|
* Running on http://0.0.0.0:5000/
|
|
|
|
Please be aware this might allow other network users to access your
|
|
server.
|
|
|
|
Start within Python
|
|
--------------------
|
|
It is possible to start this server from within Python, in a separate thread. :raw-html:`<br />`
|
|
By default, this server will start on port 5000, but this is configurable.
|
|
|
|
.. code-block:: python
|
|
|
|
from moto.server import ThreadedMotoServer
|
|
server = ThreadedMotoServer()
|
|
server.start()
|
|
# run tests
|
|
client = boto3.client("service", endpoint_url="http://localhost:5000")
|
|
...
|
|
server.stop()
|
|
|
|
Note that the ThreadedMotoServer and the decorators act on the same state, making it possible to combine the two approaches. :raw-html:`<br />`
|
|
See the following example:
|
|
|
|
.. code-block:: python
|
|
|
|
class TestThreadedMotoServer(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
self.server = ThreadedMotoServer()
|
|
self.server.start()
|
|
|
|
def tearDown(self):
|
|
self.server.stop()
|
|
|
|
@mock_s3
|
|
def test_load_data_using_decorators(self):
|
|
server_client = boto3.client("s3", endpoint_url="http://127.0.0.1:5000")
|
|
server_client.create_bucket(Bucket="test")
|
|
|
|
in_mem_client = boto3.client("s3")
|
|
buckets = in_mem_client.list_buckets()["Buckets"]
|
|
[b["Name"] for b in buckets].should.equal(["test"])
|
|
|
|
This example shows it is possible to create state using the TreadedMotoServer, and access that state using the usual decorators. :raw-html:`<br />`
|
|
0Note that the decorators will destroy any resources on start, so make sure to not accidentally destroy any resources created by the ThreadedMotoServer that should be kept.
|
|
|
|
.. note:: The ThreadedMotoServer is considered in beta for now, and the exact interface and behaviour may still change. :raw-html:`<br />` Please let us know if you'd like to see any changes.
|
|
|
|
Run using Docker
|
|
----------------------
|
|
You could also use the official Docker image from https://hub.docker.com/r/motoserver/moto/tags:
|
|
|
|
.. code-block:: bash
|
|
|
|
docker run motoserver/moto:latest
|
|
|
|
Example Usage
|
|
--------------
|
|
|
|
To use Moto in your tests, pass the `endpoint_url`-parameter to the SDK of your choice.
|
|
|
|
In Python:
|
|
|
|
.. code-block:: python
|
|
|
|
boto3.resource(
|
|
service_name='s3',
|
|
region_name='us-west-1',
|
|
endpoint_url='http://localhost:5000'
|
|
)
|
|
|
|
In Java:
|
|
|
|
.. code-block:: java
|
|
|
|
AmazonSQS sqs = new AmazonSQSClient();
|
|
sqs.setRegion(Region.getRegion(Regions.US_WEST_2));
|
|
sqs.setEndpoint("http://localhost:5000");
|
|
|
|
In Scala:
|
|
|
|
.. code-block:: scala
|
|
|
|
val region = Region.getRegion(Regions.US_WEST_2).getName
|
|
val serviceEndpoint = "http://localhost:5000"
|
|
val config = new AwsClientBuilder.EndpointConfiguration(serviceEndpoint, region)
|
|
val amazonSqs = AmazonSQSClientBuilder.standard().withEndpointConfiguration(config).build
|
|
|
|
In Terraform:
|
|
|
|
.. code-block::
|
|
|
|
provider "aws" {
|
|
region = "us-east-1"
|
|
skip_credentials_validation = true
|
|
skip_metadata_api_check = true
|
|
skip_requesting_account_id = true
|
|
s3_force_path_style = true
|
|
|
|
endpoints {
|
|
lambda = "http://localhost:5000"
|
|
}
|
|
}
|
|
|
|
See the `Terraform Docs`_ for more information.
|
|
|
|
|
|
Other languages:
|
|
|
|
* `Java`_
|
|
* `Ruby`_
|
|
* `Javascript`_
|
|
|
|
|
|
Use ServerMode using the decorators
|
|
-------------------------------------
|
|
|
|
It is possible to call the MotoServer for tests that were written using decorators.
|
|
The following environment variables can be set to achieve this:
|
|
|
|
.. code-block:: bash
|
|
|
|
TEST_SERVER_MODE=true
|
|
|
|
Whenever a mock-decorator starts, Moto will:
|
|
|
|
#. Send a reset-request to :bash:`http://localhost:5000`, removing all state that was kept
|
|
#. Add the :bash:`endpoint_url` parameter to boto3, so that all requests will be made to :bash:`http://localhost:5000`.
|
|
|
|
Optionally, the `http://localhost:5000` endpoint can be overridden by:
|
|
|
|
.. code-block:: bash
|
|
|
|
TEST_SERVER_MODE_ENDPOINT=http://moto-server:5000
|
|
|
|
This can be used for example in case of docker-compose configuration that runs Moto server
|
|
in a separate service container.
|
|
|
|
Calling the reset-API ensures the same behaviour as normal decorators, where the complete state is removed.
|
|
It is possible to keep the state in between tests, using this environment variable:
|
|
|
|
.. code-block:: bash
|
|
|
|
MOTO_CALL_RESET_API=false
|
|
|
|
|
|
Dashboard
|
|
---------
|
|
|
|
Moto comes with a dashboard to view the current state of the system::
|
|
|
|
http://localhost:5000/moto-api/
|
|
|
|
|
|
Reset API
|
|
---------
|
|
|
|
An internal API endpoint is provided to reset the state of all of the backends. This will remove all S3 buckets, EC2 servers, etc.::
|
|
|
|
requests.post("http://motoapi.amazonaws.com/moto-api/reset")
|
|
|
|
Install with Homebrew
|
|
---------------------
|
|
|
|
Moto is also available to install using `Homebrew`_, which makes it much easier
|
|
to manage if you're not using Python as your primary development language.
|
|
|
|
Once Homebrew is installed, you can install Moto by running:
|
|
|
|
.. code-block:: bash
|
|
|
|
brew install moto
|
|
|
|
To make the Moto server start up automatically when you log into your computer,
|
|
you can run:
|
|
|
|
.. code-block:: bash
|
|
|
|
brew services start moto
|
|
|
|
Caveats
|
|
-------
|
|
The standalone server has some caveats with some services. The following services
|
|
require that you update your hosts file for your code to work properly:
|
|
|
|
#. `s3-control`
|
|
|
|
For the above services, this is required because the hostname is in the form of `AWS_ACCOUNT_ID.localhost`.
|
|
As a result, you need to add that entry to your host file for your tests to function properly.
|
|
|
|
|
|
.. _Java: https://github.com/spulec/moto/blob/master/other_langs/sqsSample.java
|
|
.. _Ruby: https://github.com/spulec/moto/blob/master/other_langs/test.rb
|
|
.. _Javascript: https://github.com/spulec/moto/blob/master/other_langs/test.js
|
|
.. _Homebrew: https://brew.sh
|
|
.. _Terraform Docs: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/custom-service-endpoints
|