I am trying to publish a document to my self-hosted elasticsearch running on AWS. I wrote my code in nodejs, using v18 LTS, using @elastic/elasticsearch npm module version 8.10.0. When I run my code locally, outside of Docker, it works and my document is published. When I run it as a Lambda function from AWS, it fails with the following error:
ERROR Promise was not fulfilled {
status: 'rejected',
reason: ResponseError: {"error":"Content-Type header [text/plain] is not supported","status":406}
at SniffingTransport.request (/var/task/node_modules/@elastic/transport/lib/Transport.js:479:27)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async Client.CreateApi [as create] (/var/task/node_modules/@elastic/elasticsearch/lib/api/api/create.js:43:12)
at async Promise.allSettled (index 1)
at async Runtime.processEvent [as handler] (/var/task/index.js:105:27) {
meta: {
body: [Object],
statusCode: 406,
headers: [Object],
meta: [Object],
warnings: [Getter]
}
}
}
Once I received this error I modified my client creation to the following:
elasticsearch: {
//node: process.env.ELASTICSEARCH_HOST,
node: {
url: new URL(process.env.ELASTICSEARCH_HOST),
headers: {
'content-type': 'application/vnd.elasticsearch+json; compatible-with=8',
},
},
auth: {
username: process.env.ELASTICSEARCH_USERNAME,
password: process.env.ELASTICSEARCH_PASSWORD,
},
tls: {
ca: fs.readFileSync(process.env.CA_FILE),
rejectUnauthorized: true
}
}
and I call const esClient = new Client(elasticsearch);
to create the client. I still get the same error when I try this. My Dockerfile is simple
FROM amazon/aws-lambda-nodejs:18
WORKDIR $LAMBDA_TASK_ROOT
# Copy only the files for running in Lambda
COPY package*.json .
RUN npm ci --omit=dev
COPY . .
CMD [ "index.processEvent" ]
I cannot figure out why the Content-Type header is being set to [text/plain]