Hallo Patrick,
ich habe zwischenzeitlich ein anderes Projekt verfolgen müssen. Nun kann ich mich dieser Sache wieder zuwenden. Ich werde deine Hinweise befolgen - sprich, auch u.a. solch eine Testfunktion erstellen..
Zu deiner Frage zu Java. Ich versuche aktuell bevorzugt mit den mir bekannten Technologien zu arbeiten, um mein Wissen darüber auch gleichzeitig weiter zu vertiefen. Danke dir jedenfalls sehr. Melde mich hier wieder.
Posts by Alusch
-
-
Der Code-Editor im Lambda funktioniert anscheinend für keine Java Runtime, denn ich habe es mit den Versionen 11 und 17 versucht.
pasted-from-clipboard.pngpasted-from-clipboard.png
Es scheint aber, als wäre das Testergebnis hier eh nicht relevant für den Prozess, weil du nicht weiter darauf eingehst.
Ich denke, du wolltest wohl nur den Code der Test-Funktion zeigen.
Also habe ich nun in meinem Projekt weiterhin Java 17 und in Lambda ebenfalls Java 17 als Runtime eingerichtet.
_____
Dann habe ich im Backend-Ordner meines Projekt eine my_lambda_function.js erstellt und gezippt in Lambda hochgeladen. Meine function "Kontaktformular1" wurde entsprechend geupdated.
____
Meine CORS-Einstellungen sind identisch zu deinen, abgesehen von der url, die bei mir meine Seite ist (ohne www).
____
Also eben die URL in Postman getestet, die so auch in meiner entsprechenden Methode im Frontend bisher angeführt hatte:
pasted-from-clipboard.png
___
In Postman erhalte ich dann dieses Ergebnis:
pasted-from-clipboard.png -
Ich habe ANY durch OPTIONS ersetzt und nochmal die Syntax angepasst, damit die Route mit der Schreibweise {proxy+} erkannt wird. Die Methode heißt jetzt handleOptionsRoute statt handleProxyRoute
Java
Display Morepackage lambda; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import com.amazonaws.services.simpleemail.AmazonSimpleEmailService; import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder; import com.amazonaws.services.simpleemail.model.*; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.HashMap; import java.util.Map; public class LambdaHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { @Override public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent request, Context context) { String path = request.getPath(); String httpMethod = request.getHttpMethod(); APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); response.setHeaders(getCORSHeaders()); // Setze CORS-Header if ("POST".equals(httpMethod) && "/Kontakformular-Emailversand".equals(path)) { response = handlePostRoute(request); } else if ("OPTIONS".equals(httpMethod) && path.matches("^/.*")){ response = handleOptionsRoute(request); } else { response.setStatusCode(404); response.setBody("{\"message\":\"Route not found\"}"); } return response; } // POST Route bearbeiten private APIGatewayProxyResponseEvent handlePostRoute(APIGatewayProxyRequestEvent request) { // JSON body des Requests String body = request.getBody(); ObjectMapper objectMapper = new ObjectMapper(); String name = ""; String email = ""; String message = ""; APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); response.setHeaders(getCORSHeaders()); // Setze CORS-Header try { // JSON body parsen JsonNode rootNode = objectMapper.readTree(body); name = rootNode.get("name").asText(); email = rootNode.get("email").asText(); message = rootNode.get("message").asText(); } catch (Exception e) { e.printStackTrace(); response.setStatusCode(400); response.setBody("{\"message\":\"Invalid input\"}"); return response; } String to = "x@hotmail.de"; String from = "x@gmail.com"; // Habe ich in AWS SES verifiziert sein String subject = "New Contact Form Submission"; String textBody = "Name: " + name + "\nEmail: " + email + "\nMessage: " + message; try { AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder.standard() .withRegion("us-west-2").build(); SendEmailRequest sendEmailRequest = new SendEmailRequest() .withDestination(new Destination().withToAddresses(to)) .withMessage(new Message() .withBody(new Body().withText(new Content().withCharset("UTF-8").withData(textBody))) .withSubject(new Content().withCharset("UTF-8").withData(subject))) .withSource(from); client.sendEmail(sendEmailRequest); response.setStatusCode(200); response.setBody("{\"message\": \"Erfolgreich\"}"); } catch (Exception e) { e.printStackTrace(); response.setStatusCode(500); response.setBody("{\"message\":\"Failed to send email\"}"); } return response; } // OPTIONS Route bearbeiten private APIGatewayProxyResponseEvent handleOptionsRoute(APIGatewayProxyRequestEvent request) { APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); response.setStatusCode(200); response.setBody("{\"message\":\"CORS preflight successful\"}"); response.setHeaders(getCORSHeaders()); // CORS-Header setzen return response; } // Methode zum Erstellen der CORS-Header private Map<String, String> getCORSHeaders() { Map<String, String> headers = new HashMap<>(); headers.put("Access-Control-Allow-Headers", "Content-Type"); headers.put("Access-Control-Allow-Origin", "https://adurach.com"); headers.put("Access-Control-Allow-Methods", "OPTIONS,POST,GET"); return headers; } }
Außerdem habe ich in Lambda für die neue Route eine Integration erstellt, wie schon bei der Route mit POST.Weiterhin gilt dies:
-
Quote
Hast du der Default Route auch eine Funktion hinterlegt?
Wo müsste das getan werden - im LambdaHandler oder in AWS Lamda?
Mein LambdaHandler sieht aktuell so aus:Java
Display Moreimport com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import com.amazonaws.services.simpleemail.AmazonSimpleEmailService; import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder; import com.amazonaws.services.simpleemail.model.*; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.HashMap; import java.util.Map; public class LambdaHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { @Override public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent request, Context context) { String path = request.getPath(); String httpMethod = request.getHttpMethod(); APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); response.setHeaders(getCORSHeaders()); // Setze CORS-Header if ("POST".equals(httpMethod) && "/Kontakformular-Emailversand".equals(path)) { response = handlePostRoute(request); } else if ("ANY".equals(httpMethod) && path.startsWith("/proxy")) { response = handleProxyRoute(request); } else { response.setStatusCode(404); response.setBody("{\"message\":\"Route not found\"}"); } return response; } // POST Route bearbeiten private APIGatewayProxyResponseEvent handlePostRoute(APIGatewayProxyRequestEvent request) { // JSON body des Requests String body = request.getBody(); ObjectMapper objectMapper = new ObjectMapper(); String name = ""; String email = ""; String message = ""; APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); response.setHeaders(getCORSHeaders()); // Setze CORS-Header try { // JSON body parsen JsonNode rootNode = objectMapper.readTree(body); name = rootNode.get("name").asText(); email = rootNode.get("email").asText(); message = rootNode.get("message").asText(); } catch (Exception e) { e.printStackTrace(); response.setStatusCode(400); response.setBody("{\"message\":\"Invalid input\"}"); return response; } String to = "example@hotmail.de"; String from = "examplegmail.com"; // Habe ich in AWS SES verifiziert sein String subject = "New Contact Form Submission"; String textBody = "Name: " + name + "\nEmail: " + email + "\nMessage: " + message; try { AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder.standard() .withRegion("us-west-2").build(); SendEmailRequest sendEmailRequest = new SendEmailRequest() .withDestination(new Destination().withToAddresses(to)) .withMessage(new Message() .withBody(new Body().withText(new Content().withCharset("UTF-8").withData(textBody))) .withSubject(new Content().withCharset("UTF-8").withData(subject))) .withSource(from); client.sendEmail(sendEmailRequest); response.setStatusCode(200); // Struktur der Antwort response.setBody("{\"message\": \"Erfolgreich\"}"); } catch (Exception e) { e.printStackTrace(); response.setStatusCode(500); response.setBody("{\"message\":\"Failed to send email\"}"); } return response; } // proxy+ Route bearbeiten private APIGatewayProxyResponseEvent handleProxyRoute(APIGatewayProxyRequestEvent request) { // Beispiel-Response für proxy+ Route APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); response.setStatusCode(200); response.setBody("{\"message\":\"Proxy route handled successfully\"}"); // CORS-Header setzen response.setHeaders(getCORSHeaders()); return response; } //Auskommentiert /* // Methode zum Erstellen der CORS-Header private Map<String, String> getCORSHeaders() { Map<String, String> headers = new HashMap<>(); headers.put("Access-Control-Allow-Headers", "Content-Type"); headers.put("Access-Control-Allow-Origin", "https://adurach.com"); headers.put("Access-Control-Allow-Methods", "OPTIONS,POST,GET"); return headers; }*/ }
Und hier weiterhin die Headers beim fehlerhaften Befehl:
pasted-from-clipboard.png
Besten Dank dir. Hoffe, du kannst du noch etwa Geduld aufbringen. -
Im Firefox Ikognito-Modus:
Anfrage:Antwort:
pasted-from-clipboard.png
"CORS missing allow origin" trotz dieser Angaben:
pasted-from-clipboard.png -
Ja, in meinen CORS-Einstellungen habe ich meine Website für "Zugriffskontrolle-Ursprungsort-zulassen" ohne "www" angegeben. So der aktuelle Stand
pasted-from-clipboard.png
Ich habe nach Lesen des Stackoverflow-Artikels diese Methode hinzugefügt:
pasted-from-clipboard.png
und in Chrome die ganze Chronik gelöscht sowie die Seite im privaten Modus besucht.
Diese Meldungen erhalte ich:
pasted-from-clipboard.png -
Hallo Patrick,
sorry, ich war bis gestern auf einer Radtour und ohne Laptop unterwegs, Und diese Angelegenheit lässt sich nicht über das Handy regeln.
Ich werde das morgen wieder angehen und mich hier melden. Danke der Nachfrage. -
Das sind meine aktuellen Werte in Apache (s. 1.). Ich möchte nur diese eine Funktion für den Mailversand im Lambda ausführen (s. 2.).
Beim Speichern neuer Wert in Apache auf netcups kommt der Hinweis: [[willBeAppliedAfterApacheRestartInterval]]
Ich habe mit einer Dateiänderung im Netcup-Dateimanager einen Neustart versucht auszulösen und noch einige Stunden vergehen lassen.
Mit dieser Einrichtung erhalte ich dennoch die gleichen Fehler wie zuvor (s.3).
Besten Dank für deine Ausdauer.
1.
forum.netcup.de/system/attachment/13463/
2.
forum.netcup.de/system/attachment/13466/
3.QuoteQuellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://s52tbcrlt5.execute-api…ntakformular-Emailversand. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt). Statuscode: 204.
Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://s52tbcrlt5.execute-api…ntakformular-Emailversand. (Grund: CORS-Anfrage schlug fehl). Statuscode: (null).
Fehler beim Emailversand
Object { headers: {…}, status: 0, statusText: "Unknown Error", url: "https://s52tbcrlt5.execute-api…ntakformular-Emailversand", ok: false, name: "HttpErrorResponse", message: "Http failure response for https://s52tbcrlt5.execute-api…takformular-Emailversand: 0 Unknown Error", error: error }
-
Screenshot 2024-09-04 014612.png
Entspricht das deinem Vorschlag?
Dadurch ändert sich beim Versuch die Lambda-Funktion auf meiner Website aufzulösen leider nichts. Ich erhalte die gleichen drei Fehlermeldungen wie zuvor (Zweimal Cors, Fehler bei Emailversand).
Der Allow-Origin-Header im Lambda Cors scheint zu passen, sonst hättest du dazu wohl noch kommentiert. -
CORS in Lamda und die zusätztliche Header in Apache:
1a) https://imgur.com/a/q5WX2oI
1b) https://imgur.com/a/HPtRNEN
2) https://imgur.com/a/oRNUwdU
Das Feld "zusätzliche Nginx-EInstellungen" (wie im stackoverflow-Beitrag) gibt es in den Einstellungen in Netcups bei mir nicht. (Screenshot 3)
Da Nginx als Proxy fungiert, werden Anfragen anscheinend an Apache weitergeleitet (SH 2). Daher habe ich die Header dort eingetragen (SH 1)
Ich habe versucht Lambda-CORS-Einstellungen damit zu synchronisieren.
In der Backend-Datei habe ich die Methode zum Header hinzufügen entfernt.
Das Resultat bleibt leider das Selbe.QuoteQuellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://s52tbcrlt5.execute-api…ntakformular-Emailversand. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt). Statuscode: 204.
Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://s52tbcrlt5.execute-api…ntakformular-Emailversand. (Grund: CORS-Anfrage schlug fehl). Statuscode: (null).
Fehler beim Emailversand Object { headers: {…}, status: 0, statusText: "Unknown Error", url: "https://s52tbcrlt5.execute-api.eu-central-1.amazonaws.com/default/Kontakformular-Emailversand", ok: false, name: "HttpErrorResponse", message: "Http failure response for https://s52tbcrlt5.execute-api…takformular-Emailversand: 0 Unknown Error", error: error } -
Das klingt doch etwas anspruchsvoll. Aber ich versuche das natürlich.
Mein Frontend habe ich mit Angular erstellt. Die Lambda-Funktion habe ich in Java geschrieben. -
Besten Dank Patrick für deine Rückmeldung.
Wenn ich auf meiner Domain die Funktion zum Versand des Kontaktformulars auslösen möchte, erhalte ich:CodeQuellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://s52tbcrlt5.execute-api.eu-central-1.amazonaws.com/default/Kontakformular-Emailversand. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt). Statuscode: 204. Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://s52tbcrlt5.execute-api.eu-central-1.amazonaws.com/default/Kontakformular-Emailversand. (Grund: CORS-Anfrage schlug fehl). Statuscode: (null). Fehler beim Emailversand (Object { headers: {…}, status: 0, statusText: "Unknown Error",....) [tt][tt][/tt][/tt]
-
Product: Hosting195801 - Webhosting 1000 NUE
Guten Tag,
ich nutze das oben angegebene Produkt von netcup für meine Website. Bisher hatte ich nur statische Inhalte auf meiner Seite - also nur das Frontend in Nutzung. Das hat alles funktioniert.
Nun möchte ich aber eine serverless function mit AWS Lambda nutzen, um für ein Kontakformular auf meiner Seite die entsprecehnde Funktionalität bereitzustellen.
Aktuell erhalte ich beim Versuch, die Lambda-Funktion per Buttonklick unter dem Formular auszulösen, einen CORS-Fehler. Nachdem ich nun schon einiges probiert habe in den CORS-Einstellungen bei AWS Lambda und in der Backend-Datei, möchte ich hier mal nachfragen.
Kann es sein, dass ich mit meinem Netcup-Produkt gar keine Backendoperationen ausführend kann?
Muss ich vielleicht hier im Control Panel irgendetwas konfigurieren, um den CORS-Fehler zu beseitigen?Vielen Dank für etwaigen Rat
Beste Grüße