LoginSignup
2
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-06-16

はじめに

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1