Rumah > Artikel > pembangunan bahagian belakang > Bina Go Serverless REST API dan Sebarkan ke AWS menggunakan rangka kerja SAM (Amazon Linux untime)
AWS telah menamatkan beberapa perkhidmatan dan masa jalan baru-baru ini. Seperti yang telah kita lihat dengan pemberhentian CodeCommit kesayangan kami dan perkhidmatan penting lain, Go1.x tidak lagi disokong untuk fungsi AWS Lambda.
Jika anda cuba menggunakan kebanyakan tutorial yang sudah lapuk, anda mungkin menghadapi ralat seperti ini:
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.
Pengambilan utama ialah satu-satunya pemalar dalam perisian ialah perubahan. Walau bagaimanapun, terdapat beberapa prinsip abadi yang perlu kita sentiasa ingat:
Untuk menangani isu ini, saya memutuskan untuk mencipta repositori terkini dengan semua infrastruktur yang diperlukan untuk menggunakan aplikasi Go. Terdapat dua pilihan yang tersedia:
Anda boleh GitHub mencari repositori di sini.
Infrastruktur yang tidak berubah membolehkan kami mengisytiharkan perkara yang kami mahu pada tahap yang lebih tinggi dan memastikan persekitaran pembangunan dan pengeluaran kekal sedekat mungkin. Contohnya:
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
Jangan takut untuk memfaktorkan semula jika anda mempunyai rangkaian ujian yang baik. Pemfaktoran semula adalah aktiviti penting dalam pembangunan perisian. Nama adalah penting kerana ia muncul di mana-mana dalam modul, fungsi, pakej, pembolehubah, dll.
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) }
Dalam aplikasi tanpa pelayan, ujian unit adalah penting, tetapi jangan lupa untuk memasukkan juga ujian penyepaduan, kerana kebanyakan aplikasi ini bergantung pada penyepaduan dan dasar untuk menyelesaikan masalah perniagaan.
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) } }
Seni bina tanpa pelayan sangat tersedia secara lalai dan dipacu peristiwa, mengalih keluar kebanyakan tugas operasi. Walau bagaimanapun, jika anda memilih untuk bergantung pada ECS dan bekas, adalah penting untuk menyertakan pengimbang beban untuk mengagihkan trafik antara pelayan anda, memastikan ketersediaan dan kebolehskalaan.
CompoundingLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Name: compounding-nlb Scheme: internet-facing Type: network Subnets: - !Ref PublicSubnetOne - !Ref PublicSubnetTwo
Saluran paip penempatan mengautomasikan proses penghantaran perisian. Kami mencipta Makefile untuk memudahkan proses ini, menjadikannya mudah untuk menggunakan dan melaksanakan tugas berulang dengan satu arahan. Pendekatan ini meningkatkan kecekapan dan ketekalan dalam aliran kerja penggunaan anda.
Pastikan anda mempunyai pengesanan, pengelogan dan metrik. Dengan aplikasi tanpa pelayan, mendayakan ciri ini semudah menambah Tracing: Active. Keupayaan untuk melihat semua log di tempat pusat seperti CloudWatch dan memantau interaksi perkhidmatan adalah tidak ternilai.
Keselamatan adalah terpenting dalam semua aplikasi. Menggunakan Amazon Cognito menyediakan pengesahan pengguna yang mantap, manakala kunci API menambah lapisan kawalan dan keizinan tambahan, memastikan hanya pelanggan yang diberi kuasa boleh mengakses API anda.
Auth: DefaultAuthorizer: CompoundingAuthorizer Authorizers: CompoundingAuthorizer: UserPoolArn: XXXX LambdaTokenAuthorizer: FunctionArn: !GetAtt LambdaTokenAuthorizerFunction.Arn FunctionPayloadType: REQUEST Identity: Headers: - Authorization ReauthorizeEvery: 100 AddDefaultAuthorizerToCorsPreflight: false
Tetapkan kebenaran minimum yang diperlukan kepada setiap perkhidmatan, pengguna dan komponen untuk mengurangkan permukaan serangan dan menghalang akses tanpa kebenaran. Prinsip Keistimewaan Paling Rendah:
Policies: - DynamoDBCrudPolicy: TableName: !Ref CompoundingTable
Perisian sentiasa berkembang, dan walaupun beberapa alat dan amalan akan berubah, prinsip asasnya tetap sama. Kami memerlukan infrastruktur tidak berubah, CI/CD, konvensyen penamaan yang baik, strategi ujian yang mantap, keselamatan dalam API kami dan kecekapan dalam aplikasi kami. Itulah sebabnya saya memutuskan untuk mencipta semula projek ini dengan cara tanpa pelayan.
Tidak pernah ada masa yang lebih baik untuk menjadi seorang jurutera dan mencipta nilai dalam masyarakat melalui perisian.
Jika anda menyukai artikel tersebut, lawati blog saya jorgetovar.dev
Atas ialah kandungan terperinci Bina Go Serverless REST API dan Sebarkan ke AWS menggunakan rangka kerja SAM (Amazon Linux untime). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!