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

![lambda(qiita) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415008/669041a3-2afc-26e9-644e-a6989ba53ab9.png)
##前提条件（環境）
2019年12月31日に試したものです。
Go 1.12.9

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

#1.DynamoDBでテーブル作成
入力する項目は３つ！

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

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

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

※テーブル作成は、[公式チュートリアル](https://aws.amazon.com/jp/getting-started/tutorials/create-nosql-table/)が分かりやすかったです。

#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", "") //第３引数は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上でも動作するようにクロスコンパイルの設定を追加する必要がある

```terminal
$ 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)|

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

+ 「スケジュール式」は、cron または rate 式で書ける
+ 詳しい書き方は、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html)が分かりやすかったです。

##動作結果
15分後
<img width="778" alt="スクリーンショット 2019-12-31 15.27.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415008/e5c795ac-2843-4f84-6028-6a5d61c91831.png">



##参考にさせて頂いた記事
[パーティション（英：partition）とは](https://wa3.i-3-i.info/word1724.html)
[DynamoDBのキー・インデックスについてまとめてみた](https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd)
[AWS Lambda で Go が使えるようになったので試してみた](https://dev.classmethod.jp/cloud/aws/aws-lambda-supports-go/)
[気楽にDynamoDBを使おう](https://qiita.com/guregu/items/2e9ac305791935b86f5d)