前提条件(環境)
2019年12月31日に試したものです。
Go 1.12.9
手順
- DynamoDBでテーブル作成
- Lambdaで動かす関数をGoで書く
- Lambda関数の作成
- 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
の方が使いやすいようです。
ソースコード
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 式で書ける
- 詳しい書き方は、公式ドキュメントが分かりやすかったです。
動作結果
参考にさせて頂いた記事
パーティション(英:partition)とは
DynamoDBのキー・インデックスについてまとめてみた
AWS Lambda で Go が使えるようになったので試してみた
気楽にDynamoDBを使おう