Skip to content

Commit 90aa7b8

Browse files
Feature: Adds AWS Cognito OIDC Support (#1762)
* Adds AWS Cognito Identity support to Digger OIDC assumerole token
1 parent 40dcf99 commit 90aa7b8

17 files changed

+643
-64
lines changed

cli/go.mod

+4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ require (
1717
)
1818

1919
require (
20+
github.com/aws/aws-sdk-go-v2 v1.27.0
2021
github.com/aws/aws-sdk-go-v2/config v1.27.16
22+
github.com/aws/aws-sdk-go-v2/credentials v1.17.16
2123
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.32.6
2224
github.com/diggerhq/digger/libs v0.4.15
2325
github.com/dominikbraun/graph v0.23.0
@@ -26,6 +28,8 @@ require (
2628
github.com/spf13/cobra v1.8.1
2729
github.com/spf13/pflag v1.0.5
2830
github.com/spf13/viper v1.18.2
31+
github.com/xanzy/go-gitlab v0.106.0
32+
gotest.tools/v3 v3.5.1
2933
)
3034

3135
require (

cli/pkg/github/github.go

+14
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@ func GitHubCI(lock core_locking.Lock, policyCheckerProvider core_policy.PolicyCh
175175

176176
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(projectConfig)
177177

178+
stateArn, cmdArn := "",""
179+
if(projectConfig.AwsRoleToAssume != nil) {
180+
if projectConfig.AwsRoleToAssume.State != "" {
181+
stateArn = projectConfig.AwsRoleToAssume.State
182+
}
183+
184+
if projectConfig.AwsRoleToAssume.Command != "" {
185+
cmdArn = projectConfig.AwsRoleToAssume.Command
186+
}
187+
}
188+
189+
178190
job := scheduler.Job{
179191
ProjectName: projectConfig.Name,
180192
ProjectDir: projectConfig.Dir,
@@ -192,6 +204,8 @@ func GitHubCI(lock core_locking.Lock, policyCheckerProvider core_policy.PolicyCh
192204
EventName: "drift-detect",
193205
StateEnvProvider: StateEnvProvider,
194206
CommandEnvProvider: CommandEnvProvider,
207+
StateRoleArn: stateArn,
208+
CommandRoleArn: cmdArn,
195209
}
196210

197211
notification, err := driftNotificationProvider.Get(githubPrService)

go.work.sum

+10
Original file line numberDiff line numberDiff line change
@@ -548,12 +548,22 @@ github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z
548548
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
549549
github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY=
550550
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
551+
github.com/aws/aws-sdk-go-v2 v1.31.0 h1:3V05LbxTSItI5kUqNwhJrrrY1BAXxXt0sN0l72QmG5U=
552+
github.com/aws/aws-sdk-go-v2 v1.31.0/go.mod h1:ztolYtaEUtdpf9Wftr31CJfLVjOnD/CVRkKOOYgF8hA=
553+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 h1:kYQ3H1u0ANr9KEKlGs/jTLrBFPo8P8NaH/w7A01NeeM=
554+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18/go.mod h1:r506HmK5JDUh9+Mw4CfGJGSSoqIiLCndAuqXuhbv67Y=
555+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 h1:Z7IdFUONvTcvS7YuhtVxN99v2cCoHRXOS4mTr0B/pUc=
556+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18/go.mod h1:DkKMmksZVVyat+Y+r1dEOgJEfUeA7UngIHWeKsi0yNc=
551557
github.com/aws/aws-sdk-go-v2/service/autoscaling v1.23.16 h1:cp30gVVAbZfeDod6UJGppMH2+p+/cRCG2AZ1TbT+LqA=
552558
github.com/aws/aws-sdk-go-v2/service/autoscaling v1.23.16/go.mod h1:hHTMeJt6CQwFdmS19RK1LsDscus8c25Ve8KiYRhsISg=
559+
github.com/aws/aws-sdk-go-v2/service/cognitoidentity v1.26.3 h1:lHoc63BbtOfngsrW4yPRwWBmk1vX+uRYJ9W/dV08qsQ=
560+
github.com/aws/aws-sdk-go-v2/service/cognitoidentity v1.26.3/go.mod h1:xulrffP9hSEvUGxW6YzICDHncE+YOIaqAJQpZ4oa1lo=
553561
github.com/aws/aws-sdk-go-v2/service/ec2 v1.47.2 h1:81hrDgbXHL44WdY6M/fHGXLlv17qTpOFzutXRVDEk3Y=
554562
github.com/aws/aws-sdk-go-v2/service/ec2 v1.47.2/go.mod h1:VoBcwURHnJVCWuXHdqVuG03i2lUlHJ5DTTqDSyCdEcc=
555563
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.13 h1:9hFlfWKP1+u3js8IhRGf3M+S4MSoDK2v3bqIndGEpxU=
556564
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.13/go.mod h1:ByZbrzJwj5ScH6gvAlGslJK/LgJtPd0tteTBoG+yjVc=
565+
github.com/aws/smithy-go v1.21.0 h1:H7L8dtDRk0P1Qm6y0ji7MCYMQObJ5R9CRpyPhRUkLYA=
566+
github.com/aws/smithy-go v1.21.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
557567
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
558568
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
559569
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=

libs/ci/generic/events.go

+14
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,17 @@ func CreateJobsForProjects(projects []digger_config.Project, command string, eve
154154
skipMerge = false
155155
}
156156

157+
stateRole, cmdRole := "", ""
158+
if project.AwsRoleToAssume != nil {
159+
if project.AwsRoleToAssume.State != "" {
160+
stateRole = project.AwsRoleToAssume.State
161+
}
162+
163+
if project.AwsRoleToAssume.Command != "" {
164+
cmdRole = project.AwsRoleToAssume.Command
165+
}
166+
}
167+
157168
runEnvVars := GetRunEnvVars(defaultBranch, prBranch, project.Name, project.Dir)
158169
stateEnvVars, commandEnvVars := digger_config.CollectTerraformEnvConfig(workflow.EnvVars, false)
159170
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
@@ -178,6 +189,9 @@ func CreateJobsForProjects(projects []digger_config.Project, command string, eve
178189
RequestedBy: requestedBy,
179190
StateEnvProvider: StateEnvProvider,
180191
CommandEnvProvider: CommandEnvProvider,
192+
CommandRoleArn: cmdRole,
193+
StateRoleArn: stateRole,
194+
CognitoOidcConfig: project.AwsCognitoOidcConfig,
181195
SkipMergeCheck: skipMerge,
182196
})
183197
}

libs/ci/github/github.go

+23
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,17 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
457457
stateEnvVars, commandEnvVars := digger_config.CollectTerraformEnvConfig(workflow.EnvVars, performEnvVarInterpolation)
458458
pullRequestNumber := payload.PullRequest.Number
459459

460+
stateRole, cmdRole := "", ""
461+
if project.AwsRoleToAssume != nil {
462+
if project.AwsRoleToAssume.State != "" {
463+
stateRole = project.AwsRoleToAssume.State
464+
}
465+
466+
if project.AwsRoleToAssume.Command != "" {
467+
cmdRole = project.AwsRoleToAssume.Command
468+
}
469+
}
470+
460471
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
461472
if *payload.Action == "closed" && *payload.PullRequest.Merged && *(payload.PullRequest.Base).Ref == *(payload.Repo).DefaultBranch {
462473
jobs = append(jobs, scheduler.Job{
@@ -478,7 +489,10 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
478489
Namespace: *payload.Repo.FullName,
479490
RequestedBy: *payload.Sender.Login,
480491
CommandEnvProvider: CommandEnvProvider,
492+
CommandRoleArn: cmdRole,
493+
StateRoleArn: stateRole,
481494
StateEnvProvider: StateEnvProvider,
495+
CognitoOidcConfig: project.AwsCognitoOidcConfig,
482496
SkipMergeCheck: skipMerge,
483497
})
484498
} else if *payload.Action == "opened" || *payload.Action == "reopened" || *payload.Action == "synchronize" {
@@ -501,7 +515,10 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
501515
Namespace: *payload.Repo.FullName,
502516
RequestedBy: *payload.Sender.Login,
503517
CommandEnvProvider: CommandEnvProvider,
518+
CommandRoleArn: cmdRole,
519+
StateRoleArn: stateRole,
504520
StateEnvProvider: StateEnvProvider,
521+
CognitoOidcConfig: project.AwsCognitoOidcConfig,
505522
SkipMergeCheck: skipMerge,
506523
})
507524
} else if *payload.Action == "closed" {
@@ -524,7 +541,10 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
524541
Namespace: *payload.Repo.FullName,
525542
RequestedBy: *payload.Sender.Login,
526543
CommandEnvProvider: CommandEnvProvider,
544+
CommandRoleArn: cmdRole,
545+
StateRoleArn: stateRole,
527546
StateEnvProvider: StateEnvProvider,
547+
CognitoOidcConfig: project.AwsCognitoOidcConfig,
528548
SkipMergeCheck: skipMerge,
529549
})
530550
} else if *payload.Action == "converted_to_draft" {
@@ -554,7 +574,10 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
554574
Namespace: *payload.Repo.FullName,
555575
RequestedBy: *payload.Sender.Login,
556576
CommandEnvProvider: CommandEnvProvider,
577+
CommandRoleArn: cmdRole,
578+
StateRoleArn: stateRole,
557579
StateEnvProvider: StateEnvProvider,
580+
CognitoOidcConfig: project.AwsCognitoOidcConfig,
558581
SkipMergeCheck: skipMerge,
559582
})
560583
}

