【Golang+Lambda+CloudWatch】에서 Dynamodb에 데이터 삽입을 정기 실행



전제조건(환경)



2019년 12월 31일에 시도했습니다.
Go 1.12.9

절차


  • DynamoDB에서 테이블 만들기
  • Lambda에서 움직이는 함수를 Go로 작성합니다.
  • Lambda 함수 만들기
  • Lambda 함수의 트리거로 CloudWatch Events 설정

  • 1.DynamoDB로 테이블 만들기



    입력하는 항목은 3개!


    품목
    입력한 내용


    테이블 이름
    음악

    파티션 키
    Artist

    정렬 키
    송타이틀


    파티션 키란?



    우선 파티션이란, 하드 디스크내의 단락지어진 영역을 말한다.
    그리고 Dynamodb의 데이터는 여러 파티션에 분산되어 저장되므로 어떤 파티션에 있는지 구별하기 위해 키가 필요합니다.

    정렬 키란?



    같은 파티션에서 데이터를 재배열하는 데 사용하는 키.

    ※테이블 작성은, 공식 튜토리얼 가 알기 쉬웠습니다.

    2. Lambda에서 움직이는 함수를 Go로 작성



    라이브러리 설치



    크게 나누어 두 개의 라이브러리를 사용합니다.
    · 공식 aws-sdk-go· guregu/dynamo
    ※Dynamodb의 데이터 조작은, aws-sdk-go 하지만 할 수 있지만, guregu/dynamo 쪽이 사용하기 쉬운 것 같습니다.

    소스 코드



    hello.go
    package main
    
    import (
        "log"
        "math/rand"
        "strconv"
        "time"
    
        "github.com/aws/aws-lambda-go/lambda"
        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/credentials"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/guregu/dynamo"
    )
    
    type Music struct {
        Artist    string `dynamo:"Artist"`    //パーティションキー
        SongTitle string `dynamo:"SongTitle"` //ソートキー
    }
    
    func hello() {
        // 大きな流れ:認証情報(IAMで取得)→セッション→dynamoDB
        creds := credentials.NewStaticCredentials("AWS_ACCESS_KEY", "AWS_SECRET_ACCESS_KEY", "") //第3引数はtoken
    
        sess, _ := session.NewSession(&aws.Config{
            Credentials: creds,
            Region:      aws.String("ap-northeast-1")},
        )
    
        db := dynamo.New(sess)
        table := db.Table("Music") //テーブル名
        // 入れるデータ
        rand.Seed(time.Now().UnixNano())
        songTitle := "バレない程度にパクったメロディ~パート" + strconv.Itoa(rand.Intn(1000))
        music := Music{Artist: "イケメン風の人", SongTitle: songTitle}
        log.Println(music)
        // データ挿入
        if err := table.Put(music).Run(); err != nil {
            log.Println(err.Error())
        } else {
            log.Println("成功!")
        }
    }
    
    func main() {
        // ラムダ実行
        lambda.Start(hello)
        // ローカルでテストする用
        // hello()
    }
    

    빌드 (크로스 컴파일)하여 zip 파일로 만듭니다.



    Lambda에서 실행하려면 일반적으로 go build하는 대신 Linux에서도 작동하도록 크로스 컴파일 설정을 추가해야합니다.
    $ GOOS=linux GOARCH=amd64 go build -o hello
    $ zip handler.zip ./hello
    

    3.Lambda 함수 만들기



    Lambda 콘솔에서 "함수 만들기"
  • 처음부터 작성
  • 런타임: Go 1.x
  • 함수 코드 핸들러 "hello"(Go로 만든 함수 이름과 일치)
  • 위에서 만든 handler.zip 업로드

  • 4. Lambda 함수의 트리거로 CloudWatch Events 설정



    Lambda 콘솔에서 "트리거 추가"


    설정 항목
    설정한 내용


    트리거
    CloudWatch 이벤트

    규칙
    새 규칙 만들기

    규칙 유형
    스케줄 표현

    스케줄 표현
    rate(5 minutes)


    시험에 5 분마다 정기 실행하도록 설정
  • 스케줄 표현식은 cron 또는 rate 표현식으로 작성할 수 있습니다.
  • 자세한 쓰는 방법은 공식 문서 을 알기 쉬웠습니다.

  • 동작 결과



    15분 후


    참고로 한 기사



    파티션(영어: partition)이란?
    DynamoDB의 키 인덱스에 대해 정리해 보았습니다.
    AWS Lambda에서 Go를 사용할 수 있기 때문에 시도했습니다.
    편하게 DynamoDB를 사용합시다.

    좋은 웹페이지 즐겨찾기