はじめに
この記事はLambda(Function URLs)とDynamoDBと連携させる内容となっています。
前回の記事の続きとなっているため同様の手順は省略しています。
環境
MacBook Air M1
開発言語 Go
追加で必要なパッケージのインストール
go get -u github.com/aws/aws-sdk-go
ソースコード
main.go
func HandleRequest(ctx context.Context, payload Payload) error {
url, err := parseRequest(payload)
if err != nil {
return err
}
isAmazonURL, err := checkAmazonURL(url)
if err != nil {
return err
}
if !isAmazonURL {
return fmt.Errorf("this is not amazon url: %v: %v", err, url)
}
db := new(DB)
if err := db.newDynamoDB(); err != nil {
return err
}
if err := db.putItem(url); err != nil {
return err
}
return nil
}
URLの取り出しとバリデーション
この部分は前回の記事のコードを再利用しています。
commmon.go
func parseRequest(payload Payload) (string, error) {
var req Request
err := json.NewDecoder(strings.NewReader(payload.Body)).Decode(&req)
if err != nil {
return "", fmt.Errorf("cannot decode payload: %v: %v", err, payload.Body)
}
return req.URL, nil
}
func checkAmazonURL(url string) (bool, error) {
return regexp.MatchString(`^http(s)?://(www.)?amazon.(co.)?jp[\w!\?/\+\-_~=;\.,\*&@#\$%\(\)'\[\]]*`, url)
}
DynamoDBとの連携
infura.go
func (db *DB) newDynamoDB() error {
sess, err := session.NewSession()
if err != nil {
return err
}
db.DDB = dynamodb.New(sess)
return nil
}
func (db *DB) putItem(url string) error {
rand.Seed(time.Now().UnixNano())
randID := strconv.Itoa(rand.Intn(100))
epoch := strconv.FormatInt(time.Now().Unix(), 10)
input := &dynamodb.PutItemInput{
TableName: aws.String("table"),
Item: map[string]*dynamodb.AttributeValue{
"id": {
N: aws.String(randID),
},
"time": {
N: aws.String(epoch),
},
"url": {
S: aws.String(url),
},
},
}
if _, err := db.DDB.PutItem(input); err != nil {
return err
}
return nil
}
ハマったところ
コンパイルする際にmain.goのみを指定するとgo undefinedエラーが出るので、
GOARCH=amd64 GOOS=linux go build -o main *.go
にする必要がある。
*https://yatta47.hateblo.jp/entry/2020/03/18/000000
動作確認
Lambdaのコンソール上でテストする場合はこうする。
{
"body": "{\"url\": \"https://www.amazon.co.jp\"}"
}
最後に
所々粗があるので次回にリファクタリングする。
記事の更新を重ねて最終的にはちょっとしたSNSが出来上がる予定。