私のJavaサーバーレスプロジェクトでは、画像処理のためにネイティブライブラリを呼び出す必要があります(
libvips
)。 Gradleを使用してzipファイルを作成し、ネイティブライブラリを含むすべての依存関係をlibフォルダーに送信しています。
task buildZip(type: Zip) {
archiveName = "${project.name}.zip"
from compileJava
from processResources
from('.') {
include 'lib/**'
include 'bin/**'
}
into('lib') {
from configurations.runtime
}
}
生成されたzipファイルの
lib
すべてのライブラリーがあるフォルダー(jars/native/etc)。
serverless deploy
を使用して関数をデプロイした後
libvips.so
をロードできません
Native.loadLibrary("/var/task/lib/libvips.so", Object.class)
を使用するライブラリ
。どうやら
/var/task/lib/
でネイティブライブラリではなく、Java依存関係のみが検出されます。
AWSがネイティブライブラリを保存する別のパスはありますか?
編集
スローされる例外:
ava.lang.UnsatisfiedLinkError: Unable to load library '/var/task/lib/libvips.so': Native library (var/task/lib/libvips.so) not found in resource path ([file:/var/task/, file:/var/task/lib/aopalliance-repackaged-2.5.0-b42.jar, file:/var/task/lib/asm-all-repackaged-2.5.0-b42.jar, file:/var/task/lib/aws-java-sdk-core-1.11.336.jar, file:/var/task/lib/aws-java-sdk-kms-1.11.336.jar, file:/var/task/lib/aws-java-sdk-s3-1.11.336.jar, file:/var/task/lib/aws-lambda-java-core-1.1.0.jar,....
回答 2 件
すべてのネイティブライブラリがラムダ環境に存在するわけではないため、DockerまたはEc2を使用してカスタム展開パッケージを作成する必要があります。
以下がその方法です。 https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-java
関連した質問
- 新しいEC2インスタンスの作成時に自動Cloudwatchアラームを作成する方法
- AWS Lambda Pythonレイヤーを作成するにはどうすればよいですか? (XGBoostでの使用例)
- 必要な権限のみを使用してLaunchテンプレートとboto3を使用してec2インスタンスを作成するAWSlambda
- AWS Lambda関数はどのようにして並列関数の結果を取得できますか?
- NeptuneでGremlinセッションを使用するにはどうすればよいですか?
- JavaSDKを介してAWSS3オブジェクトリダイレクトを設定するにはどうすればよいですか
- プライベートサブネットからパブリックサブネットへのリクエスト
- AWSサーバーレス関数:aws-sdkオブジェクトのメソッドにアクセスできません…「関数ではありません」
- アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要がありますAWSS3へのファイルのアップロード
- HTTP APIは、AWSLambdaテスト環境の外部で未定義の値を返します
java.library.path
を指定する必要があります JVMプロパティ。JVMコマンドラインオプションを変更する
または、コードで直接変更します
また、JNAライブラリを使用できます。 JNAは、JVMクラスパスに追加されたJARアーカイブ(リソース)からネイティブライブラリアンを自動的にアンパックおよびロードする機能を提供します。正しいオペレーティングシステムとCPUアーキテクチャバージョンのバイナリの選択が含まれます。