Я посмотрел на Pulumi сделать кучу вещей, в том числе Создание подсети в VPC , Строительство кластеров EKS и Dynamodb Tables Анкет Единственное, что я еще не исследовал, это как развернуть функции AWS Lambda с использованием Pulumi, так что это именно то, о чем этот блог.
Полный проект доступен на GitHub .
Моя лямбда
Функция Lambda для этого поста довольно простая, говорит о «Привет» каковому значению переменной среды будет.
package main import ( "fmt" "os" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { val := os.Getenv("NAME") return events.APIGatewayProxyResponse{ Body: fmt.Sprintf("Hello, %s", val), StatusCode: 200, }, nil } func main() { lambda.Start(handler) }
Этот код находится в файле с именем Hello-World.go , который находится в папке под названием Привет, мир Анкет Проект Pulumi находится внутри папки под названием Пулуми Таким образом, это будет отдельная структура папок, а не столкнуться с другим кодом ваших функций Lambda. Структура папок, включая все файлы, выглядит как
├── README.md ├── go.mod ├── go.sum └── hello-world │ └── main.go ├── pulumi │ ├── Pulumi.lambdastack.yaml │ ├── Pulumi.yaml └── main.go
Создание и загрузка кода лямбда
Чтобы развернуть функцию Lambda, код также должен быть загружен. В то время как Pulumi имеет концепцию архива для создания файла ZIP, реализация GO имеет Известная проблема что делает невозможным использовать эту функцию. Вместо того, чтобы вручную создавать, застегнуть застежки и загрузку кода, вы можете немного расширить программу Pulumi, чтобы сделать все это, прежде чем программа запустится.
const ( shell = "sh" shellFlag = "-c" rootFolder = "/rootfolder/of/your/lambdaapp" ) func runCmd(args string) error { cmd := exec.Command(shell, shellFlag, args) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Dir = rootFolder return cmd.Run() }
runcmd
Метод запустит определенную команду и вернет либо ошибку, либо Ниль объект. Чтобы построить, Zip и загрузить свой код GO на S3, вы можете добавить приведенные ниже фрагменты в свой проект Pulumi. Он использует вышеупомянутую функцию для запуска трех команд, которые вы обычно скриптуете как часть вашего CI/CD или тестовой структуры. Эти команды должны быть вставлены до Пулуми. Run ()
вызывается.
if err := runCmd("GOOS=linux GOARCH=amd64 go build -o hello-world/hello-world ./hello-world"); err != nil { fmt.Printf("Error building code: %s", err.Error()) os.Exit(1) } if err := runCmd("zip -r -j ./hello-world/hello-world.zip ./hello-world/hello-world"); err != nil { fmt.Printf("Error creating zipfile: %s", err.Error()) os.Exit(1) } if err := runCmd("aws s3 cp ./hello-world/hello-world.zip s3:///hello-world.zip"); err != nil { fmt.Printf("Error creating zipfile: %s", err.Error()) os.Exit(1) }
Если эти команды не удастся, вы сможете увидеть вывод и сообщение об ошибке как часть «Диагностика» раздел в вашем терминале.
Создание роли IAM
Каждая функция Lambda, а также большинство других ресурсов AWS также нуждаются в роли IAM, чтобы иметь возможность работать. Роль IAM дает ресурсам разрешения действовать от вашего имени. Эта функция Lambda не имеет особой специфики, которую она должна сделать, кроме как иметь возможность работать. Чтобы создать роль IAM с этого разрешения, вы можете использовать приведенный ниже код. ARN ( Имя ресурса Amazon ), экспортируется так, чтобы он был виден из консоли Pulumi.
// The policy description of the IAM role, in this case only the sts:AssumeRole is needed roleArgs := &iam.RoleArgs{ AssumeRolePolicy: `{ "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": "lambda.amazonaws.com" }, "Effect": "Allow", "Sid": "" } ] }`, } // Create a new role called HelloWorldIAMRole role, err := iam.NewRole(ctx, "HelloWorldIAMRole", roleArgs) if err != nil { fmt.Printf("role error: %s\n", err.Error()) return err } // Export the role ARN as an output of the Pulumi stack ctx.Export("Role ARN", role.Arn())
Установка переменных среды
Как и в CloudFormation, Pulumi SDK позволяет создавать набор переменных среды. Это хорошо, потому что функция лямбда опирается на переменную среды, называемую «Имя» Чтобы узнать, кого приветствовать. Переменные среды — это Карта [String] интерфейс {}
Внутри Карта [String] интерфейс {}
Анкет Для этой функции Lambda это был бы приведенный ниже фрагмент.
environment := make(map[string]interface{}) variables := make(map[string]interface{}) variables["NAME"] = "WORLD" environment["variables"] = variables
Создание функции
Последний шаг. По крайней мере, для этого кода — это фактически создать функцию Lambda. S3Bucket и S3Key Имя ведра и имя файла, который вы загрузили ранее в процессе. роль. Arn () это ARN той роли, которая была создана на предыдущем шаге.
// The set of arguments for constructing a Function resource. functionArgs := &lambda.FunctionArgs{ Description: "My Lambda function", Runtime: "go1.x", Name: "HelloWorldFunction", MemorySize: 256, Timeout: 10, Handler: "hello-world", Environment: environment, S3Bucket: "", S3Key: "hello-world.zip", Role: role.Arn(), } // NewFunction registers a new resource with the given unique name, arguments, and options. function, err := lambda.NewFunction(ctx, "HelloWorldFunction", functionArgs) if err != nil { fmt.Println(err.Error()) return err } // Export the function ARN as an output of the Pulumi stack ctx.Export("Function", function.Arn())
Запуск Пулуми вверх
Со всем готовым кодом пришло время запустить Pulumi Up
и развернуть функцию лямбды в AWS. Если вам нужна более подробная информация о том, как создать проект GO для Pulumi, ознакомьтесь с это почта.
$ pulumi up Previewing update (lambda): Type Name Plan Info + pulumi:pulumi:Stack lambda-lambda create 2 messages + ├─ aws:iam:Role HelloWorldIAMRole create + └─ aws:lambda:Function HelloWorldFunction create Diagnostics: pulumi:pulumi:Stack (lambda-lambda): updating: hello-world/hello-world (deflated 49%) upload: hello-world/hello-world.zip to s3:///hello-world.zip Resources: + 3 to create Do you want to perform this update? yes Updating (lambda): Type Name Status Info + pulumi:pulumi:Stack lambda-lambda created 2 messages + ├─ aws:iam:Role HelloWorldIAMRole created + └─ aws:lambda:Function HelloWorldFunction created Diagnostics: pulumi:pulumi:Stack (lambda-lambda): updating: hello-world/hello-world (deflated 49%) upload: hello-world/hello-world.zip to s3:// /hello-world.zip Outputs: Function: "arn:aws:lambda:us-west-2:ACCOUNTID:function:HelloWorldFunction" Role ARN: "arn:aws:iam::ACCOUNTID:role/HelloWorldIAMRole-7532034" Resources: + 3 created Duration: 44s Permalink: https://app.pulumi.com/retgits/lambda/lambda/updates/1
Тестирование с консоли AWS
Внутри консоли Pulumi вы сможете увидеть созданные ресурсы.
Консоль Pulumi также имеет действительно полезные ссылки на консоль AWS, чтобы увидеть ресурсы.
В консоли AWS Lambda вы сможете проверить функцию и увидеть, что она действительно отвечает приветствием «Привет, мир» Анкет
Консоль AWS Lambda.
Оригинал: «https://dev.to/retgits/how-to-create-aws-lambda-functions-using-pulumi-and-golang-2b5e»