Search code examples
node.jsamazon-web-servicesmoto

How to connect to moto standalone server?


I just installed moto and tried to connect to the standalone server with the following node.js code:

const AWS = require('aws-sdk')
const ep = new AWS.Endpoint('http://127.0.0.1:5000')
const route53 = new AWS.Route53({endpoint: ep})

const params = {}
console.log(route53.listHostedZones(params))

The code sets AWS service's endpoint, which points to the standalone server of moto. And then sends listHostedZones request to the endpoint. The output of this program is

Request {
domain: null,
service:
Service {
    config:
    Config {
        credentials: [Object],
        credentialProvider: [Object],
        region: undefined,
        logger: null,
        apiVersions: {},
        apiVersion: null,
        endpoint: [Object],
        httpOptions: [Object],
        maxRetries: undefined,
        maxRedirects: 10,
        paramValidation: true,
        sslEnabled: true,
        s3ForcePathStyle: false,
        s3BucketEndpoint: false,
        s3DisableBodySigning: true,
        computeChecksums: true,
        convertResponseTypes: true,
        correctClockSkew: false,
        customUserAgent: null,
        dynamoDbCrc32: true,
        systemClockOffset: 0,
        signatureVersion: null,
        signatureCache: true,
        retryDelayOptions: {},
        useAccelerateEndpoint: false },
    endpoint:
    Endpoint {
        protocol: 'http:',
        host: '127.0.0.1:5000',
        port: 5000,
        hostname: '127.0.0.1',
        pathname: '/',
        path: '/',
        href: 'http://127.0.0.1:5000/',
        constructor: [Object] },
    _clientId: 1 },
operation: 'listHostedZones',
params: {},
httpRequest:
HttpRequest {
    method: 'POST',
    path: '/',
    headers: { 'User-Agent': 'aws-sdk-nodejs/2.166.0 darwin/v6.2.2' },
    body: '',
    endpoint:
    Endpoint {
        protocol: 'http:',
        host: '127.0.0.1:5000',
        port: 5000,
        hostname: '127.0.0.1',
        pathname: '/',
        path: '/',
        href: 'http://127.0.0.1:5000/',
        constructor: [Object] },
    region: undefined,
    _userAgent: 'aws-sdk-nodejs/2.166.0 darwin/v6.2.2' },
startTime: 2017-12-18T13:27:48.148Z,
response:
Response {
    request: [Circular],
    data: null,
    error: null,
    retryCount: 0,
    redirectCount: 0,
    httpResponse:
    HttpResponse {
        statusCode: undefined,
        headers: {},
        body: undefined,
        streaming: false,
        stream: null },
    maxRetries: 3,
    maxRedirects: 10 },
_asm:
AcceptorStateMachine {
    currentState: 'validate',
    states:
    { validate: [Object],
        build: [Object],
        afterBuild: [Object],
        sign: [Object],
        retry: [Object],
        afterRetry: [Object],
        send: [Object],
        validateResponse: [Object],
        extractError: [Object],
        extractData: [Object],
        restart: [Object],
        success: [Object],
        error: [Object],
        complete: [Object] } },
_haltHandlersOnError: false,
_events:
{ validate:
    [ [Object],
        [Function: VALIDATE_REGION],
        [Function: BUILD_IDEMPOTENCY_TOKENS],
        [Function: VALIDATE_PARAMETERS] ],
    afterBuild:
    [ [Object],
        [Function: SET_CONTENT_LENGTH],
        [Function: SET_HTTP_HOST] ],
    restart: [ [Function: RESTART] ],
    sign: [ [Object] ],
    validateResponse: [ [Function: VALIDATE_RESPONSE] ],
    send: [ [Object] ],
    httpHeaders: [ [Function: HTTP_HEADERS] ],
    httpData: [ [Function: HTTP_DATA] ],
    httpDone: [ [Function: HTTP_DONE] ],
    retry:
    [ [Function: FINALIZE_ERROR],
        [Function: INVALIDATE_CREDENTIALS],
        [Function: EXPIRED_SIGNATURE],
        [Function: CLOCK_SKEWED],
        [Function: REDIRECT],
        [Function: RETRY_CHECK] ],
    afterRetry: [ [Object] ],
    build: [ [Function: buildRequest], [Function: sanitizeUrl] ],
    extractData: [ [Function: extractData], [Function: extractRequestId] ],
    extractError: [ [Function: extractError], [Function: extractRequestId] ],
    httpError: [ [Function: ENOTFOUND_ERROR] ] },
emit: [Function: emit] }

As you can see in the above output, there's an ENOTFOUND_ERROR error in it. And I couldn't find any new connection in the console output of moto.

The way I start moto is moto_server route53:

> moto_server route53
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

What's wrong with my configurations? I think there's something wrong with my node.js code. Do I misinterpret the meaning of endpoint?


Solution

  • const AWS = require('aws-sdk')
    const ep = new AWS.Endpoint('http://127.0.0.1:5000')
    const initParam = {
      endpoint: ep,
      region: 'ap-northeast-1'
    }
    const route53 = new AWS.Route53(initParam)
    
    let params = {
      CallerReference: 'unique_string_affh38h98hasd8f76a',
      Name: 'www.example.com'
    }
    route53.createHostedZone(params, (err, data) => {
      if (err) {
        console.error(`createHostedZone err: ${err}`)
      } else {
        console.log(`createHostedZone data: ${JSON.stringify(data)}`)
      }
    })
    

    I forgot to set region parameter. And the way I view the output of listHostedZones() was wrong. After correcting them, the code works correctly.