Fargateで動くSIM残容量をLINE通知システム DynamoDBから値の取得編
概要
DockerコンテナからDynamoDBへアクセスして最新値を取ってくる部分の説明
大本はFargateで動くSIM残容量をLINE通知システム 概要編
コード全文
DynamoDBのテーブル
LambdaでスクレイピングしてSIMの残量を保存しています
確認した日付(check_date
)をキーに、残用容量(remainig_capacity
)のシンプルなキーバリューのテーブルです
SQSのキュー
キューに入れられればそれで良かったので標準的なキュー設定です
DynamoDBから取り出し、SQSへ入れる
要所要所の解説
DynamoDBとのセッション
セッション
を作成
資格情報は自端末では~/.aws/credentials
から取得し、
Fargateで実行する際はECSのタスクに割り当てたIAMロールの権限で実行することになります
|
|
DynamoDBからデータ取得
検索キー
検索キーになるのはDynamoDBのパーティションキー
文字列の日付(YYYY-MM-DD)で登録されています
最新の値が欲しいので今日の日付を整形してkeyDay
に入れます
2006年1月2の謎
なぜ2006年に意味があると思わず、最初は2020-01-01
を指定したらダメでした
では一体この2006年1月2日という特別な日は、なんの日なのか?
(…中略…)
答えは単純だ。これはアメリカ式の時刻の順番なのだ。”1月2日午後3時4分5秒2006年”(つまり「自然な順番」で1, 2, 3, 4, 5, 6)を指しているのである。
|
|
検索
GetItem
parms
にパラメータをセットして、GetItem
に渡しています
パラメータ
GetItemInput
TableName
はDynamoDBのテーブル名をそのまま
check_date
はDynamoDBのプライマリキーでJson形式で検索したい値を指定すれば値を取得できます
正直、Key: map[string]*dynamodb.AttributeValue{
を理解できてはいないのです…
急にでてくる大文字のS
はString
を表しています
S
An attribute of type String. For example:
“S”: “Hello”
Type: String
Required: No
|
|
取得した値のUnmarshal
小分けにして説明をしていく
|
|
取得した値はresp.Item
の中に入っています
dynamodbattribute
dynamodbattribute.UnmarshalMap
は、dynamodbattribute
をGoの型に変換します
DmmData(構造体)のポインタ型(メモリアドレス)を初期化してdmm
へ格納
|
|
初期化しているため、fmt.Println
でdmm
を表示すると
|
|
ここの挙動を正しく理解できていないのですが、dmm
内にDynamoDBからヒットした結果を格納してくれます
res.Item,
の後はポインタ型を要求されるため、先程ポインタ型でdmm
に構造体の型を初期化しました
|
|
補足
dmm
をポインタ型にしなかった場合のエラー
|
|
fmt.Println
でdmm
を表示すると検索結果が格納されています
|
|
dmm
構造体をJsonに変換しています
*dmm
指定でデリファレンスする必要ないのかと思ったのですが、
どっちを指定しても意図したJsonが返ってきます…
|
|
出力結果
DynamoDBから最新値をJson形式で取得することができました
{"check_date":"2020-02-16","remainig_capacity":4770}
感想
DynamoDBのSDKはポインタが多くて把握できていないので、
Goの勉強もかねて解説していきたいです。
次回は今回取得した値をSQSに格納する部分を予定
参考
https://qiita.com/ezaki/items/2a9f10c53d958070ca95
https://qiita.com/sakayuka/items/4af7fead94d589716f4d