AWS LambdaからAmazon Elasticsearch serviceを利用する
やりたいこと Amazon Elasticsearch serviceをLambdaから使いたい ただしElasticsearchへのアクセスはある程度制限したい ポイント Lambdaからの利用なので、VPCには配置し […]
広告ここから
広告ここまで
目次
やりたいこと
- Amazon Elasticsearch serviceをLambdaから使いたい
- ただしElasticsearchへのアクセスはある程度制限したい
ポイント
- Lambdaからの利用なので、VPCには配置しない
- 自由にアクセスされると困るので、IAMで制御する
- http-aws-esを使ってやり取りする
ライブラリのインストール
http-aws-esはelasticsarch.jsのラッパーですので、一緒にインストールします。
$ npm install --save http-aws-es elasticsearch
Elasticsearchには以下のような形でリクエストを送ります。
let es = require('elasticsearch').Client({
hosts: [ 'https://amazon-es-host.us-east-1.es.amazonaws.com' ],
connectionClass: require('http-aws-es')
})
es.search({
q: 'pants'
}).then(function (body) {
var hits = body.hits.hits
console.log(body)
console.log(hits)
}, function (error) {
console.trace(error.message)
})
ローカルで試す場合は、direnvなどを使って認証情報を渡すようにしておきましょう。
export AWS_PROFILE=EXAMPLE_PRIFLE
export AWS_REGION=ap-northeast-1
認証情報に問題がなければ、以下のような結果が返ってくるはずです。
$ node test.js
{ took: 2519,
timed_out: false,
_shards: { total: 1, successful: 1, skipped: 0, failed: 0 },
hits: { total: 0, max_score: null, hits: [] } }
[]
Tips: Lambdaにアタッチされていないロールでアクセスしたい場合
Lambdaにアタッチしているロールを使いたくないケース(があるのかはわかりませんが)では、aws-sdkを使うことで独自の認証情報を渡すことができます。
let AWS = require('aws-sdk');
AWS.config.update({
credentials: new AWS.Credentials(accessKeyId, secretAccessKey),
region: 'us-east-1'
});
let es = require('elasticsearch').Client({
hosts: [ 'https://amazon-es-host.us-east-1.es.amazonaws.com' ],
awsConfig: new AWS.Config({ region }),
connectionClass: require('http-aws-es')
})
データを投入する
基本的にはelasticsarch.jsの書き方に従って実装すれば問題ありません。
データの追加は以下のような書き方でできます。
let es = require('elasticsearch').Client({
hosts: [ 'https://amazon-es-host.us-east-1.es.amazonaws.com' ],
connectionClass: require('http-aws-es')
})
es.create({
index: 'fact-data-ja',
type: 'words',
id: '1',
body: {
title: 'サービス名',
description: 'サービスの紹介文'
}
}).then(function (body) {
console.log(body)
}, function (error) {
console.trace(error.message)
})
検索する
あとは投入したデータを検索してみましょう。
es.search({
index: 'fact-data-*',
type: 'words'
}).then(function (body) {
var hits = body.hits.hits
console.log(hits)
}, function (error) {
console.trace(error.message)
})
成功すれば、以下のようなレスポンスが返ってきます。
[ { _index: 'fact-data-ja',
_type: 'words',
_id: '1',
_score: 1,
_source:
{ title: 'サービス名',
description: 'サービスの紹介文' } } ]