"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > गो सर्वर रहित REST API बनाएं और SAM फ्रेमवर्क (अमेज़ॅन लिनक्स अनटाइम) का उपयोग करके AWS पर तैनात करें

गो सर्वर रहित REST API बनाएं और SAM फ्रेमवर्क (अमेज़ॅन लिनक्स अनटाइम) का उपयोग करके AWS पर तैनात करें

2024-09-18 को प्रकाशित
ब्राउज़ करें:600

एक और गो ट्यूटोरियल क्यों

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.

मुख्य बात यह है कि सॉफ्टवेयर में एकमात्र स्थिरांक परिवर्तन है। हालाँकि, कुछ कालातीत सिद्धांत हैं जिन्हें हमें हमेशा ध्यान में रखना चाहिए:

इस समस्या के समाधान के लिए, मैंने गो एप्लिकेशन को तैनात करने के लिए आवश्यक सभी बुनियादी ढांचे के साथ एक अद्यतन रिपॉजिटरी बनाने का निर्णय लिया। दो विकल्प उपलब्ध हैं:

  1. डॉकर कंटेनरों का उपयोग करके फ़ार्गेट के साथ तैनाती।
  2. एडब्ल्यूएस पर एसएएम ढांचे का उपयोग करके तैनाती।

आप 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)
    }
}

उपलब्धता एवं मापनीयता

सर्वर रहित आर्किटेक्चर डिफ़ॉल्ट रूप से अत्यधिक उपलब्ध होते हैं और इवेंट-संचालित होते हैं, जो अधिकांश परिचालन कार्यों को हटा देते हैं। हालाँकि, यदि आप ईसीएस और कंटेनरों पर भरोसा करना चुनते हैं, तो उपलब्धता और स्केलेबिलिटी दोनों सुनिश्चित करते हुए, अपने सर्वर के बीच ट्रैफ़िक वितरित करने के लिए एक लोड बैलेंसर शामिल करना महत्वपूर्ण है।

  CompoundingLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: compounding-nlb
      Scheme: internet-facing
      Type: network
      Subnets:
        - !Ref PublicSubnetOne
        - !Ref PublicSubnetTwo

परिनियोजन पाइपलाइन

एक परिनियोजन पाइपलाइन सॉफ़्टवेयर वितरण प्रक्रिया को स्वचालित करती है। हमने इस प्रक्रिया को सरल बनाने के लिए एक मेकफ़ाइल बनाया, जिससे एक ही कमांड के साथ दोहराए जाने वाले कार्यों को तैनात करना और निष्पादित करना आसान हो गया। यह दृष्टिकोण आपके परिनियोजन वर्कफ़्लो में दक्षता और स्थिरता को बढ़ाता है।

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

अवलोकनशीलता अनिवार्य है

सुनिश्चित करें कि आपके पास ट्रेसिंग, लॉगिंग और मेट्रिक्स मौजूद हैं। सर्वर रहित अनुप्रयोगों के साथ, इन सुविधाओं को सक्षम करना ट्रेसिंग: एक्टिव को जोड़ने जितना ही सरल है। क्लाउडवॉच जैसे केंद्रीय स्थान पर सभी लॉग देखने और सेवा की इंटरैक्शन की निगरानी करने की क्षमता अमूल्य है।

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

क्लाउड-नेटिव एप्लिकेशन में सुरक्षा प्रथम श्रेणी का नागरिक है

सभी एप्लिकेशन में सुरक्षा सर्वोपरि है। अमेज़ॅन कॉग्निटो का उपयोग मजबूत उपयोगकर्ता प्रमाणीकरण प्रदान करता है, जबकि एपीआई कुंजी नियंत्रण और प्राधिकरण की एक अतिरिक्त परत जोड़ती है, जिससे यह सुनिश्चित होता है कि केवल अधिकृत ग्राहक ही आपके एपीआई तक पहुंच सकते हैं।

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. टेराफॉर्म इन एक्शन - टेराफॉर्म को लागू करने के लिए व्यावहारिक उपयोग और रणनीतियाँ, बुनियादी ढांचे के निर्माण, परिवर्तन और प्रबंधन के लिए एक उपकरण।
  2. निरंतर वितरण पाइपलाइन

निष्कर्ष

सॉफ्टवेयर लगातार विकसित हो रहा है, और हालांकि कुछ उपकरण और प्रथाएं बदल जाएंगी, लेकिन मूलभूत सिद्धांत वही रहेंगे। हमें अपरिवर्तनीय बुनियादी ढांचे, सीआई/सीडी, अच्छी नामकरण परंपराएं, एक मजबूत परीक्षण रणनीति, हमारे एपीआई में सुरक्षा और हमारे अनुप्रयोगों में दक्षता की आवश्यकता है। इसीलिए मैंने इस प्रोजेक्ट को सर्वर रहित तरीके से फिर से बनाने का निर्णय लिया।

एक इंजीनियर बनने और सॉफ्टवेयर के माध्यम से समाज में मूल्य पैदा करने का इससे बेहतर समय कभी नहीं रहा।

  • लिंक्डइन
  • ट्विटर
  • गिटहब

यदि आपको लेख पसंद आए, तो मेरे ब्लॉग gorgetovar.dev पर जाएं

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/aws-builders/build-go-serverless-rest-apis-and-deploy-to-aws-using-the-sam-framework-amazon-linux-2- रनटाइम- 4एन5पी?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.कॉम से संपर्क करें
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3