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

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark