1
1
package kafka
2
2
3
3
import (
4
+ "context"
5
+ "crypto/tls"
4
6
"time"
5
7
6
8
"github.com/moov-io/achgateway/internal/service"
7
9
"github.com/moov-io/base/log"
8
10
9
11
"github.com/Shopify/sarama"
12
+ "github.com/aws/aws-msk-iam-sasl-signer-go/signer"
10
13
"gocloud.dev/pubsub"
11
14
"gocloud.dev/pubsub/kafkapubsub"
12
15
)
@@ -15,13 +18,58 @@ var (
15
18
minKafkaVersion = sarama .V2_6_0_0
16
19
)
17
20
21
+ type MSKAccessTokenProvider struct {
22
+ Region string
23
+ Profile string
24
+ RoleARN string
25
+ SessionName string
26
+ }
27
+
28
+ func (m * MSKAccessTokenProvider ) Token () (* sarama.AccessToken , error ) {
29
+ var token string
30
+ var err error
31
+
32
+ // Choose the correct AWS authentication method
33
+ switch {
34
+ case m .Profile != "" :
35
+ token , _ , err = signer .GenerateAuthTokenFromProfile (context .TODO (), m .Region , m .Profile )
36
+ case m .RoleARN != "" :
37
+ token , _ , err = signer .GenerateAuthTokenFromRole (context .TODO (), m .Region , m .RoleARN , m .SessionName )
38
+ default :
39
+ token , _ , err = signer .GenerateAuthToken (context .TODO (), m .Region )
40
+ }
41
+
42
+ if err != nil {
43
+ return nil , err
44
+ }
45
+ return & sarama.AccessToken {Token : token }, nil
46
+ }
47
+
18
48
func OpenTopic (logger log.Logger , cfg * service.KafkaConfig ) (* pubsub.Topic , error ) {
19
49
config := kafkapubsub .MinimalConfig ()
20
50
config .Version = minKafkaVersion
21
51
config .Net .TLS .Enable = cfg .TLS
22
52
23
53
config .Net .SASL .Enable = cfg .Key != ""
24
- config .Net .SASL .Mechanism = sarama .SASLMechanism ("PLAIN" )
54
+
55
+ switch cfg .SASLMechanism {
56
+ case "AWS_MSK_IAM" :
57
+ if cfg .Provider != nil && cfg .Provider .AWS != nil {
58
+ config .Net .SASL .TokenProvider = & MSKAccessTokenProvider {
59
+ Region : cfg .Provider .AWS .Region ,
60
+ Profile : cfg .Provider .AWS .Profile ,
61
+ RoleARN : cfg .Provider .AWS .RoleARN ,
62
+ SessionName : cfg .Provider .AWS .SessionName ,
63
+ }
64
+ }
65
+ config .Net .SASL .Mechanism = sarama .SASLTypeOAuth
66
+ config .Net .TLS .Enable = true
67
+ config .Net .TLS .Config = & tls.Config {}
68
+
69
+ default :
70
+ config .Net .SASL .Mechanism = sarama .SASLTypePlaintext
71
+ }
72
+
25
73
config .Net .SASL .User = cfg .Key
26
74
config .Net .SASL .Password = cfg .Secret
27
75
@@ -33,6 +81,7 @@ func OpenTopic(logger log.Logger, cfg *service.KafkaConfig) (*pubsub.Topic, erro
33
81
Set ("tls" , log .Bool (cfg .TLS )).
34
82
Set ("group" , log .String (cfg .Group )).
35
83
Set ("sasl.enable" , log .Bool (config .Net .SASL .Enable )).
84
+ Set ("sasl.mechanism" , log .String (string (config .Net .SASL .Mechanism ))).
36
85
Set ("sasl.user" , log .String (cfg .Key )).
37
86
Set ("topic" , log .String (cfg .Topic )).
38
87
Log ("opening kafka topic" )
@@ -46,7 +95,25 @@ func OpenSubscription(logger log.Logger, cfg *service.KafkaConfig) (*pubsub.Subs
46
95
config .Net .TLS .Enable = cfg .TLS
47
96
48
97
config .Net .SASL .Enable = cfg .Key != ""
49
- config .Net .SASL .Mechanism = sarama .SASLMechanism ("PLAIN" )
98
+ // Default to PLAIN if no SASL mechanism is specified
99
+ switch cfg .SASLMechanism {
100
+ case "AWS_MSK_IAM" :
101
+ if cfg .Provider != nil && cfg .Provider .AWS != nil {
102
+ config .Net .SASL .TokenProvider = & MSKAccessTokenProvider {
103
+ Region : cfg .Provider .AWS .Region ,
104
+ Profile : cfg .Provider .AWS .Profile ,
105
+ RoleARN : cfg .Provider .AWS .RoleARN ,
106
+ SessionName : cfg .Provider .AWS .SessionName ,
107
+ }
108
+ }
109
+ config .Net .SASL .Mechanism = sarama .SASLTypeOAuth
110
+ config .Net .TLS .Enable = true
111
+ config .Net .TLS .Config = & tls.Config {}
112
+
113
+ default :
114
+ config .Net .SASL .Mechanism = sarama .SASLTypePlaintext
115
+ }
116
+
50
117
config .Net .SASL .User = cfg .Key
51
118
config .Net .SASL .Password = cfg .Secret
52
119
@@ -62,6 +129,7 @@ func OpenSubscription(logger log.Logger, cfg *service.KafkaConfig) (*pubsub.Subs
62
129
Set ("tls" , log .Bool (cfg .TLS )).
63
130
Set ("group" , log .String (cfg .Group )).
64
131
Set ("sasl.enable" , log .Bool (config .Net .SASL .Enable )).
132
+ Set ("sasl.mechanism" , log .String (string (config .Net .SASL .Mechanism ))).
65
133
Set ("sasl.user" , log .String (cfg .Key )).
66
134
Set ("topic" , log .String (cfg .Topic )).
67
135
Log ("setting up kafka subscription" )
0 commit comments