💫
AppSyncとLambda(Golang)で最低限の実装をする(Query編)
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