AWSのgo用SDKでLambdaを呼び出す

目的

インスタンスからgo用のAWS SDK でLambdaを呼び出したい

注意)Lambdaをgoで書きたいとか、Lambda to Lambdaをgoで書きたいとかではない(でもやってることはほぼ同じ)

公式APIリファレンスの場所

AWS SDK for Go API Reference

インストール

先にgo getしておきましょう。

go get github.com/aws/aws-sdk-go/...

使い方

credentialをインスタンスに保存するのは嫌なので、インスタンスに対して、Lambdaを起動させるためのロールを設定している前提. Lambdaを実行するだけなら、設定するロールは以下の2つだけで良いようだ。

  • lambda:InvokeFunction
  • lambda:InvokeAsync

ソースコード

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