AWSLambda가 Go 언어에 대응했기 때문에 DynamoDB와 관련시키면서 데모 해 보았습니다.

13314 단어 5람다DynamoDBAWS

소개



작년 Re:Invent에서 「내년 이른 시기에 Lambda가 Go에 대응할게!」라고 발표된 때는, 왔을까! 라는 기분이 되었습니다.
목을 길게 해 기다리고 있으면, 오늘 서포트했다고 발표가 있었으므로 조속히 시험해 보았습니다.

데모 demo



평소 Node.js를 사용하여 Lambda+DynamoDB의 구성을 짜고 있으므로, 이번에도 DynamoDB를 관련시켜 데모해 보았습니다.

공식이 내고 있다 기사 를 참고해 주시면 됩니다만,
현재 지원되는 버전은 1.x입니다.
기본 배포 흐름은
1. Go 쓰기
2. Linux용으로 빌드하기
3. zip으로 업로드
라는 흐름이 된다고 생각합니다.

Go 쓰기



기본형은 아래와 같은 느낌입니다.
package main

import (
    "github.com/aws/aws-lambda-go/lambda"
    "fmt"
)

type Response struct {
    Message string `json:"message"`
    Ok      bool   `json:"ok"`
}

func Handler() (Response, error) {
    // 処理部分
}

func main() {
    lambda.Start(Handler)
}
lambda.Start(Handler)에서 Lambda 처리를 수행합니다.
왠지 조금 위화감이 있는 것은 나뿐일까요…
그래서, Handler 속에 실제의 처리를 써 가는 느낌이 됩니다.

DynamoDB(GetItem, PutItem, Query)



aws-sdk for go를 사용하여 DynamoDB에 요청을 보냅니다.
위의 소스 코드에 추가한 것이 아래와 같습니다.
package main

import (
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/dynamodb"
    "github.com/aws/aws-lambda-go/lambda"
    "fmt"
)

type Response struct {
    Message string `json:"message"`
    Ok      bool   `json:"ok"`
}

func Handler() (Response, error) {
    // session
    sess, err := session.NewSession()
    if err != nil {
        panic(err)
    }

    svc := dynamodb.New(sess)

    // GetItem
    getParams := &dynamodb.GetItemInput{
        TableName: aws.String("go-demo"),
        Key: map[string]*dynamodb.AttributeValue{
            "id": {
                S: aws.String("1"),
            },
        },
    }

    getItem, getErr := svc.GetItem(getParams)
    if getErr != nil {
        panic(getErr)
    }
    fmt.Println(getItem)

    // PutItem
    putParams := &dynamodb.PutItemInput{
        TableName: aws.String("go-demo"),
        Item: map[string]*dynamodb.AttributeValue{
            "id": {
                S: aws.String("2"),
            },
            "name": {
                S: aws.String("hoge"),
            },
        },
    }

    putItem, putErr := svc.PutItem(putParams)
    if putErr != nil {
        panic(putErr)
    }
    fmt.Println(putItem)

    // Query
    queryParams := &dynamodb.QueryInput{
        TableName: aws.String("go-demo"),
        KeyConditionExpression: aws.String("#ID=:id"),
        ExpressionAttributeNames: map[string]*string{
            "#ID": aws.String("id"),
        },
        ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
            ":id": {
                S: aws.String("1"),
            },
        },
    }

    queryItem, queryErr := svc.Query(queryParams)
    if queryErr != nil {
        panic(queryErr)
    }
    fmt.Println(queryItem)

    return Response{
        Message: fmt.Sprintln(getItem.Item),
        Ok:      true,
    }, nil
}

func main() {
    lambda.Start(Handler)
}


GetItem으로 돌아오는 응답은 이런 느낌
{
  Item: {
    id: {
      S: "1"
    },
    name: {
      S: "test"
    }
  }
}

Query로 돌아오는 응답은 이런 느낌
{
  Count: 1,
  Items: [{
      id: {
        S: "1"
      },
      name: {
        S: "test"
      }
    }],
  ScannedCount: 1
}

빌드하고 zip으로 고정


$ go build -o main.go
$ zip deployment.zip main

linux용으로 빌드하지 않으면 안 되므로, mac의 분은 아래와 같이 실행하고 나서 zip에 굳혀 주세요.
$ GOOS=linux go build -o main

Lambda에 배포



Lambda 콘솔에서 새 함수를 만들고 런타임 Go 1.x을 선택합니다.
첨부하는 롤에는 이번에는 DynamoDB 관계의 권한도 잊지 않고.


함수가 생성되면 방금 만든 Zip 파일을 업로드하면 완료됩니다.


이제 Go를 사용하여 DynamoDB 데이터를 조작 할 수 있습니다!

후기



솔직히 Go 언어는 거의 만지지 않았기 때문에, 소스 코드는 왔다고 생각합니다만 양해 바랍니다.
Node.js의 감각으로 구현하면 움직이는 느낌입니다 ... (땀)

Node.js에서 구현하고 있다면 "싱글 스레드가 아신도 ..."라고 느끼고있을 때도 있습니다.
Go 언어는 Node.js와 달리 병렬 처리에 뛰어나므로, 케이스 바이 케이스에서 "Node.js보다 Go가 더 낫지?"없으면 실감했습니다.

그럼 또!

좋은 웹페이지 즐겨찾기