はじめに
この記事はLambda(Function URLs)とDynamoDBと連携させる内容となっています。
前回の記事の続きとなっているため同様の手順は省略しています。
GoでLambda Function URLs ハンズオン
https://cloudpack.media/62107
環境
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 *.go
にする必要がある。
*https://yatta47.hateblo.jp/entry/2020/03/18/000000
動作確認
Lambdaのコンソール上でテストする場合はこうする。
{ "body": "{\"url\": \"https://www.amazon.co.jp\"}" }
最後に
所々粗があるので次回にリファクタリングする。
記事の更新を重ねて最終的にはちょっとしたSNSが出来上がる予定。
元記事はこちら
AmazonのURLをひたすらDynamoDBに登録するだけのAPIをLambda Function URLsでつくった
著者:@tkhs1121
アイレットなら、AWS で稼働するサーバーを対象とした監視・運用・保守における煩わしい作業をすべて一括して対応し、経験豊富なプロフェッショナルが最適なシステム環境を実現いたします。AWS プレミアコンサルティングパートナーであるアイレットに、ぜひお任せください。
AWS 運用・保守サービスページ
その他のサービスについてのお問合せ、お見積り依頼は下記フォームよりお気軽にご相談ください。
https://cloudpack.jp/contact/form/