💫

AppSyncとLambda(Golang)で最低限の実装をする(Query編)

2022/08/03に公開

GoのLambdaとAppSyncについての情報があまり無かったのと、とりあえず必要最低限で何かを作ってみたい方向けの記事が無かったので書いてみました。
実装にあたりアドバイスをしてくれた弊社のYさんありがとうございました!

筆者の技術感

  • フロントエンド 3年
    • 普段はTSでNuxt触ってます
  • バックエンド 0年
    • Golang触り始めて半年くらいだけど飛び飛びなので実質一ヶ月程度
  • GraphQL 2年(もっぱら叩く専門)
  • AWS 0年
    • 飛び飛びで触ってるのであまり知識はありません。

想定している読者層

  • とりあえずLambdaとAppSync連携させてみたいけどよくわからない〜!
  • Golangちょっと触ったことがある
  • GraphQLちょっと触ったことがある
  • AWSちょっと触ったことがある
    • Lambdaちょっと触ったことがある
    • AppSyncは触ったことがない

使用するもの

  • AWS AppSync
  • AWS Lambda

作業工程

AppSyncを作成する

一から構築で開始します。DynamoDBなどと連携したり、もっと複雑なことをする場合はウィザードから作った方が楽かもしれません。
API名は好きな名前にしてください。

スキーマの編集画面で、以下のように記述、保存します。

type Query {
  getQuery(params: Req): Res
}

input Req {
  text: String
  num: Int
  textArr: [String]
}

type Res {
  resText: String
  resNum: Int
  resTextArr: [String]
}

Lambdaを作成する

一から作成で作ります。
ランタイムはGo 1.xにします。その他は特に触りません。

ランタイム設定でハンドラをこれから作る関数のファイル名と同じにしましょう。(筆者はmainに変更)

AppSyncでQueryのデータソースをLambdaに指定する

Appsyncのスキーマコンソールに戻り、右のアタッチをクリックしてください。
まずはレゾルバーの作成です。
Add datasourceをクリックするとデータソースを選択できます。

  • データソース名: 自由に決めてください
  • データソースタイプ: AWS Lambda 関数
  • リージョン: Lambdaを作成したリージョンを選択してください(筆者は東京で作ったのでAP-NORTHEAST-1
  • 関数のARN: 作成した関数名が書かれているものを選択してください
  • 既存のロールを作成または使用する: 新しいロール

    作成を押すと、再度作成ページが開くのでデータソースを作成してください。

再度最初のアタッチをクリックすると、先ほど作ったリゾルバーが選択できます。

Lambdaの関数を作る

それでは実際に関数を書いていきましょう。
Lambdaを叩くのに必要なパッケージをgetしてから書いていってください。

go get "github.com/aws/aws-lambda-go/lambda"
main.go
package main

import (
	"encoding/json"
	"fmt"

	"github.com/aws/aws-lambda-go/lambda"
)

type Res struct {
	ResText    string   `json:"resText"`
	ResNum     float64  `json:"resNum"`
	ResTextArr []string `json:"resTextArr"`
}

type Req struct {
	Text    string   `json:"text"`
	Num     float64  `json:"num"`
	TextArr []string `json:"textArr"`
}

type AppSyncParams struct {
	Arguments map[string]Req `json:"arguments"`
}

func handler(req json.RawMessage) (Res, error) {
	var reqObj AppSyncParams
	if err := json.Unmarshal(req, &reqObj); err != nil {
		return Res{}, err
	}
	params := reqObj.Arguments["params"]
	return Res{
		ResText:    params.Text,
		ResNum:     params.Num,
		ResTextArr: params.TextArr,
	}, nil
}

func main() {
	lambda.Start(handler)
}

コードを書いたら、Lambdaにアップロードできるようにします。

まずはコンパイルをします。

$ GOARCH=amd64 GOOS=linux go build -o main main.go

Intel Silliconの方はGOARCH=amd64は不要です。

次に、zip化します(Lambdaはzipでのみ直アップロード対応している)

$ zip main.zip main

完成したらLambdaにアップロードします。

AppSyncを叩いてみる

AppSyncのクエリページに移動し、実際に叩いてみましょう

無事に動きましたね!🎉 お疲れ様でした。

Discussion