Help us understand the problem. What is going on with this article?

AppSyncのLambda ResolverをGoで書く。

More than 1 year has passed since last update.

現在卒業制作にてとある共有サービスを作成しています。

今回CloudとしてAWSを採用しどうせ卒業制作だしGraphQL触ってみるかってことでAWS AppSyncに挑戦しています。

今回のGoのソースは
https://github.com/NozomiSugiyama/appsync-lambda-sample
にあげています。

注意!!

  • AWS 3週間
  • GoLang 1週間 今回が始めて

の初心者の記事です。
編集リクエストおまちしております。

AWS AppSyncとは

AppSync自体は、GraphQLを使用したBaaSになります。

GraphQLのsubscriptionにも対応しており、リアルタイム更新も簡単にできるみたい。

詳しくは、

を見てください。

Screen Shot 2018-06-22 at 17.56.45.png

オンラインエディタでGraphQL Schemaを定義していき、それぞれにResolverを割り当てていく形です。

簡単な処理であれば自分でソースを書かなくとも、Tableを用意しAppSyncのData Sourcesに追加後
Screen Shot 2018-06-22 at 18.02.15.png

上のようにAppSyncに用意されたmapping templateを記述して行けば、Lambdaを使わなくてもアプリを作ることができます。
しかし、DynamoDB以外のSourceを使用したり、細かい権限設定、特別な処理などが必要な場合にはResolverにLambdaをAttachし開発していく流れになっていきます。

今回は、
Query: AppSync -> DynamoDB
Mutation: AppSync -> Lambda -> DynamoDB
にて作成していきます。

AWS設定

まずAppSyncにて Create API を行いSchemaの定義を行います。
Screen Shot 2018-06-22 at 19.23.32.png
今回は作成直後最初にコメントアウトされ用意されていたものを使って行きます。 

schema.graphql
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を作成します。
Screen Shot 2018-06-22 at 23.40.30.png

Lambdaを作成します。
Screen Shot 2018-06-22 at 22.26.26.png
ロールをTemplateから作成する際は、DynamoDBへの書き込み権限を追加してください。

AppSyncに戻りData SourceにLambdaとPost Tableを追加します。
Screen Shot 2018-06-22 at 22.47.08.png

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)

ソース

main.go
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に圧縮し
Screen Shot 2018-06-22 at 22.36.28.png
LambdaにUploadします。
このとき ハンドラ をmainに変更します。

これで完成です!
実際にテストして見ましょう。

テスト

AppSyncのQueriesタブから実行できます。

Mutation

Screen Shot 2018-06-22 at 23.43.29.png

Query

Screen Shot 2018-06-22 at 23.45.05.png

データの追加と取得ができています!

まとめ

AppSyncのData SourceとしてLambdaを使用してみたけど、そんなに難しいことなく簡単に作れたのでよかったです。
ある程度しっかりしたアプリを作るにはLambdaがまだ必須な気がしますが、まだ本番提供開始してからまもないのでこれからの新機能が楽しみです!

rioc
test
wh-plus
「日々の生活と心にゆとりと豊かさ」を生むためのサービスを提供している会社です。
https://www.wh-plus.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away