【Golang+Lambda+CloudWatch】で、Dynamodbへのデータ挿入を定期実行


前提条件(環境)

2019年12月31日に試したものです。
Go 1.12.9

手順

  1. DynamoDBでテーブル作成
  2. Lambdaで動かす関数をGoで書く
  3. Lambda関数の作成
  4. Lambda関数のトリガーとしてCloudWatch Eventsを設定

1.DynamoDBでテーブル作成

入力する項目は3つ!

項目 入力した内容
テーブル名 Music
パーティションキー Artist
ソートキー SongTitle

パーティションキーとは

まずパーティションとは、ハードディスク内の区切られた領域のこと。
そして、Dynamodbのデータは、複数のパーティションに分散され保存されるので、どのパーティションにあるか区別するためにキーが必要。

ソートキーとは

同じパーティションの中で、データを並び替えたりするのに使うキー。

※テーブル作成は、公式チュートリアルが分かりやすかったです。

2. Lambdaで動かす関数をGoで書く

ライブラリのインストール

大きく分けて、2つのライブラリを使います。
・公式の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 Events
ルール 新規ルールの作成
ルールタイプ スケジュール式
スケジュール式 rate(5 minutes)

試しに、5分ごとに定期実行するように設定

  • 「スケジュール式」は、cron または rate 式で書ける
  • 詳しい書き方は、公式ドキュメントが分かりやすかったです。

動作結果

15分後

参考にさせて頂いた記事

パーティション(英:partition)とは
DynamoDBのキー・インデックスについてまとめてみた
AWS Lambda で Go が使えるようになったので試してみた
気楽にDynamoDBを使おう