«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создавайте бессерверные REST API Go и развертывайте их на AWS с помощью платформы SAM (Amazon Linux untime)

Создавайте бессерверные REST API Go и развертывайте их на AWS с помощью платформы SAM (Amazon Linux untime)

Опубликовано 18 сентября 2024 г.
Просматривать:291

Зачем еще одно руководство по Go

Недавно 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 здесь.

Вечные принципы разработки программного обеспечения

  • Инфраструктура как Кодекс имеет важное значение.
  • Правильные соглашения об именах в программном обеспечении имеют решающее значение.
  • Всегда проверяйте свою логику.
  • Доступность и масштабируемость
  • Конвейер развертывания как механизм автоматизации процесса доставки программного обеспечения.
  • Наблюдаемость обязательна.
  • Безопасность — это первоочередная задача облачных приложений.
  • Go — отличный вариант для создания API.

Инфраструктура как код имеет важное значение

Неизменяемая инфраструктура позволяет нам заявлять о том, что мы хотим, на более высоком уровне и гарантирует, что среды разработки и производства остаются максимально близкими. Например:

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)

Наблюдаемость обязательна

Убедитесь, что у вас есть трассировка, журналирование и метрики. В бессерверных приложениях включить эти функции так же просто, как добавить Tracing: Active. Возможность видеть все журналы в одном месте, например CloudWatch, и отслеживать взаимодействие службы неоценима.

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

Безопасность — первостепенная задача в облачных приложениях

Безопасность имеет первостепенное значение во всех приложениях. Использование Amazon Cognito обеспечивает надежную аутентификацию пользователей, а ключи API добавляют дополнительный уровень контроля и авторизации, гарантируя, что только авторизованные клиенты смогут получить доступ к вашим API.

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, хорошие соглашения об именах, надежная стратегия тестирования, безопасность наших API и эффективность наших приложений. Вот почему я решил воссоздать этот проект бессерверным способом.

Никогда не было лучшего времени, чтобы стать инженером и создавать ценность для общества с помощью программного обеспечения.

  • LinkedIn
  • Твиттер
  • GitHub

Если вам понравились статьи, посетите мой блог 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], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3