"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > إنشاء واجهات برمجة تطبيقات Go Serverless REST ونشرها على AWS باستخدام إطار عمل SAM (Amazon Linux untime)

إنشاء واجهات برمجة تطبيقات Go Serverless REST ونشرها على AWS باستخدام إطار عمل SAM (Amazon Linux untime)

تم النشر بتاريخ 2024-11-08
تصفح:954

لماذا يذهب آخر البرنامج التعليمي

قامت 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. هناك خياران متاحان:

  1. النشر باستخدام Fargate باستخدام حاويات Docker.
  2. النشر باستخدام إطار عمل SAM على AWS.

يمكنك العثور على المستودع هنا على GitHub.

المبادئ الخالدة في تطوير البرمجيات

  • البنية التحتية كتعليمات برمجية ضرورية.
  • تعد اصطلاحات التسمية الجيدة في البرامج أمرًا بالغ الأهمية.
  • اختبر منطقك دائمًا.
  • التوفر وقابلية التوسع
  • خط أنابيب النشر كآلية لأتمتة عملية تسليم البرامج.
  • قابلية الملاحظة إلزامية.
  • يعتبر Security مواطنًا من الدرجة الأولى في التطبيقات السحابية الأصلية.
  • يعد Go خيارًا ممتازًا لبناء واجهات برمجة التطبيقات.

البنية التحتية كرمز أمر ضروري

تسمح لنا البنية التحتية غير القابلة للتغيير بالإعلان عما نريده على مستوى أعلى وتضمن بقاء بيئات التطوير والإنتاج قريبة قدر الإمكان. على سبيل المثال:

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 لتبسيط هذه العملية، مما يجعل من السهل نشر المهام المتكررة وتنفيذها باستخدام أمر واحد. يعمل هذا الأسلوب على تحسين الكفاءة والاتساق في سير عمل النشر لديك.

Build Go Serverless REST APIs and Deploy to AWS using the SAM framework (Amazon Linux untime)

القدرة على الملاحظة إلزامية

تأكد من وجود التتبع والتسجيل والمقاييس في مكانها الصحيح. مع التطبيقات التي لا تحتوي على خادم، يعد تمكين هذه الميزات أمرًا بسيطًا مثل إضافة التتبع: نشط. إن القدرة على رؤية جميع السجلات في مكان مركزي مثل CloudWatch ومراقبة تفاعلات الخدمة أمر لا يقدر بثمن.

Build Go Serverless REST APIs and Deploy to AWS using the SAM framework (Amazon Linux untime)

الأمان هو مواطن من الدرجة الأولى في التطبيقات السحابية الأصلية

الأمن له أهمية قصوى في جميع التطبيقات. يوفر استخدام 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

مراجع

  1. Terraform في العمل - الاستخدامات والاستراتيجيات العملية لتنفيذ Terraform، وهي أداة لبناء البنية التحتية وتغييرها وإدارتها.
  2. خطوط أنابيب التسليم المستمر

خاتمة

تتطور البرامج باستمرار، وعلى الرغم من أن بعض الأدوات والممارسات ستتغير، إلا أن المبادئ الأساسية تظل كما هي. نحن بحاجة إلى بنية تحتية غير قابلة للتغيير، وCI/CD، واصطلاحات تسمية جيدة، واستراتيجية اختبار قوية، وأمان في واجهات برمجة التطبيقات الخاصة بنا، وكفاءة في تطبيقاتنا. ولهذا السبب قررت إعادة إنشاء هذا المشروع بطريقة بدون خادم.

لم يكن هناك وقت أفضل من أي وقت مضى لتكون مهندسًا وتخلق قيمة في المجتمع من خلال البرمجيات.

  • لينكد إن
  • تغريد
  • جيت هاب

إذا استمتعت بالمقالات، قم بزيارة مدونتي jorgetovar.dev

بيان الافراج يتم استنساخ هذه المقالة على: https://dev.to/aws-builders/build-go-serverless-rest-apis-and-deploy-to-aws-using-the-sam-framework- amazon-linux-2-runtime-4n5p؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بالدراسة.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3