I wanted to run Kinesis Firehose in Go, but I couldn't find any sample code.
Here is a simple example.
package main
import (
"fmt"
"encoding/json"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/firehose"
"github.com/gin-gonic/gin"
)
type EntryRecord struct {
PostBodyField string `json:"entry"`
Host string `json:"host"`
RemoteAddr string `json:"remoteaddr"`
}
const (
deliveryStreamName = "firehose-dest-bucket"
)
func handleEntry(c *gin.Context) {
buf := make([]byte, 2048)
n, _ := c.Request.Body.Read(buf)
body_filed := string(buf[0:n])
fmt.Println(body_filed)
entry_record := EntryRecord{
PostBodyField: body_filed,
Host: c.Request.Host,
RemoteAddr: c.Request.RemoteAddr,
}
firehose_svc := firehose.New(session.New(), aws.NewConfig().WithRegion("ap-northeast-1"))
record := &firehose.Record{}
json, _ := json.Marshal(entry_record)
record_byte := append([]byte(json), []byte("\n")...)
record.SetData(record_byte)
_, err := firehose_svc.PutRecord(
&firehose.PutRecordInput{
DeliveryStreamName: aws.String(deliveryStreamName),
Record: record,
},
)
if err != nil {
if awsErr, ok := err.(awserr.Error); ok {
print(awsErr.Message())
}
}
}
func main() {
r := gin.Default()
r.POST("/submit", handleEntry)
r.Run()
}
Prerequisites
- You have already set up Kinesis Firehose
- You have already set up S3 bucket to store the request body data.
The following is the part that is sending data to Firehose.
&firehose.PutRecordInput{
DeliveryStreamName: aws.String(deliveryStreamName),
Record: record,
},
The argument Record is a structure defined in the SDK.
record := &firehose.Record{}
json, _ := json.Marshal(entry_record)
record_byte := append([]byte(json), []byte("\n")...)
record.SetData(record_byte)
Top comments (0)