現在卒業制作にてとある共有サービスを作成しています。
今回CloudとしてAWSを採用しどうせ卒業制作だしGraphQL触ってみるかってことでAWS AppSyncに挑戦しています。
今回のGoのソースは
https://github.com/NozomiSugiyama/appsync-lambda-sample
にあげています。
注意!!
- AWS 3週間
- GoLang 1週間 今回が始めて
の初心者の記事です。
編集リクエストおまちしております。
AWS AppSyncとは
AppSync自体は、GraphQLを使用したBaaSになります。
GraphQLのsubscriptionにも対応しており、リアルタイム更新も簡単にできるみたい。
詳しくは、
を見てください。
オンラインエディタでGraphQL Schemaを定義していき、それぞれにResolverを割り当てていく形です。
簡単な処理であれば自分でソースを書かなくとも、Tableを用意しAppSyncのData Sourcesに追加後
上のようにAppSyncに用意されたmapping templateを記述して行けば、Lambdaを使わなくてもアプリを作ることができます。
しかし、DynamoDB以外のSourceを使用したり、細かい権限設定、特別な処理などが必要な場合にはResolverにLambdaをAttachし開発していく流れになっていきます。
今回は、
Query: AppSync -> DynamoDB
Mutation: AppSync -> Lambda -> DynamoDB
にて作成していきます。
AWS設定
まずAppSyncにて Create API
を行いSchemaの定義を行います。
今回は作成直後最初にコメントアウトされ用意されていたものを使って行きます。
type Mutation {
# Put a single value of type 'Post'.
## If an item exists it's updated. If it does not it's created.
putPost(id: ID!, title: String!): Post
}
type Post {
id: ID!
title: String!
}
type Query {
# Get a single value of type 'Post' by primary key.
singlePost(id: ID!): Post
}
schema {
query: Query
mutation: Mutation
}
GraphQLのTypeに基づき Post Tableを作成します。
Lambdaを作成します。
ロールをTemplateから作成する際は、DynamoDBへの書き込み権限を追加してください。
AppSyncに戻りData SourceにLambdaとPost Tableを追加します。
singlePost Queryに↑で作成したPostTable Data SourceをAttachします。
デフォルトで request mapping templateとresponse mapping templateが作成されるのでそのまま使います。
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
}
}
$util.toJson($ctx.result)
putPost MutationにはAppSync Lambda Data SourceをAttachします。
こちらも同様にrequest mapping templateとresponse mapping templateが作成されるのでそのまま使います。
{
"version" : "2017-02-28",
"operation": "Invoke",
"payload": $util.toJson($context.args)
}
$util.toJson($context.result)
ソース
package main
import (
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/aws/session"
)
type Post struct {
ID string `json:"id"`
Title string `json:"title"`
}
func hander(arg Post) (Post, error) {
input := &dynamodb.PutItemInput{
Item: map[string]*dynamodb.AttributeValue{
"id": {
S: aws.String(arg.ID),
},
"title": {
S: aws.String(arg.Title),
},
},
TableName: aws.String("post"),
}
session, err := session.NewSession(
&aws.Config{Region: aws.String("ap-northeast-1")},
)
if err != nil {
return Post{}, err
}
svc := dynamodb.New(session)
_, err = svc.PutItem(input)
return arg, nil
}
func main() {
lambda.Start(hander)
}
aws-sdk-goを使用して作成しました。
Lambdaの返り値を忘れずに。
その後
GOOS=linux GOARCH=amd64 go build -o main
zip handler.zip ./main
buildしてzipに圧縮し
LambdaにUploadします。
このとき ハンドラ をmain
に変更します。
これで完成です!
実際にテストして見ましょう。
テスト
AppSyncのQueriesタブから実行できます。
Mutation
Query
データの追加と取得ができています!
まとめ
AppSyncのData SourceとしてLambdaを使用してみたけど、そんなに難しいことなく簡単に作れたのでよかったです。
ある程度しっかりしたアプリを作るにはLambdaがまだ必須な気がしますが、まだ本番提供開始してからまもないのでこれからの新機能が楽しみです!