この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ojichatをAPI化する必要があったため、AWS SAMを利用してサーバーレスな構成で実装してみました。
概要
ojichat とは、READMEにも書かれているとおり、「おじさんがLINEやメールで送ってきそうな文を生成」してくれる物となります。
既にDockerで環境を汚さずに利用する事も出来ますが、今回はAPI化する必要がありましたので、簡単なLambda関数を作ってみました。
作ったもの
AWSの構成は下記のように、シンプルなAPI Gateway + Lambdaの構成となります。
Goで次のように、BodyからNameを取得して greymd/ojichat/generator
を利用しておじさん文章を生成して返却する簡単なコードを書きました。
package main
import (
"encoding/json"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/greymd/ojichat/generator"
)
type Payload struct {
Name string `json:"name"`
}
type Response struct {
Message string `json:"message"`
}
func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
var payload Payload
err := json.Unmarshal([]byte(request.Body), &payload)
if err != nil {
return events.APIGatewayProxyResponse{
Body: err.Error(),
StatusCode: 500,
}, err
}
config := generator.Config{
TargetName: payload.Name,
EmojiNum: 4,
PunctuationLevel: 0,
}
ojiResult, err := generator.Start(config)
if err != nil {
return events.APIGatewayProxyResponse{
Body: err.Error(),
StatusCode: 500,
}, err
}
res := Response{
Message: ojiResult,
}
jsonResult, _ := json.Marshal(res)
return events.APIGatewayProxyResponse{
Body: string(jsonResult),
StatusCode: 200,
}, nil
}
func main() {
lambda.Start(handler)
}
また、API GatewayやLambdaの構成管理はAWS SAMを使っていて、簡単なYAMLで構成管理できるようにしています。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: serverless-ojichat
Globals:
Function:
Timeout: 5
Resources:
OjiFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: oji/
Handler: oji
Runtime: go1.x
Tracing: Active
Events:
CatchAll:
Type: Api
Properties:
Path: /oji
Method: POST
Outputs:
OjiAPI:
Description: API Endpoint URL
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/oji"
コードなどは mokocm/serverless-ojichatで公開しています。
利用方法
デプロイにはAWS SAMを利用するため、インストールしていない場合は下記ドキュメントに記載の通りインストールを行います。
デプロイ手順は次の通りです。
git clone https://github.com/mokocm/serverless-ojichat/
cd serverless-ojichat/
sam build
sam deploy --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Not found
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]: serverless-ojichat
AWS Region [us-east-1]: ap-northeast-1
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [y/N]: y
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: y
OjiFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: y
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
SAMでのデプロイ作業が終わると、Outputs枠にAPI GatewayのEndpoint URLが表示されます。
CloudFormation outputs from deployed stack
Key OjiAPI
Description API Endpoint URL
Value https://66tc6jmsxg.execute-api.ap-northeast-1.amazonaws.com/Prod/oji
Successfully created/updated stack - serverless-ojichat in ap-northeast-1
こちらのURLを利用して、curlで適当な名前をPOSTしておじさん文章を生成してみましょう。
curl -X POST https://66tc6jmsxg.execute-api.ap-northeast-1.amazonaws.com/Prod/oji -d '{"name": "ぴよ"}'
{"message":"ぴよちゃん、お疲れ様〜😂😃♥ 今日はどんな一日だった🤔僕は、すごく心配だよ(-_-;)💔( ̄Д ̄;;そんなときは、美味しいもの食べて、元気出さなきゃだね😁"}
まとめ
今回Goを使ったAPI Gateway + Lambdaの構成を初めて組んでみましたが、数時間で簡単に作る事ができました。
AWS SAMはPython、Nodeくらいしか使えないのかと思ってましたが、Goも行けることを初めて知りました。
突然ojichatをAPI化する必要が出てきてもすぐ使えるように、GitHubで公開していますので、ojichatをAPI化する際は是非お使いください。
誰かにお役に立てれば幸いです。