-
Notifications
You must be signed in to change notification settings - Fork 113
/
Copy pathlambda.go
67 lines (61 loc) · 1.81 KB
/
lambda.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Copyright 2022 Linkall Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package client
import (
"context"
"errors"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/aws/arn"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/lambda"
ce "github.com/cloudevents/sdk-go/v2"
)
type awsLambda struct {
client *lambda.Client
arn *string
}
func NewAwsLambdaClient(accessKeyID, secretKeyID, arnStr string) EventClient {
a, _ := arn.Parse(arnStr)
credential := aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(accessKeyID, secretKeyID, ""))
c := lambda.New(lambda.Options{
Credentials: credential,
Region: a.Region,
})
return &awsLambda{
client: c,
arn: &arnStr,
}
}
func (l *awsLambda) Send(ctx context.Context, events ...*ce.Event) Result {
event := events[0]
payload, err := event.MarshalJSON()
if err != nil {
return newInternalErr(err)
}
req := &lambda.InvokeInput{
FunctionName: l.arn,
Payload: payload,
}
resp, err := l.client.Invoke(ctx, req)
if err != nil {
if errors.Is(err, context.DeadlineExceeded) {
return DeliveryTimeout
}
return newUnknownErr(err)
}
if resp.StatusCode >= errStatusCode {
return convertHTTPResponse(int(resp.StatusCode), "aws lambda invoke", resp.Payload)
}
return Success
}