قامت AWS بإيقاف العديد من الخدمات وأوقات التشغيل مؤخرًا. وكما رأينا مع إيقاف خدمة CodeCommit المفضلة لدينا وغيرها من الخدمات المهمة، لم يعد Go1.x مدعومًا لوظائف AWS Lambda.
إذا حاولت نشر معظم البرامج التعليمية القديمة، فقد تواجه أخطاء مثل هذا:
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.
الفكرة الأساسية هي أن الثابت الوحيد في البرمجيات هو التغيير. ومع ذلك، هناك بعض المبادئ الخالدة التي يجب أن نأخذها دائمًا في الاعتبار:
لمعالجة هذه المشكلة، قررت إنشاء مستودع محدث يحتوي على جميع البنية التحتية اللازمة لنشر تطبيق Go. هناك خياران متاحان:
يمكنك العثور على المستودع هنا على GitHub.
تسمح لنا البنية التحتية غير القابلة للتغيير بالإعلان عما نريده على مستوى أعلى وتضمن بقاء بيئات التطوير والإنتاج قريبة قدر الإمكان. على سبيل المثال:
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
لا تخف من إعادة البناء إذا كان لديك مجموعة جيدة من الاختبارات. إعادة البناء هي نشاط أساسي في تطوير البرمجيات. الأسماء مهمة لأنها تظهر في كل مكان في الوحدات، والوظائف، والحزم، والمتغيرات، وما إلى ذلك.
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) }
في التطبيقات التي لا تحتوي على خادم، تعد اختبارات الوحدة مهمة، ولكن لا تنس تضمين اختبارات التكامل أيضًا، حيث تعتمد معظم هذه التطبيقات على عمليات التكامل والسياسات لحل مشكلات العمل.
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) } }
تتوفر البنى دون خادم بشكل كبير بشكل افتراضي وهي تعتمد على الأحداث، مما يؤدي إلى إزالة معظم المهام التشغيلية. ومع ذلك، إذا اخترت الاعتماد على ECS والحاويات، فمن المهم تضمين موازن التحميل لتوزيع حركة المرور بين الخوادم الخاصة بك، مما يضمن التوفر وقابلية التوسع.
CompoundingLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Name: compounding-nlb Scheme: internet-facing Type: network Subnets: - !Ref PublicSubnetOne - !Ref PublicSubnetTwo
يقوم مسار النشر بأتمتة عملية تسليم البرامج. لقد أنشأنا ملف Makefile لتبسيط هذه العملية، مما يجعل من السهل نشر المهام المتكررة وتنفيذها باستخدام أمر واحد. يعمل هذا الأسلوب على تحسين الكفاءة والاتساق في سير عمل النشر لديك.
تأكد من وجود التتبع والتسجيل والمقاييس في مكانها الصحيح. مع التطبيقات التي لا تحتوي على خادم، يعد تمكين هذه الميزات أمرًا بسيطًا مثل إضافة التتبع: نشط. إن القدرة على رؤية جميع السجلات في مكان مركزي مثل CloudWatch ومراقبة تفاعلات الخدمة أمر لا يقدر بثمن.
الأمن له أهمية قصوى في جميع التطبيقات. يوفر استخدام Amazon Cognito مصادقة قوية للمستخدم، بينما تضيف مفاتيح واجهة برمجة التطبيقات (API) طبقة إضافية من التحكم والترخيص، مما يضمن أن العملاء المصرح لهم فقط هم من يمكنهم الوصول إلى واجهات برمجة التطبيقات (APIs) الخاصة بك.
Auth: DefaultAuthorizer: CompoundingAuthorizer Authorizers: CompoundingAuthorizer: UserPoolArn: XXXX LambdaTokenAuthorizer: FunctionArn: !GetAtt LambdaTokenAuthorizerFunction.Arn FunctionPayloadType: REQUEST Identity: Headers: - Authorization ReauthorizeEvery: 100 AddDefaultAuthorizerToCorsPreflight: false
قم بتعيين الحد الأدنى من الأذونات اللازمة لكل خدمة ومستخدم ومكون لتقليل سطح الهجوم ومنع الوصول غير المصرح به. مبدأ الامتياز الأدنى:
Policies: - DynamoDBCrudPolicy: TableName: !Ref CompoundingTable
تتطور البرامج باستمرار، وعلى الرغم من أن بعض الأدوات والممارسات ستتغير، إلا أن المبادئ الأساسية تظل كما هي. نحن بحاجة إلى بنية تحتية غير قابلة للتغيير، وCI/CD، واصطلاحات تسمية جيدة، واستراتيجية اختبار قوية، وأمان في واجهات برمجة التطبيقات الخاصة بنا، وكفاءة في تطبيقاتنا. ولهذا السبب قررت إعادة إنشاء هذا المشروع بطريقة بدون خادم.
لم يكن هناك وقت أفضل من أي وقت مضى لتكون مهندسًا وتخلق قيمة في المجتمع من خلال البرمجيات.
إذا استمتعت بالمقالات، قم بزيارة مدونتي jorgetovar.dev
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3