From df29fcef04ec7e4193ac5ed3b964bc1ca9086226 Mon Sep 17 00:00:00 2001 From: briskt <3172830+briskt@users.noreply.github.com> Date: Thu, 23 Jan 2025 20:03:58 +0800 Subject: [PATCH 1/3] update to AWS SDK v2 --- alert/alert.go | 60 +++++++++++++++++++++++++++++--------------------- go.mod | 15 ++++++++++++- go.sum | 30 +++++++++++++++++++++++-- 3 files changed, 77 insertions(+), 28 deletions(-) diff --git a/alert/alert.go b/alert/alert.go index bec3ab0..0692c1f 100644 --- a/alert/alert.go +++ b/alert/alert.go @@ -5,10 +5,12 @@ import ( "log" "strings" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/ses" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/ses" + "github.com/aws/aws-sdk-go-v2/service/ses/types" + "golang.org/x/net/context" ) type Config struct { @@ -25,23 +27,24 @@ func SendEmail(config Config, body string) { charSet := config.CharSet subject := config.SubjectText - subjContent := ses.Content{ + subjContent := types.Content{ Charset: &charSet, Data: &subject, } - msgContent := ses.Content{ + msgContent := types.Content{ Charset: &charSet, Data: &body, } - msgBody := ses.Body{ + msgBody := types.Body{ Text: &msgContent, } - emailMsg := ses.Message{} - emailMsg.SetSubject(&subjContent) - emailMsg.SetBody(&msgBody) + emailMsg := types.Message{ + Subject: &subjContent, + Body: &msgBody, + } // Only report the last email error lastError := "" @@ -63,31 +66,38 @@ func SendEmail(config Config, body string) { } } -func sendAnEmail(emailMsg ses.Message, recipient string, config Config) error { - recipients := []*string{&recipient} - +func sendAnEmail(emailMsg types.Message, recipient string, cfg Config) error { input := &ses.SendEmailInput{ - Destination: &ses.Destination{ - ToAddresses: recipients, + Destination: &types.Destination{ + ToAddresses: []string{recipient}, }, Message: &emailMsg, - Source: aws.String(config.ReturnToAddr), + Source: aws.String(cfg.ReturnToAddr), } - cfg := &aws.Config{Region: aws.String(config.AWSRegion)} - if config.AWSAccessKeyID != "" && config.AWSSecretAccessKey != "" { - cfg.Credentials = credentials.NewStaticCredentials(config.AWSAccessKeyID, config.AWSSecretAccessKey, "") - } - sess, err := session.NewSession(cfg) + svc, err := createSESService(cfg.AWSRegion, cfg.AWSAccessKeyID, cfg.AWSSecretAccessKey) if err != nil { - return fmt.Errorf("error creating AWS session: %s", err) + return fmt.Errorf("failed to create SES service: %w", err) } - svc := ses.New(sess) - result, err := svc.SendEmail(input) + result, err := svc.SendEmail(context.Background(), input) if err != nil { - return fmt.Errorf("error sending email, result: %s, error: %s", result, err) + return fmt.Errorf("error sending email, error: %w", err) } log.Printf("alert message sent to %s, message ID: %s", recipient, *result.MessageId) return nil } + +func createSESService(region, key, secret string) (*ses.Client, error) { + cfg, err := config.LoadDefaultConfig(context.Background()) + if err != nil { + return nil, fmt.Errorf("AWS SDK LoadDefaultConfig failed: %w", err) + } + + cfg.Region = region + if key != "" && secret != "" { + cfg.Credentials = credentials.NewStaticCredentialsProvider(key, secret, "") + } + + return ses.NewFromConfig(cfg), nil +} diff --git a/go.mod b/go.mod index 346eff7..0d29a3d 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,10 @@ go 1.23 require ( github.com/Jeffail/gabs/v2 v2.7.0 github.com/aws/aws-lambda-go v1.47.0 - github.com/aws/aws-sdk-go v1.55.5 + github.com/aws/aws-sdk-go-v2 v1.33.0 + github.com/aws/aws-sdk-go-v2/config v1.29.1 + github.com/aws/aws-sdk-go-v2/credentials v1.17.54 + github.com/aws/aws-sdk-go-v2/service/ses v1.29.6 github.com/stretchr/testify v1.9.0 golang.org/x/net v0.33.0 golang.org/x/oauth2 v0.23.0 @@ -16,6 +19,16 @@ require ( cloud.google.com/go/auth v0.9.7 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect cloud.google.com/go/compute/metadata v0.5.2 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.9 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.2 // indirect diff --git a/go.sum b/go.sum index 20faf16..a0a772c 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,34 @@ github.com/Jeffail/gabs/v2 v2.7.0 h1:Y2edYaTcE8ZpRsR2AtmPu5xQdFDIthFG0jYhu5PY8kg github.com/Jeffail/gabs/v2 v2.7.0/go.mod h1:dp5ocw1FvBBQYssgHsG7I1WYsiLRtkUaB1FEtSwvNUw= github.com/aws/aws-lambda-go v1.47.0 h1:0H8s0vumYx/YKs4sE7YM0ktwL2eWse+kfopsRI1sXVI= github.com/aws/aws-lambda-go v1.47.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A= -github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= -github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.33.0 h1:Evgm4DI9imD81V0WwD+TN4DCwjUMdc94TrduMLbgZJs= +github.com/aws/aws-sdk-go-v2 v1.33.0/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/config v1.29.1 h1:JZhGawAyZ/EuJeBtbQYnaoftczcb2drR2Iq36Wgz4sQ= +github.com/aws/aws-sdk-go-v2/config v1.29.1/go.mod h1:7bR2YD5euaxBhzt2y/oDkt3uNRb6tjFp98GlTFueRwk= +github.com/aws/aws-sdk-go-v2/credentials v1.17.54 h1:4UmqeOqJPvdvASZWrKlhzpRahAulBfyTJQUaYy4+hEI= +github.com/aws/aws-sdk-go-v2/credentials v1.17.54/go.mod h1:RTdfo0P0hbbTxIhmQrOsC/PquBZGabEPnCaxxKRPSnI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 h1:5grmdTdMsovn9kPZPI23Hhvp0ZyNm5cRO+IZFIYiAfw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24/go.mod h1:zqi7TVKTswH3Ozq28PkmBmgzG1tona7mo9G2IJg4Cis= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.28 h1:igORFSiH3bfq4lxKFkTSYDhJEUCYo6C8VKiWJjYwQuQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.28/go.mod h1:3So8EA/aAYm36L7XIvCVwLa0s5N0P7o2b1oqnx/2R4g= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.28 h1:1mOW9zAUMhTSrMDssEHS/ajx8JcAj/IcftzcmNlmVLI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.28/go.mod h1:kGlXVIWDfvt2Ox5zEaNglmq0hXPHgQFNMix33Tw22jA= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.9 h1:TQmKDyETFGiXVhZfQ/I0cCFziqqX58pi4tKJGYGFSz0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.9/go.mod h1:HVLPK2iHQBUx7HfZeOQSEu3v2ubZaAY2YPbAm5/WUyY= +github.com/aws/aws-sdk-go-v2/service/ses v1.29.6 h1:uc9MwzkhjIjV5abWaG6Ird83IcSrNVt62BSXG7WRwAw= +github.com/aws/aws-sdk-go-v2/service/ses v1.29.6/go.mod h1:t1rqt5llPOnzPnfHpciQZ3dZgyCsgfR7RHZ2ZFfZEWs= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 h1:kuIyu4fTT38Kj7YCC7ouNbVZSSpqkZ+LzIfhCr6Dg+I= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.11/go.mod h1:Ro744S4fKiCCuZECXgOi760TiYylUM8ZBf6OGiZzJtY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 h1:l+dgv/64iVlQ3WsBbnn+JSbkj01jIi+SM0wYsj3y/hY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10/go.mod h1:Fzsj6lZEb8AkTE5S68OhcbBqeWPsR8RnGuKPr8Todl8= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.9 h1:BRVDbewN6VZcwr+FBOszDKvYeXY1kJ+GGMCcpghlw0U= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.9/go.mod h1:f6vjfZER1M17Fokn0IzssOTMT2N8ZSq+7jnNF0tArvw= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= From fb633d66fdade35f9a8a8052e2cc0bf15b113224 Mon Sep 17 00:00:00 2001 From: briskt <3172830+briskt@users.noreply.github.com> Date: Thu, 23 Jan 2025 20:06:45 +0800 Subject: [PATCH 2/3] don't need x/net/context --- alert/alert.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alert/alert.go b/alert/alert.go index 0692c1f..a0187cb 100644 --- a/alert/alert.go +++ b/alert/alert.go @@ -1,6 +1,7 @@ package alert import ( + "context" "fmt" "log" "strings" @@ -10,7 +11,6 @@ import ( "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/service/ses" "github.com/aws/aws-sdk-go-v2/service/ses/types" - "golang.org/x/net/context" ) type Config struct { From ce8f297f278fef4a4ea4c2bbffbf4dbcae56be8c Mon Sep 17 00:00:00 2001 From: briskt <3172830+briskt@users.noreply.github.com> Date: Mon, 27 Jan 2025 13:51:45 +0800 Subject: [PATCH 3/3] no need to say "error" Co-authored-by: Jason Jackson <35783387+jason-jackson@users.noreply.github.com> --- alert/alert.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alert/alert.go b/alert/alert.go index a0187cb..aaaa0e5 100644 --- a/alert/alert.go +++ b/alert/alert.go @@ -82,7 +82,7 @@ func sendAnEmail(emailMsg types.Message, recipient string, cfg Config) error { result, err := svc.SendEmail(context.Background(), input) if err != nil { - return fmt.Errorf("error sending email, error: %w", err) + return fmt.Errorf("error sending email: %w", err) } log.Printf("alert message sent to %s, message ID: %s", recipient, *result.MessageId) return nil