Serverless Framework / Hinweise zur Implementierung in AWS / Java.
API Gateway und Lambda funktionieren nicht mit dem von der Vorlage generierten Code, und er funktioniert nicht! !!
Erstellen Sie beispielsweise ein Projekt mit dem folgenden Befehl.
sls create --template aws-java-maven --path serverless
Anschließend wird die folgende Java-Datei erstellt.
Handler.java
package hello;
import java.io.IOException;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class Handler implements RequestHandler<Request, Response> {
@Override
public Response handleRequest(Request input, Context context) {
return new Response("Go Serverless v1.0! Your function executed successfully!", input);
}
}
Wenn diese Methode jedoch über API Gateway ausgeführt wird, funktioniert dies nicht. Weil der folgende JSON übergeben wird (teilweise geändert).
{
"httpMethod" : "POST",
"requestContext" : {
"httpMethod" : "POST",
"accountId" : "*******",
"apiId" : "*******",
"resourceId" : "******",
"identity" : {
"userAgent" : "Apache-HttpClient\/4.5.x (Java\/1.8.0_112)",
"userArn" : "arn:aws:iam::******:user\/****",
"caller" : "***************",
"cognitoAuthenticationProvider" : null,
"cognitoIdentityId" : null,
"accessKey" : "******************",
"accountId" : "*****************",
"sourceIp" : "test-invoke-source-ip",
"apiKey" : "test-invoke-api-key",
"cognitoAuthenticationType" : null,
"cognitoIdentityPoolId" : null,
"user" : "*******************"
},
"requestId" : "test-invoke-request",
"stage" : "test-invoke-stage",
"resourcePath" : "\/hello"
},
"resource" : "\/hello",
"pathParameters" : null,
"isBase64Encoded" : false,
"headers" : null,
"path" : "\/hello",
"stageVariables" : null,
"queryStringParameters" : null,
"body" : "{\n \"key1\": \"hoge\",\n \"key2\": 120\n}"
}
Was ich wirklich will, ist der letzte Eigenschaftsteil `body
`.
Dies bedeutet, dass Sie ein Programm schreiben müssen, das dies extrahiert.
Nicht nur die Anfrage, sondern auch die Antwort funktioniert nicht so wie sie ist.
Es scheint, dass das Antwortobjekt drei Eigenschaften benötigt: `statusCode```,`
headers und `` `body
.
~~ Ich werde eine Beispiellösung für diesen Bereich bereitstellen. aws-serverless-java-sample ~~
(Fest am 24. Juni 2018) Das AWS SDK hat eine entsprechende Lösung, daher werde ich es neu schreiben.
Wenn AWS eine Bibliothek mit dem Namen aws-lambda-java-events bereitstellt und Lambda mit verschiedenen Diensten verbunden ist Anforderungs- und Antworttypen sind definiert.
Folgende Arten von Anforderungen und Antworten werden beim Herstellen einer Verbindung zum API-Gateway übergeben.
Da es sich bei dem Body um einen String-Typ handelt, bleibt der Aufwand für das Codieren / Decodieren von JSON bestehen, das Codieren sollte jedoch noch viel einfacher sein.
Recommended Posts