libs/digger_config/config.go

+15-14
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,21 @@ type AssumeRoleForProject struct {
2828
}
2929

3030
type Project struct {
31-
Name string
32-
Dir string
33-
Workspace string
34-
Terragrunt bool
35-
OpenTofu bool
36-
Pulumi bool
37-
Workflow string
38-
WorkflowFile string
39-
IncludePatterns []string
40-
ExcludePatterns []string
41-
DependencyProjects []string
42-
DriftDetection bool
43-
AwsRoleToAssume *AssumeRoleForProject
44-
Generated bool
31+
Name string
32+
Dir string
33+
Workspace string
34+
Terragrunt bool
35+
OpenTofu bool
36+
Pulumi bool
37+
Workflow string
38+
WorkflowFile string
39+
IncludePatterns []string
40+
ExcludePatterns []string
41+
DependencyProjects []string
42+
DriftDetection bool
43+
AwsRoleToAssume *AssumeRoleForProject
44+
AwsCognitoOidcConfig *AwsCognitoOidcConfig
45+
Generated bool
4546
PulumiStack string
4647
}
4748

libs/digger_config/converters.go

+11
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ func copyProjects(projects []*ProjectYaml) []Project {
4747
}
4848
}
4949

50+
var awsCognitoOidc *AwsCognitoOidcConfig = nil
51+
if p.AwsCognitoOidcConfig != nil {
52+
awsCognitoOidc = &AwsCognitoOidcConfig{
53+
CognitoPoolId: p.AwsCognitoOidcConfig.CognitoPoolId,
54+
AwsAccountId: p.AwsCognitoOidcConfig.AwsAccountId,
55+
AwsRegion: p.AwsCognitoOidcConfig.AwsRegion,
56+
SessionDuration: p.AwsCognitoOidcConfig.SessionDuration,
57+
}
58+
}
59+
5060
workflowFile := "digger_workflow.yml"
5161
if p.WorkflowFile != "" {
5262
workflowFile = p.WorkflowFile
@@ -72,6 +82,7 @@ func copyProjects(projects []*ProjectYaml) []Project {
7282
p.DependencyProjects,
7383
driftDetection,
7484
roleToAssume,
85+
awsCognitoOidc,
7586
p.Generated,
7687
workspace,
7788
}

libs/digger_config/digger_config.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ func HandleYamlProjectGeneration(config *DiggerConfigYaml, terraformDir string,
249249
Workspace: "default",
250250
AwsRoleToAssume: config.GenerateProjectsConfig.AwsRoleToAssume,
251251
Generated: true,
252+
AwsCognitoOidcConfig: config.GenerateProjectsConfig.AwsCognitoOidcConfig,
252253
}
253254
config.Projects = append(config.Projects, &project)
254255
}
@@ -271,14 +272,13 @@ func HandleYamlProjectGeneration(config *DiggerConfigYaml, terraformDir string,
271272
}
272273

