Closed14

AWS Step Functions のチュートリアルをやってみる (Node.jsをgoに書き換えて)

ut61zut61z

チュートリアルは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);    
};
ut61zut61z

go を Mac M1 にinstall する
Version管理したほうがいいのかな?
asdf使ってるけど、それ経由だと微妙なのかな?🤔
https://tenntenn.dev/ja/posts/2021-06-27-xxenv/

Goはv1.0をリリースした際に、後方互換についてルールを定めました。

Goには複数バージョンのツールチェインを混在させる方法が公式で提供されています。例えば、Go 1.10.7のツールチェインを別途インストールしたい場合には、次のようにgo getすることで行なえます。

なるほど、公式どおり素直にinstallしよう

その他参考リンク:
https://qiita.com/disk131/items/e1bc77a3c2851ebeb257
https://zenn.dev/yacchi21/articles/dd6d41b50fa1be
https://go.dev/doc/go1compat

ut61zut61z

この中のサンプルコードをベースに先のNode.jsのコードに書き換えていく
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-handler.html

元のサンプルコード

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)
}
ut61zut61z

ちょっと脇道
VS code のタブが4になってて大きく感じるので、2にする

VS code の Settings を開いて go setting と入力すると設定ファイル(json)が選択できるので選択

editor.tabSize を 4から2に変更した

settings.json
{
    ...
    "editor.tabSize": 2,
    ...
}

参考リンク:
https://obel.hatenablog.jp/entry/20190302/1551518184

ut61zut61z

サンプルコードはこっちのほうがよさそう
return するのは json になるから
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-handler.html

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)
}
ut61zut61z

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)
}
ut61zut61z

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

参考リンク:
https://qiita.com/uchiko/items/64fb3020dd64cf211d4e

ut61zut61z

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-package.html

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 
このスクラップは2022/03/02にクローズされました