Bina Go Serverless REST API dan Sebarkan ke AWS menggunakan rangka kerja SAM (Amazon Linux untime)

WBOY
Lepaskan: 2024-08-23 06:42:11
asal
806 orang telah melayarinya

Mengapa Tutorial Pergi Lagi

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.
Salin selepas log masuk

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:

  1. Menggunakan Fargate menggunakan bekas Docker.
  2. Menggunakan rangka kerja SAM pada AWS.

Anda boleh GitHub mencari repositori di sini.

Prinsip abadi dalam Pembangunan Perisian

  • Infrastruktur sebagai Kod adalah penting.
  • Konvensyen penamaan yang baik dalam perisian adalah penting.
  • Sentiasa uji logik anda.
  • Ketersediaan & skalabiliti
  • Deployment Pipeline sebagai mekanisme untuk mengautomasikan proses penghantaran perisian.
  • Pemerhatian Adalah Wajib.
  • Keselamatan ialah warganegara kelas pertama dalam aplikasi asli awan.
  • Go ialah pilihan terbaik untuk membina API.

Infrastruktur sebagai Kod adalah Penting

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
Salin selepas log masuk

Konvensyen Penamaan Baik dalam Perisian Adalah Kunci

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)
}
Salin selepas log masuk

Sentiasa Uji Logik Anda

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)
    }
}
Salin selepas log masuk

Ketersediaan & Kebolehskalaan

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
Salin selepas log masuk

Saluran Paip Kerahan

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.

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

Kebolehlihatan Adalah Wajib

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.

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

Keselamatan Adalah Warganegara Kelas Pertama dalam Aplikasi Cloud-Native

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
Salin selepas log masuk

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
Salin selepas log masuk

Rujukan

  1. Terraform dalam Tindakan - Penggunaan dan strategi praktikal untuk melaksanakan Terraform, alat untuk membina, mengubah dan mengurus infrastruktur.
  2. Saluran Penghantaran Berterusan

Kesimpulan

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.

  • LinkedIn
  • Twitter
  • GitHub

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan