diff --git a/aws/lambda/lambdaslackbot/.gitignore b/aws/lambda/lambdaslackbot/.gitignore new file mode 100644 index 0000000..3901ad7 --- /dev/null +++ b/aws/lambda/lambdaslackbot/.gitignore @@ -0,0 +1,4 @@ +.terraform +.terraform.lock.hcl +terraform.tfstate* +Makefile diff --git a/aws/lambda/lambdaslackbot/Dockerfile b/aws/lambda/lambdaslackbot/Dockerfile new file mode 100644 index 0000000..b4c88c6 --- /dev/null +++ b/aws/lambda/lambdaslackbot/Dockerfile @@ -0,0 +1,14 @@ +FROM public.ecr.aws/lambda/provided:al2 as build +# install compiler +RUN yum install -y golang +RUN go env -w GOPROXY=direct +# cache dependencies +ADD go.mod go.sum ./ +RUN go mod download +# build +ADD . . +RUN go build -o /main +# copy artifacts to a clean image +FROM public.ecr.aws/lambda/provided:al2 +COPY --from=build /main /main +ENTRYPOINT [ "/main" ] diff --git a/aws/lambda/lambdaslackbot/Readme.md b/aws/lambda/lambdaslackbot/Readme.md new file mode 100644 index 0000000..a286ac4 --- /dev/null +++ b/aws/lambda/lambdaslackbot/Readme.md @@ -0,0 +1,22 @@ +# Build image + +1. Build & Push image + +``` +docker build -t 270431303334.dkr.ecr.ap-southeast-2.amazonaws.com/hello-world:latest .; +aws ecr get-login-password --region ap-southeast-2 | docker login --username AWS --password-stdin 270431303334.dkr.ecr.ap-southeast-2.amazonaws.com; +docker push 270431303334.dkr.ecr.ap-southeast-2.amazonaws.com/hello-world:latest; +``` + +2. Run terraform + +``` +terraform init; +terraform apply; +``` + +3. Test + +``` +curl --location --request POST 'https://ssah8op3a5.execute-api.ap-southeast-2.amazonaws.com/default/FakeChimera' --header 'Content-Type: application/json' --data-raw '{}' +``` diff --git a/aws/lambda/lambdaslackbot/go.mod b/aws/lambda/lambdaslackbot/go.mod new file mode 100644 index 0000000..e41c15e --- /dev/null +++ b/aws/lambda/lambdaslackbot/go.mod @@ -0,0 +1,8 @@ +module github.com/ledongthuc/lambdaslackbot + +go 1.16 + +require ( + github.com/aws/aws-lambda-go v1.23.0 + github.com/sirupsen/logrus v1.8.1 +) diff --git a/aws/lambda/lambdaslackbot/go.sum b/aws/lambda/lambdaslackbot/go.sum new file mode 100644 index 0000000..fea95fd --- /dev/null +++ b/aws/lambda/lambdaslackbot/go.sum @@ -0,0 +1,26 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/aws/aws-lambda-go v1.23.0 h1:Vjwow5COkFJp7GePkk9kjAo/DyX36b7wVPKwseQZbRo= +github.com/aws/aws-lambda-go v1.23.0/go.mod h1:jJmlefzPfGnckuHdXX7/80O3BvUUi12XOkbv4w9SGLU= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/aws/lambda/lambdaslackbot/main.go b/aws/lambda/lambdaslackbot/main.go new file mode 100644 index 0000000..c55b40b --- /dev/null +++ b/aws/lambda/lambdaslackbot/main.go @@ -0,0 +1,61 @@ +package main + +import ( + "encoding/base64" + "net/url" + "os" + + "github.com/aws/aws-lambda-go/events" + "github.com/aws/aws-lambda-go/lambda" + "github.com/sirupsen/logrus" +) + +func HandleRequest(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { + logrus.SetFormatter(&logrus.JSONFormatter{}) + logrus.WithFields(logrus.Fields{ + "env": os.Environ(), + "request_id": request.RequestContext.RequestID, + "method": request.HTTPMethod, + "path": request.Path, + "res": request.Resource, + "body": request.Body, + "is_base64_encoded": request.IsBase64Encoded, + }).Info("New request") + + body := request.Body + if request.IsBase64Encoded { + b, err := base64.URLEncoding.DecodeString(request.Body) + if err != nil { + logrus.Error(err) + return events.APIGatewayProxyResponse{ + Body: "Fail to process: decode request: " + err.Error(), + StatusCode: 200, + }, nil + } + body = string(b) + } + + arguments, err := url.ParseQuery(body) + if err != nil { + return events.APIGatewayProxyResponse{ + Body: "Fail to process: parse request: " + err.Error(), + StatusCode: 200, + }, nil + } + logrus.WithFields(logrus.Fields{ + "arguments": arguments, + }).Info("Arguments") + + msg := awsInsatncesMsg() + return events.APIGatewayProxyResponse{ + Body: msg, + StatusCode: 200, + }, nil +} + +func main() { + lambda.Start(HandleRequest) +} +func awsInsatncesMsg() string { + return "Hello guy\nNice to meet you
Good bye" +} diff --git a/aws/lambda/lambdaslackbot/main.tf b/aws/lambda/lambdaslackbot/main.tf new file mode 100644 index 0000000..3e7a21b --- /dev/null +++ b/aws/lambda/lambdaslackbot/main.tf @@ -0,0 +1,68 @@ +provider "aws" { + region = "ap-southeast-2" +} + +resource "aws_iam_role" "iam_for_lambda" { + name = "iam_for_lambda" + + assume_role_policy = <