概要
- こちらの記事を参考に、tweetの感情分析を行おうとしています
- Lambda、Elasticsearch Serviceを終えて、Lambdaをテスト実行すると、掲題のエラーが発生します
- このエラーを解消したいものの、解決方法を見つけられず。。お力をお貸しください
エラー概要
エラー内容
Lambdaをテスト実行すると下記のエラーが発生します
e to revive connection: ESのエンドポイント Elasticsearch WARNING: 2021-02-28T09:55:05Z No living connections 以下略
実行内容
記事内容通り、下記のコードを実行しています。
(実際には、node modulesなどもLambdaにアップしています。また環境変数を利用しています)
/** モジュールのimport */ const twitter = require('twitter'); const elasticSearch = require('elasticsearch'); const AWS = require('aws-sdk'); /** 各クライアントの生成 */ // elasticsearch用のクライアント const elasticsearchClient = new elasticSearch.Client({ service : 'es', region : process.env.ES_REGION, host : process.env.ES_HOST }); // Twitter用のクライアント const twitterClient = new twitter({ consumer_key : process.env.TW_CONSUMER_KEY, // API Key consumer_secret : process.env.TW_CONSUMER_SECRET, // API Secret Key access_token_key : process.env.TW_ACCESS_TOKEN_KEY, // Access Token access_token_secret : process.env.TW_ACCESS_TOKEN_SECRET, // Access Token Secret }); // 翻訳用 const translate = new AWS.Translate(); const translateParams = { SourceLanguageCode: 'ja', TargetLanguageCode: 'en', Text: '' }; // 感情分析用 const comprehend = new AWS.Comprehend({region: 'us-east-1'}); /** * Elasticsearchにデータを登録します。 */ var createIndexAndStreamDataOnES = function(indexName, id, body) { // Elasticsearchに登録 elasticsearchClient.create({ index : indexName, type : 'test', id : id, body : body }, function(err, data) { if (err) { console.log("Error on creating data", err); } else { console.log("data reply received", data); } }); }; /** * 与えられた文字列の感情分析をします。 */ const detectSentiment = function (text) { return new Promise((resolve, reject) => { let params = { LanguageCode: "en", Text: text }; comprehend.detectSentiment(params, function (err, data) { if (err) { console.log(err, err.stack); reject(err); } else { resolve(data.Sentiment); } }); }); }; /** * 引数に与えられた文字列を含むTweetを検索し、 * 検索結果をElasticsearchに登録します。 */ function searchTweet(queryArg, nextResultsMaxIdArg = null) { // Tweetを検索 twitterClient.get('search/tweets', { q: queryArg, count: 100, max_id: nextResultsMaxIdArg }, (error, searchData, response) => { // エラーが発生した場合 if (error) { console.log(error); return 1; } // Tweetの検索結果が存在していた場合 if (searchData !== undefined) { var item = null; for (item in searchData.statuses) { // tweet情報 let tweet = searchData.statuses[item]; // タイムスタンプ情報を保持 tweet["@timestamp"] = new Date(tweet["created_at"]); // 検索条件を保持 tweet["searchParam"] = queryArg; // 英語に翻訳 translateParams["Text"] = tweet.text; translate.translateText(translateParams, function(err, translateResult) { if (err) { console.log(err, err.stack); // an error occurred } else { // 英訳したテキストの感情を分析 detectSentiment(translateResult.TranslatedText).then(function(sentiment) { // 分析結果を保持して、elaseticsearchに登録 tweet["sentiment"] = sentiment; createIndexAndStreamDataOnES("twitter", tweet["id_str"], tweet); }); } }); } if (searchData.search_metadata == undefined) { return 0; } else if (searchData.search_metadata.next_results) { let maxId = searchData.search_metadata.next_results.match(/?max_id=(\d*)/); if (maxId[1] == null) { return 0; } searchTweet(queryArg, maxId[1]); } else { return 0; } } }); } /** * Lambdaのハ![イメージ説明](d050a7c1514e5fcffb15e0354f7afc05.png)です。 */ exports.handler = function (event) { // ツイートを検索 searchTweet(event.keyword); // レスポンスを返す const response = { statusCode: 200, body: JSON.stringify('Success!'), }; return response; };
確認したこと
- ESのステータスはアクティブでした
- コード内で指定しているESのホストは、ESのホストの下記の画像の網掛けと一致していました
- ES側のアクセスポリシーはオープンアクセスになっています
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "ARN" } ] }
あなたの回答
tips
プレビュー