typescript - Serverless Offline & DynamoDB kastar Local UnknownEndpoint: Otillgänglig värd: localhost på port 8000 Tjänsten kanske inte är tillgänglig i localhost-regionen
Jag håller på och leker med Serverless och jag har ingen tur med att få serverless-offline att fungera med serverless-dynamodb-local. Jag har en mycket minimal setup, det tar 3 minuter att reproducera, jag gjorde det så här:
- Generera ett TS Serverless-projekt som -
sls create -t aws-nodejs-typescript --path folder-name - installera beroenden
npm i - Lägg till DynamoDB lokalt
npm install --save serverless-dynamodb-local - Lägg till serverless offline
npm install serverless-offline --save-dev - Installera dynamodb
sls dynamodb install
Nu uppdaterar jag serverless.ts-filen som
- Inkludera installerade tillägg i rätt ordning
plugins: [
'serverless-esbuild',
'serverless-dynamodb-local',
'serverless-offline'
],
- I
customlägg till DynamoDB-konfiguration som
custom: {
esbuild: { ... },
dynamodb: {
stages: ['dev'],
start: {
migrate: true
}
}
- Sista steget är att lägga till DynamoDB i resurser
resources: {
Resources: {
usersTable: {
Type: 'AWS::DynamoDB::Table',
Properties: {
TableName: 'firstTable',
AttributeDefinitions: [{
AttributeName: 'id',
AttributeType: 'S',
}],
KeySchema: [{
AttributeName: 'id',
KeyType: 'HASH'
}],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1
}
}
}
}
}
Nu försöker jag starta upp allt genom att köra sls offline start -s dev och det ger följande fel (exekveringen stoppar inte)
(detta fel kastas logiskt sett inte om jag tar bort migrate: true från serverless.ts)
Dynamodb Local Started, Visit: http://localhost:8000/shell
UnknownEndpoint: Inaccessible host: `localhost' at port `8000'. This service may not be available in the `localhost' region.: DynamoDB - Error -
Environment: darwin, node 17.3.1, framework 3.12.0 (local), plugin 6.2.1, SDK 4.3.2
Docs: docs.serverless.com
Support: forum.serverless.com
Bugs: github.com/serverless/serverless/issues
Error:
UnknownEndpoint: Inaccessible host: `localhost' at port `8000'. This service may not be available in the `localhost' region.
at Request.ENOTFOUND_ERROR (...node_modules/aws-sdk/lib/event_listeners.js:529:46)
at Request.callListeners (...node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (...node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (...node_modules/aws-sdk/lib/request.js:686:14)
at error (...node_modules/aws-sdk/lib/event_listeners.js:361:22)
at ClientRequest.<anonymous> (...node_modules/aws-sdk/lib/http/node.js:99:9)
at ClientRequest.emit (node:events:390:28)
at ClientRequest.emit (node:domain:475:12)
at Socket.socketErrorListener (node:_http_client:442:9)
at Socket.emit (node:events:390:28)
at Socket.emit (node:domain:475:12)
at emitErrorNT (node:internal/streams/destroy:164:8)
at emitErrorCloseNT (node:internal/streams/destroy:129:3)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Även om ett fel kastas kan jag fortfarande utföra det framgångsrikt
> aws dynamodb list-tables --endpoint-url http://localhost:8000 --region localhost
{
"TableNames": []
}
Jag ändrade ingen annan kod än den som beskrivs ovan. Jag skulle gissa att det är något riktigt grundläggande, som att jag saknar någon konfiguration eller något någonstans, men jag kan inte hitta något i dokumentationen eller andra inlägg som skulle hjälpa. Alla idéer är välkomna.
...och eftersom jag vet att någon version hade problem tidigare, här är package.json som jag kör med
"engines": {
"node": ">=14.15.0"
},
"dependencies": {
"@middy/core": "^2.5.3",
"@middy/http-json-body-parser": "^2.5.3",
"serverless-dynamodb-local": "^0.2.40"
},
"devDependencies": {
"@serverless/typescript": "^3.0.0",
"@types/aws-lambda": "^8.10.71",
"@types/node": "^14.14.25",
"esbuild": "^0.14.11",
"json-schema-to-ts": "^1.5.0",
"serverless": "^3.0.0",
"serverless-esbuild": "^1.23.3",
"serverless-offline": "^8.5.0",
"ts-node": "^10.4.0",
"tsconfig-paths": "^3.9.0",
"typescript": "^4.1.3"
},
här är hela serverless.ts om det hjälper
const serverlessConfiguration: AWS = {
service: 'aws-onboarding-api',
frameworkVersion: '3',
plugins: [
'serverless-esbuild',
'serverless-dynamodb-local',
'serverless-offline'
],
provider: {
name: 'aws',
runtime: 'nodejs14.x',
apiGateway: {
minimumCompressionSize: 1024,
shouldStartNameWithService: true,
},
environment: {
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
NODE_OPTIONS: '--enable-source-maps --stack-trace-limit=1000',
},
},
// import the function via paths
functions: { hello },
package: { individually: true },
custom: {
esbuild: {
bundle: true,
minify: false,
sourcemap: true,
exclude: ['aws-sdk'],
target: 'node14',
define: { 'require.resolve': undefined },
platform: 'node',
concurrency: 10,
},
dynamodb: {
stages: ['dev'],
start: {
migrate: true
}
}
},
resources: {
Resources: {
usersTable: {
Type: 'AWS::DynamoDB::Table',
Properties: {
TableName: 'firstTable',
AttributeDefinitions: [{
AttributeName: 'id',
AttributeType: 'S',
}],
KeySchema: [{
AttributeName: 'id',
KeyType: 'HASH'
}],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1
}
}
}
}
}
};
Svar #1
Det visade sig alltså vara ett problem med min node-version, jag körde v17.3.1. Efter att ha bytt till v16.4.0 fungerar det perfekt. 🥳
Från @EdwinWong kommentar:
I node 18 i din serverlösa custom.dynamodb.start.host ange 127.0.0.1 och det borde fungera (jag har inte testat detta)