インスタンスからgo用のAWS SDK でLambdaを呼び出したい
注意)Lambdaをgoで書きたいとか、Lambda to Lambdaをgoで書きたいとかではない(でもやってることはほぼ同じ)
先にgo getしておきましょう。
go get github.com/aws/aws-sdk-go/...
credentialをインスタンスに保存するのは嫌なので、インスタンスに対して、Lambdaを起動させるためのロールを設定している前提. Lambdaを実行するだけなら、設定するロールは以下の2つだけで良いようだ。
package main
import (
"encoding/json"
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/lambda"
)
// for response
type Response struct {
Message string `json:"message"`
Ok bool `json:"ok"`
}
// data to input to Lambda
type Data struct {
Key1 string `json:"key1"`
Key2 string `json:"key2"`
Key3 string `json:"key3"`
}
// function to call Lambda
func Handler() (Response, error) {
// Data that is to send to the Lambda
payload := Data{
Key1: "1",
Key2: "2",
Key3: "3",
}
// and transform it to json bytes.
jsonBytes, _ := json.Marshal(payload)
// To make session
mySession := session.New()
// To set region you use.
svc := lambda.New(mySession, aws.NewConfig().WithRegion("ap-northeast-1"))
// set the Lambda's arn.
input := &lambda.InvokeInput{
// To set your Labmda's arn
FunctionName: aws.String("arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:test-lambda"),
Payload: jsonBytes,
// InvocationType Customization is available.
// RequestResoponse is synchronous mode.(default)
// Event is asynchronous mode.
//InvocationType: aws.String("Event"),
//InvocationType: aws.String("RequestResponse"),
}
// To call Lambda
resp, _ := svc.Invoke(input)
fmt.Println(resp)
return Response{
Message: "success",
Ok: true,
}, nil
}
func main() {
ret, _ := Handler()
fmt.Println(ret)
}