AWS Step Functions のチュートリアルをやってみる (Node.jsをgoに書き換えて)
チュートリアルどおりにやってみる
Amazon States Language というjsonベースの独自の記法で書く
(コードでワークフローを記述を選択して作成している)
チュートリアルはNode.jsだけどgoで書いてみる
元はこれ
exports.handler = (event, context, callback) => {
// Create a support case using the input as the case ID, then return a confirmation message
var myCaseID = event.inputCaseID;
var myMessage = "Case " + myCaseID + ": opened...";
var result = {Case: myCaseID, Message: myMessage};
callback(null, result);
};
go を Mac M1 にinstall する
Version管理したほうがいいのかな?
asdf使ってるけど、それ経由だと微妙なのかな?🤔
Goはv1.0をリリースした際に、後方互換についてルールを定めました。
Goには複数バージョンのツールチェインを混在させる方法が公式で提供されています。例えば、Go 1.10.7のツールチェインを別途インストールしたい場合には、次のようにgo getすることで行なえます。
なるほど、公式どおり素直にinstallしよう
その他参考リンク:
こっからダウンロード
M1なので ARM64
を選択
install完了🎉
この中のサンプルコードをベースに先のNode.jsのコードに書き換えていく
元のサンプルコード
package main
import (
"fmt"
"context"
"github.com/aws/aws-lambda-go/lambda"
)
type MyEvent struct {
Name string `json:"name"`
}
func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
return fmt.Sprintf("Hello %s!", name.Name ), nil
}
func main() {
lambda.Start(HandleRequest)
}
ちょっと脇道
VS code のタブが4になってて大きく感じるので、2にする
VS code の Settings
を開いて go setting
と入力すると設定ファイル(json)が選択できるので選択
editor.tabSize
を 4から2に変更した
{
...
"editor.tabSize": 2,
...
}
参考リンク:
サンプルコードはこっちのほうがよさそう
return するのは json になるから
package main
import (
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
type MyEvent struct {
Name string `json:"What is your name?"`
Age int `json:"How old are you?"`
}
type MyResponse struct {
Message string `json:"Answer:"`
}
func HandleLambdaEvent(event MyEvent) (MyResponse, error) {
return MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil
}
func main() {
lambda.Start(HandleLambdaEvent)
}
goで書き換えたコード
package main
import (
"fmt"
"context"
"github.com/aws/aws-lambda-go/lambda"
)
type Event struct {
InputCaseID string `json:"inputCaseID"`
}
type SupportCase struct {
MyCaseID string `json:"Case:"`
MyMessage string `json:"Message:"`
}
func HandleRequest(ctx context.Context, e Event) (SupportCase, error) {
return SupportCase{MyCaseID: e.InputCaseID, MyMessage: fmt.Sprintf("Case %s opened...", e.InputCaseID)}, nil
}
func main() {
lambda.Start(HandleRequest)
}
build する
go mod init github.com/ut61z/go_lambda_tutorial
go mod tidy
go build cmd/first/main.go
今のdirectory構成はこう
go_lambda_tutorial on main [!?] via 🐹 v1.17.7 on ☁️ (ap-northeast-1)
❯ tree
.
├── cmd
│ └── first
│ └── main.go
├── go.mod
├── go.sum
└── main
2 directories, 4 files
参考リンク:
GOOS=linux go build main.go
GOOS を linux に設定すると、非 Linux 環境でコンパイルする場合でも、コンパイルされた実行可能ファイルと Go ランタイムとの互換性を確保できます
そうなのか、もう一回buildする
GOOS=linux go build cmd/first/main.go
そして zip にする(first_function.zip
というファイル名にしてみる)
zip first_function.zip main
Lambdaのテストで動かしてみたけどエラーになった
fork/exec /var/task/main: exec format error
GOARCH=amd64
の指定が必要らしい
GOARCH=amd64 GOOS=linux go build cmd/first/main.go
無事テスト通った🎉
AssignCaseFunction
WorkOnCaseFunction
CloseCaseFunction
EscalateCaseFunction
をgoで書いていく
書いた
ちょっと手直し json
tag の書き方間違ってた(公式も間違ってるのでは?)
最終的にはこうなった
動いた🎉