273274
tgParsingConfig := TerragruntParsingConfig{
274-
CreateProjectName: true,
275-
DefaultWorkflow: workflow,
276-
WorkflowFile: b.WorkflowFile,
277-
FilterPath: path.Join(terraformDir, *b.RootDir),
278-
}
279-
280-
// allow blocks to pass in roles that can be assummed by aws
281-
tgParsingConfig.AwsRoleToAssume = b.AwsRoleToAssume
275+
CreateProjectName: true,
276+
DefaultWorkflow: workflow,
277+
WorkflowFile: b.WorkflowFile,
278+
FilterPath: path.Join(terraformDir, *b.RootDir),
279+
AwsRoleToAssume: b.AwsRoleToAssume,
280+
AwsCognitoOidcConfig: b.AwsCognitoOidcConfig,
281+
};
282282

283283
err := hydrateDiggerConfigYamlWithTerragrunt(config, tgParsingConfig, terraformDir)
284284
if err != nil {
@@ -305,6 +305,7 @@ func HandleYamlProjectGeneration(config *DiggerConfigYaml, terraformDir string,
305305
OpenTofu: b.OpenTofu,
306306
AwsRoleToAssume: b.AwsRoleToAssume,
307307
Generated: true,
308+
AwsCognitoOidcConfig: b.AwsCognitoOidcConfig,
308309
WorkflowFile: b.WorkflowFile,
309310
}
310311
config.Projects = append(config.Projects, &project)
@@ -546,6 +547,7 @@ func hydrateDiggerConfigYamlWithTerragrunt(configYaml *DiggerConfigYaml, parsing
546547
IncludePatterns: atlantisProject.Autoplan.WhenModified,
547548
Generated: true,
548549
AwsRoleToAssume: parsingConfig.AwsRoleToAssume,
550+
AwsCognitoOidcConfig: parsingConfig.AwsCognitoOidcConfig,
549551
})
550552
}
551553
return nil

