はじめに

この記事は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
}
dynamoDB. Contribute to tkhs1121/go-serverless-app-2 development by creating an account on GitHub.

ハマったところ

コンパイルする際に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/