AWSラムダ関数のJavaでバイトストリーミングクライアントを作成しようとしています。私は、RequestStreamHandlerの実装としてラムダ関数を作成しました。このプロジェクトの基礎は、文書hereに記載されています。AWSラムダバイトストリーミングクライアント(Java)
public class LambdaFunctionHandler implements RequestStreamHandler {
static final String bucket = "anS3bucket";
static final String key = "anS3KeyToAJpegFile";
@Override
public void handleRequest(InputStream input, OutputStream output,
Context context) throws IOException {
AmazonS3 s3Client = new AmazonS3Client(
new EnvironmentVariableCredentialsProvider());
try {
context.getLogger().log("Downloading an object\n");
S3Object s3object = s3Client.getObject(new GetObjectRequest(
bucket, key));
context.getLogger().log("Content-Type: " +
s3object.getObjectMetadata().getContentType()
+ "\n");
InputStream in = s3object.getObjectContent();
int b = 0;
context.getLogger().log("Writing jpeg on output\n");
while ((b = in.read()) > -1) {
output.write(b);
}
} catch (AmazonServiceException e) {
System.out.println("Error Message: " + e.getMessage());
}
}
}
このハードコーディングされた例は、Lambdaテストコンソールで正常に動作します。 JARをアップロードし、ラムダ関数を実行することができます( "Test"をクリックしてください)。この関数の機能は、jpegファイルの内容を取得し、バイトストリームをOutputStreamに書き出すことです。私は関数の結果としてテストコンソールでバイナリ出力を見ることができます。これまでのところすべてが問題ありません。最終的に私はJPEG上でImageMagickを実行し、サイズを変更します - これはこのプロジェクトの目標です。
私のクライアントコードは次のようになります。私は、Javaクライアントでバイトストリームを受け取るしようとすると
public interface ImageService {
@LambdaFunction(functionName="ImageProcessing")
OutputStream getImageStream(InputStream data);
}
public class LambdaImageTest {
public static void main(String[] args) throws IOException {
AWSLambdaClient lambda = new AWSLambdaClient(new ProfileCredentialsProvider());
lambda.configureRegion(Regions.EU_WEST_1);
ImageService service = LambdaInvokerFactory.build(ImageService.class, lambda);
// Call lambda function, receive byte stream
OutputStream out = service.getImageStream(null);
System.out.println(out); // This code is not complete
}
、私は失敗します。バイトストリームを受け取る方法はないようです。クライアントは、私がここで望んでいるものではない、jsonデータとしてリルートを読み取ろうとしているようだ。私は直接バイトストリーム(jpegバイナリの内容)を読み取るしたいです。私が得るエラーは:
Exception in thread "main" com.amazonaws.services.lambda.invoke.LambdaSerializationException: Failed to parse Lambda function result
at com.amazonaws.services.lambda.invoke.LambdaInvokerFactory$LambdaInvocationHandler.getObjectFromPayload(LambdaInvokerFactory.java:210)
at com.amazonaws.services.lambda.invoke.LambdaInvokerFactory$LambdaInvocationHandler.processInvokeResult(LambdaInvokerFactory.java:189)
at com.amazonaws.services.lambda.invoke.LambdaInvokerFactory$LambdaInvocationHandler.invoke(LambdaInvokerFactory.java:106)
at com.sun.proxy.$Proxy3.getImageStream(Unknown Source)
at se.devo.lambda.image.LambdaImageTest.main(LambdaImageTest.java:33)
Caused by: com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 middle byte 0xff
at [Source: [[email protected]; line: 1, column: 4]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1487)
AWS Lambda Javaクライアントでバイトストリームデータを正しく受信するにはどうすればよいですか?
申し訳ありませんが、まったく同じエラーが表示されます。 LambdaInvokerFactoryを使用すると、要求と応答の両方のデータの中間形式としてJSONが使用されるようです。サーバ側でラムダ関数の変種として文書化されているストリーミングモデルは、現時点ではクライアントサイドではサポートされていないようです。 – Barsk