1
Help us understand the problem. What are the problem?

posted at

updated at

Organization

AmazonのURLをひたすらDynamoDBに登録するだけのAPIをLambda Function URLsでつくった

はじめに

この記事は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が出来上がる予定。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?