Рубрики
Uncategorized

Как создать функции AWS Lambda с использованием Pulumi и Golang

Я посмотрел на Пулуми, чтобы сделать кучу вещей, в том числе создание подсети в VPC, создание EKS Clus … Tagged with Go, DevOps, Serverless.

Я посмотрел на 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»