libs/digger_config/digger_config_test.go

+27
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,10 @@ generate_projects:
11171117
aws_role_to_assume:
11181118
state: "arn://abc:xyz:state"
11191119
command: "arn://abc:xyz:cmd"
1120+
aws_cognito_oidc:
1121+
cognito_identity_pool_id: "us-east-1:00000000-0000-0000-0000-000000000000"
1122+
aws_region: "us-east-1"
1123+
aws_account_id: "000000000000"
11201124
`
11211125
deleteFile := createFile(path.Join(tempDir, "digger.yml"), diggerCfg)
11221126
defer deleteFile()
@@ -1135,6 +1139,9 @@ generate_projects:
11351139
assert.Equal(t, 4, len(dg.Projects))
11361140
assert.Equal(t, "arn://abc:xyz:cmd", dg.Projects[0].AwsRoleToAssume.Command)
11371141
assert.Equal(t, "arn://abc:xyz:state", dg.Projects[0].AwsRoleToAssume.State)
1142+
assert.Equal(t, "us-east-1:00000000-0000-0000-0000-000000000000", dg.Projects[0].AwsCognitoOidcConfig.CognitoPoolId)
1143+
assert.Equal(t, "us-east-1", dg.Projects[0].AwsCognitoOidcConfig.AwsRegion)
1144+
assert.Equal(t, "000000000000", dg.Projects[0].AwsCognitoOidcConfig.AwsAccountId)
11381145
assert.Equal(t, "dev_project", dg.Projects[0].Name)
11391146
assert.Equal(t, "dev/project", dg.Projects[0].Dir)
11401147
assert.Equal(t, "dev_project_test3", dg.Projects[1].Name)
@@ -1195,3 +1202,23 @@ func TestGetModifiedProjectsReturnsCorrectSourceMapping(t *testing.T) {
11951202
assert.Equal(t, expectedImpactingLocations["prod"].ImpactingLocations, projectSourceMapping["prod"].ImpactingLocations)
11961203

11971204
}
1205+
1206+
func TestCognitoTokenSetFromMinConfig(t *testing.T) {
1207+
diggerCfg := `
1208+
projects:
1209+
- name: dev
1210+
dir: .
1211+
aws_cognito_oidc:
1212+
cognito_identity_pool_id: "us-east-1:00000000-0000-0000-0000-000000000000"
1213+
aws_account_id: "000000000000"
1214+
aws_role_to_assume:
1215+
state: "arn://abc:xyz:state"
1216+
command: "arn://abc:xyz:cmd"
1217+
`
1218+
dg, _, _, err := LoadDiggerConfigFromString(diggerCfg, "./")
1219+
assert.NoError(t, err, "expected error to be nil")
1220+
assert.NotNil(t, dg, "expected digger digger_config to be not nil")
1221+
1222+
assert.Equal(t, dg.Projects[0].AwsCognitoOidcConfig.CognitoPoolId, "us-east-1:00000000-0000-0000-0000-000000000000")
1223+
assert.Equal(t, dg.Projects[0].AwsCognitoOidcConfig.AwsAccountId, "000000000000")
1224+
}

libs/digger_config/yaml.go

+11
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ type ProjectYaml struct {
4040
DriftDetection *bool `yaml:"drift_detection,omitempty"`
4141
AwsRoleToAssume *AssumeRoleForProjectConfig `yaml:"aws_role_to_assume,omitempty"`
4242
Generated bool `yaml:"generated"`
43+
AwsCognitoOidcConfig *AwsCognitoOidcConfig `yaml:"aws_cognito_oidc,omitempty"`
4344
PulumiStack string `yaml:"pulumi_stack"`
4445
}
4546

@@ -106,6 +107,7 @@ type BlockYaml struct {
106107
Workflow string `yaml:"workflow"`
107108
WorkflowFile string `yaml:"workflow_file"`
108109
AwsRoleToAssume *AssumeRoleForProjectConfig `yaml:"aws_role_to_assume,omitempty"`
110+
AwsCognitoOidcConfig *AwsCognitoOidcConfig `yaml:"aws_cognito_oidc,omitempty"`
109111
}
110112

111113
type AssumeRoleForProjectConfig struct {
@@ -114,13 +116,21 @@ type AssumeRoleForProjectConfig struct {
114116
Command string `yaml:"command"`
115117
}
116118

119+
type AwsCognitoOidcConfig struct {
120+
AwsAccountId string `yaml:"aws_account_id"`
121+
AwsRegion string `yaml:"aws_region,omitempty"`
122+
CognitoPoolId string `yaml:"cognito_identity_pool_id"`
123+
SessionDuration int `yaml:"session_duration"`
124+
}
125+
117126
type GenerateProjectsConfigYaml struct {
118127
Include string `yaml:"include"`
119128
Exclude string `yaml:"exclude"`
120129
Terragrunt bool `yaml:"terragrunt"`
121130
Blocks []BlockYaml `yaml:"blocks"`
122131
TerragruntParsingConfig *TerragruntParsingConfig `yaml:"terragrunt_parsing,omitempty"`
123132
AwsRoleToAssume *AssumeRoleForProjectConfig `yaml:"aws_role_to_assume,omitempty"`
133+
AwsCognitoOidcConfig *AwsCognitoOidcConfig `yaml:"aws_cognito_oidc,omitempty"`
124134
}
125135

126136
type TerragruntParsingConfig struct {
@@ -149,6 +159,7 @@ type TerragruntParsingConfig struct {
149159
ExecutionOrderGroups *bool `yaml:"executionOrderGroups"`
150160
WorkflowFile string `yaml:"workflow_file"`
151161
AwsRoleToAssume *AssumeRoleForProjectConfig `yaml:"aws_role_to_assume,omitempty"`
162+
AwsCognitoOidcConfig *AwsCognitoOidcConfig `yaml:"aws_cognito_oidc,omitempty"`
152163
}
153164

154165
func (p *ProjectYaml) UnmarshalYAML(unmarshal func(interface{}) error) error {

libs/go.mod

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ require (
66
cloud.google.com/go/storage v1.41.0
77
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2
88
github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.2.0
9-
github.com/aws/aws-sdk-go-v2 v1.27.0
9+
github.com/aws/aws-sdk-go-v2 v1.31.0
1010
github.com/aws/aws-sdk-go-v2/config v1.27.16
1111
github.com/aws/aws-sdk-go-v2/credentials v1.17.16
1212
github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.13.20
1313
github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.20
14+
github.com/aws/aws-sdk-go-v2/service/cognitoidentity v1.26.3
1415
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.32.6
1516
github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3
1617
github.com/aws/aws-sdk-go-v2/service/sts v1.28.10
@@ -77,8 +78,8 @@ require (
7778
github.com/aws/aws-sdk-go v1.51.21 // indirect
7879
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect
7980
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect
80-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect
81-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect
81+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect
82+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect
8283
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
8384
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 // indirect
8485
github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.20.8 // indirect

0 commit comments

Comments
 (0)