AWSElasticsearchSaaS / FaaS

AWS LambdaからAmazon Elasticsearch serviceを利用する

やりたいこと Amazon Elasticsearch serviceをLambdaから使いたい ただしElasticsearchへのアクセスはある程度制限したい ポイント Lambdaからの利用なので、VPCには配置し […]

広告ここから
広告ここまで

やりたいこと

ポイント

  • Lambdaからの利用なので、VPCには配置しない
  • 自由にアクセスされると困るので、IAMで制御する
  • http-aws-esを使ってやり取りする

ライブラリのインストール

http-aws-eselasticsarch.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: 'サービスの紹介文' } } ]

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts