


Erstellen Sie Go Serverless REST APIs und stellen Sie sie mithilfe des SAM-Frameworks (Amazon Linux Untime) in AWS bereit.
Warum noch ein Go-Tutorial
AWS hat in letzter Zeit mehrere Dienste und Laufzeiten eingestellt. Wie wir mit der Einstellung unseres beliebten CodeCommit und anderer wichtiger Dienste gesehen haben, wird Go1.x für AWS Lambda-Funktionen nicht mehr unterstützt.
Wenn Sie versuchen, die meisten veralteten Tutorials bereitzustellen, können Fehler wie diese auftreten:
Resource creation Initiated CREATE_FAILED AWS::Lambda::Function DemoFunction Resource handler returned message: "The runtime parameter of go1.x is no longer supported for creating or updating AWS Lambda functions. We recommend you use a supported runtime while creating or updating functions. (Service: Lambda, Status Code: 400, Request ID: 81f1f708-0a7a-40d0-8442-b9c16510d01f)" ROLLBACK_IN_PROGRESS AWS::CloudFormation::Stack lambda-go-gorilla The following resource(s) failed to create: [DemoFunction]. Rollback requested by user.
Die wichtigste Erkenntnis ist, dass die einzige Konstante in der Software der Wandel ist. Es gibt jedoch einige zeitlose Prinzipien, die wir immer im Auge behalten sollten:
Um dieses Problem zu beheben, habe ich beschlossen, ein aktuelles Repository mit der gesamten Infrastruktur zu erstellen, die für die Bereitstellung einer Go-Anwendung erforderlich ist. Es stehen zwei Optionen zur Verfügung:
- Bereitstellung mit Fargate unter Verwendung von Docker-Containern.
- Bereitstellung mit dem SAM-Framework auf AWS.
Sie können das Repository hier auf GitHub finden.
Zeitlose Prinzipien in der Softwareentwicklung
- Infrastruktur als Code ist unerlässlich.
- Gute Namenskonventionen in der Software sind entscheidend.
- Testen Sie immer Ihre Logik.
- Verfügbarkeit und Skalierbarkeit
- Deployment Pipeline als Mechanismus zur Automatisierung des Softwarebereitstellungsprozesses.
- Beobachtbarkeit ist obligatorisch.
- Sicherheit ist ein erstklassiger Bürger bei Cloud-nativen Anwendungen.
- Go ist eine hervorragende Option zum Erstellen von APIs.
Infrastruktur als Code ist unerlässlich
Eine unveränderliche Infrastruktur ermöglicht es uns, auf einer höheren Ebene zu erklären, was wir wollen, und stellt sicher, dass Entwicklungs- und Produktionsumgebungen so nah wie möglich bleiben. Zum Beispiel:
CompoundingFunction: Type: AWS::Serverless::Function Metadata: BuildMethod: makefile Properties: FunctionName: CompoundingFunction Architectures: ["arm64"] Handler: bootstrap Runtime: provided.al2 CodeUri: ./functions/CompoundingFunction/ MemorySize: 512 Timeout: 10 Environment: Variables: COMPOUNDING_TABLE_NAME: !Ref CompoundingTable Policies: - DynamoDBCrudPolicy: TableName: !Ref CompoundingTable Events: ApiGatewayPost: Type: Api Properties: RestApiId: !Ref ApiGateway Path: /compounding Method: POST
Gute Namenskonventionen in der Software sind der Schlüssel
Scheuen Sie sich nicht vor einem Refactoring, wenn Sie über eine gute Testsuite verfügen. Refactoring ist eine wesentliche Aktivität in der Softwareentwicklung. Namen sind wichtig, da sie überall in Modulen, Funktionen, Paketen, Variablen usw. vorkommen.
package main import ( "context" "encoding/json" "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) // Response is the structure for the response JSON type Response struct { Message string `json:"message"` GainsPerYear []float64 `json:"gainsPerYear"` } type Request struct { Principal float64 `json:"principal"` AnnualRate float64 `json:"annualRate"` Years int `json:"years"` } func HelloHandler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { var req Request err := json.Unmarshal([]byte(event.Body), &req) if err != nil { return createResponse(400, "Invalid request body") } fmt.Println("Request", req) gainsPerYear := CalculateCompoundInterest(req.Principal, req.AnnualRate, req.Years) fmt.Println(gainsPerYear) response := Response{ Message: "Calculation successful", GainsPerYear: gainsPerYear, } body, err := json.Marshal(response) if err != nil { return createResponse(500, "Error marshalling response") } return createResponse(200, string(body)) } func createResponse(statusCode int, body string) (events.APIGatewayProxyResponse, error) { return events.APIGatewayProxyResponse{ StatusCode: statusCode, Body: body, Headers: map[string]string{"Content-Type": "application/json"}, }, nil } func main() { lambda.Start(HelloHandler) }
Testen Sie immer Ihre Logik
In serverlosen Anwendungen sind Unit-Tests wichtig, aber vergessen Sie nicht, auch Integrationstests einzubeziehen, da die meisten dieser Anwendungen auf Integrationen und Richtlinien angewiesen sind, um Geschäftsprobleme zu lösen.
func TestCalculateCompoundInterest(t *testing.T) { principal := 100000000.0 annualRate := 10.0 years := 10 result := CalculateCompoundInterest(principal, annualRate, years) lastElement := round(result[len(result)-1], 2) expected := round(259374246.01, 2) if !reflect.DeepEqual(lastElement, expected) { t.Errorf("Expected %v, but got %v", expected, lastElement) } }
Verfügbarkeit und Skalierbarkeit
Serverlose Architekturen sind standardmäßig hochverfügbar und ereignisgesteuert, wodurch die meisten betrieblichen Aufgaben entfallen. Wenn Sie sich jedoch für ECS und Container entscheiden, ist es wichtig, einen Load Balancer einzubinden, um den Datenverkehr auf Ihre Server zu verteilen und so sowohl Verfügbarkeit als auch Skalierbarkeit sicherzustellen.
CompoundingLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Name: compounding-nlb Scheme: internet-facing Type: network Subnets: - !Ref PublicSubnetOne - !Ref PublicSubnetTwo
Bereitstellungspipeline
Eine Bereitstellungspipeline automatisiert den Softwarebereitstellungsprozess. Wir haben ein Makefile erstellt, um diesen Prozess zu vereinfachen und es einfacher zu machen, sich wiederholende Aufgaben mit einem einzigen Befehl bereitzustellen und auszuführen. Dieser Ansatz erhöht die Effizienz und Konsistenz Ihres Bereitstellungsworkflows.
Beobachtbarkeit ist obligatorisch
Stellen Sie sicher, dass Ablaufverfolgung, Protokollierung und Metriken vorhanden sind. Bei serverlosen Anwendungen ist die Aktivierung dieser Funktionen so einfach wie das Hinzufügen von Tracing: Active. Die Möglichkeit, alle Protokolle an einem zentralen Ort wie CloudWatch einzusehen und die Interaktionen des Dienstes zu überwachen, ist von unschätzbarem Wert.
Sicherheit ist bei Cloud-nativen Anwendungen oberstes Gebot
Sicherheit steht bei allen Anwendungen an erster Stelle. Die Verwendung von Amazon Cognito bietet eine robuste Benutzerauthentifizierung, während API-Schlüssel eine zusätzliche Kontroll- und Autorisierungsebene hinzufügen und sicherstellen, dass nur autorisierte Clients auf Ihre APIs zugreifen können.
Auth: DefaultAuthorizer: CompoundingAuthorizer Authorizers: CompoundingAuthorizer: UserPoolArn: XXXX LambdaTokenAuthorizer: FunctionArn: !GetAtt LambdaTokenAuthorizerFunction.Arn FunctionPayloadType: REQUEST Identity: Headers: - Authorization ReauthorizeEvery: 100 AddDefaultAuthorizerToCorsPreflight: false
Weisen Sie jedem Dienst, Benutzer und jeder Komponente die minimal erforderlichen Berechtigungen zu, um die Angriffsfläche zu verringern und unbefugten Zugriff zu verhindern. Prinzip der geringsten Rechte:
Policies: - DynamoDBCrudPolicy: TableName: !Ref CompoundingTable
Referenzen
- Terraform in Aktion – Praktische Anwendungen und Strategien zur Implementierung von Terraform, einem Tool zum Aufbau, zur Änderung und zur Verwaltung von Infrastruktur.
- Continuous Delivery Pipelines
Abschluss
Software entwickelt sich ständig weiter und auch wenn sich einige Tools und Praktiken ändern, bleiben die Grundprinzipien dieselben. Wir brauchen eine unveränderliche Infrastruktur, CI/CD, gute Namenskonventionen, eine robuste Teststrategie, Sicherheit in unseren APIs und Effizienz in unseren Anwendungen. Aus diesem Grund habe ich beschlossen, dieses Projekt serverlos neu zu erstellen.
Es gab noch nie einen besseren Zeitpunkt, Ingenieur zu werden und durch Software Werte in der Gesellschaft zu schaffen.
- GitHub
Wenn Ihnen die Artikel gefallen haben, besuchen Sie meinen Blog jorgetovar.dev
Das obige ist der detaillierte Inhalt vonErstellen Sie Go Serverless REST APIs und stellen Sie sie mithilfe des SAM-Frameworks (Amazon Linux Untime) in AWS bereit.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Golang ist in Bezug auf Leistung und Skalierbarkeit besser als Python. 1) Golangs Kompilierungseigenschaften und effizientes Parallelitätsmodell machen es in hohen Parallelitätsszenarien gut ab. 2) Python wird als interpretierte Sprache langsam ausgeführt, kann aber die Leistung durch Tools wie Cython optimieren.

Golang ist in Gleichzeitigkeit besser als C, während C bei Rohgeschwindigkeit besser als Golang ist. 1) Golang erreicht durch Goroutine und Kanal eine effiziente Parallelität, die zum Umgang mit einer großen Anzahl von gleichzeitigen Aufgaben geeignet ist. 2) C über Compiler -Optimierung und Standardbibliothek bietet es eine hohe Leistung in der Nähe der Hardware, die für Anwendungen geeignet ist, die eine extreme Optimierung erfordern.

GoisidealforBeginersandSuitableforCloudandNetWorkServicesDuetoitsSimplicity, Effizienz und Konsumfeaturen.1) InstallgoFromTheofficialwebSiteAnDverifyWith'goversion'.2) CreateAneDrunyourFirstProgramwith'gorunhello.go.go.go.

Golang ist für schnelle Entwicklung und gleichzeitige Szenarien geeignet, und C ist für Szenarien geeignet, in denen extreme Leistung und Kontrolle auf niedriger Ebene erforderlich sind. 1) Golang verbessert die Leistung durch Müllsammlung und Parallelitätsmechanismen und eignet sich für die Entwicklung von Webdiensten mit hoher Konsequenz. 2) C erreicht die endgültige Leistung durch das manuelle Speicherverwaltung und die Compiler -Optimierung und eignet sich für eingebettete Systementwicklung.

Golang und Python haben jeweils ihre eigenen Vorteile: Golang ist für hohe Leistung und gleichzeitige Programmierung geeignet, während Python für Datenwissenschaft und Webentwicklung geeignet ist. Golang ist bekannt für sein Parallelitätsmodell und seine effiziente Leistung, während Python für sein Ökosystem für die kurze Syntax und sein reiches Bibliothek bekannt ist.

Die Leistungsunterschiede zwischen Golang und C spiegeln sich hauptsächlich in der Speicherverwaltung, der Kompilierungsoptimierung und der Laufzeiteffizienz wider. 1) Golangs Müllsammlung Mechanismus ist praktisch, kann jedoch die Leistung beeinflussen.

Golang und C haben jeweils ihre eigenen Vorteile bei Leistungswettbewerben: 1) Golang ist für eine hohe Parallelität und schnelle Entwicklung geeignet, und 2) C bietet eine höhere Leistung und eine feinkörnige Kontrolle. Die Auswahl sollte auf Projektanforderungen und Teamtechnologie -Stack basieren.

GolangissidealforbuildingsCalablesSystemduetoitseffizienz und Konsumverkehr, whilepythonexcelsinquickScriptingandDataanalyseduetoitssimplication und VacevastEcosystem.golangsDesineScouragesCouragescournations, tadelcodedeanDitsGoroutaTinoutgoroutaTinoutgoroutaTinoutsGoroutinesGoroutinesGoroutsGoroutins, t
