AWSでLambdaを使用するのは初めてで、現在、さまざまなブログで提供されているサンプルスクリプトのいくつかを実行して、サーバーのない環境でこれらすべてがどのように機能するかをテストしようとしています。私が取り組んでいる例の1つは、オブジェクトがs3バケットに追加されるたびにトリガーされ、オブジェクトのメタデータをelasticsearchに格納するラムダ関数を作成することです。
この目的のために、elasticsearchドメインのs3バケットを作成し、ラムダ関数の作成を開始しました。
ラムダコンソールで提供されているインラインコードエディターを使用しており、ランタイムとしてpython3.6を選択しています。コードは次のとおりです。
from __future__ import print_function
from pprint import pprint
import boto3
import json
from elasticsearch import Elasticsearch, RequestsHttpConnection
def lambda_handler(event, context):
imageid = event['Records'][0]['s3']['object']['key']
print(imageid)
このコードはまだデータをElasticSearchにプッシュしていません。これについては後で説明します。ただし、elasticsearchのインポートで「モジュールが見つかりません」というエラーが発生します。
上記のコードをテストしたときのエラーログは次のとおりです。
Response:
{
"errorMessage": "Unable to import module 'lambda_function'"
}
Request ID:
"a26249c3-00e2-11e9-83b0-ffc7719455cf"
Function Logs:
START RequestId: a26249c3-00e2-11e9-83b0-ffc7719455cf Version: $LATEST
Unable to import module 'lambda_function': No module named elasticsearch
END RequestId: a26249c3-00e2-11e9-83b0-ffc7719455cf
REPORT RequestId: a26249c3-00e2-11e9-83b0-ffc7719455cf Duration: 0.42 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 25 MB
私は、サーバーレス環境がデフォルトで呼び出されたときにすべての必要なライブラリをロードするという印象を受けました。ただし、このエラーの詳細を調べたところ、ソースをzipファイルで指定するように指定されているものもあれば、zipファイルがであると指定されているものもありましたWhen you use the ZipFile property to specify your function's source code and that function interacts
。
これは紛らわしいと思います。Elasticsearchモジュールをサーバーレス環境にインストールする必要がありますか、それともzipファイルとしてロードする必要がありますか?ラムダ関数がElasticSearchと通信するようにするにはどうすればよいですか。
はい、AWSLambda環境にはデフォルトでboto3pythonライブラリのみが含まれています。それ以外の場合は、すべての依存関係を含むzipファイルを作成し、Lambda関数にアップロードする必要があります。
これを行うには(少なくとも)3つの方法があります。
それが役に立てば幸い!:)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加