Недавно 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, чтобы упростить этот процесс, упрощая развертывание и выполнение повторяющихся задач с помощью одной команды. Такой подход повышает эффективность и согласованность рабочего процесса развертывания.
Убедитесь, что у вас есть трассировка, журналирование и метрики. В бессерверных приложениях включить эти функции так же просто, как добавить Tracing: Active. Возможность видеть все журналы в одном месте, например CloudWatch, и отслеживать взаимодействие службы неоценима.
Безопасность имеет первостепенное значение во всех приложениях. Использование 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
Программное обеспечение постоянно развивается, и хотя некоторые инструменты и методы будут меняться, основополагающие принципы остаются прежними. Нам нужна неизменяемая инфраструктура, CI/CD, хорошие соглашения об именах, надежная стратегия тестирования, безопасность наших API и эффективность наших приложений. Вот почему я решил воссоздать этот проект бессерверным способом.
Никогда не было лучшего времени, чтобы стать инженером и создавать ценность для общества с помощью программного обеспечения.
Если вам понравились статьи, посетите мой блог jorgetovar.dev
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3