Skip to content

Commit 24f602a

Browse files
feat(Route53): Add support for RoleArn and ExternalId #3816 (#3817)
Co-authored-by: Tom Limoncelli <[email protected]>
1 parent f365902 commit 24f602a

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

documentation/provider/route53.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,22 @@ Example:
5959
```
6060
{% endcode %}
6161

62+
Alternatively, this provider also supports `RoleArn` with an optional `ExternalId`
63+
64+
Example:
65+
66+
{% code title="creds.json" %}
67+
```json
68+
{
69+
"r53_main": {
70+
"TYPE": "ROUTE53",
71+
"RoleArn": "arn:aws:iam::123456789012:role/ExampleRole",
72+
"ExternalId": "123456789012"
73+
}
74+
}
75+
```
76+
{% endcode %}
77+
6278
You can find some other ways to authenticate to Route53 in the [go sdk configuration](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html).
6379

6480
## Metadata

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ require (
5959
require (
6060
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1
6161
github.com/G-Core/gcore-dns-sdk-go v0.3.3
62+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.6
6263
github.com/centralnicgroup-opensource/rtldev-middleware-go-sdk/v5 v5.0.18
6364
github.com/containrrr/shoutrrr v0.8.0
6465
github.com/failsafe-go/failsafe-go v0.9.1

providers/route53/route53Provider.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ import (
2020
"github.com/aws/aws-sdk-go-v2/aws"
2121
"github.com/aws/aws-sdk-go-v2/config"
2222
"github.com/aws/aws-sdk-go-v2/credentials"
23+
"github.com/aws/aws-sdk-go-v2/credentials/stscreds"
2324
r53 "github.com/aws/aws-sdk-go-v2/service/route53"
2425
r53Types "github.com/aws/aws-sdk-go-v2/service/route53/types"
2526
r53d "github.com/aws/aws-sdk-go-v2/service/route53domains"
2627
r53dTypes "github.com/aws/aws-sdk-go-v2/service/route53domains/types"
28+
"github.com/aws/aws-sdk-go-v2/service/sts"
2729
)
2830

2931
type route53Provider struct {
@@ -50,7 +52,7 @@ func newRoute53(m map[string]string, _ json.RawMessage) (*route53Provider, error
5052
config.WithRegion("us-east-1"),
5153
}
5254

53-
keyID, secretKey, tokenID := m["KeyId"], m["SecretKey"], m["Token"]
55+
keyID, secretKey, tokenID, roleArn, externalId := m["KeyId"], m["SecretKey"], m["Token"], m["RoleArn"], m["ExternalId"]
5456
// Token is optional and left empty unless required
5557
if keyID != "" || secretKey != "" {
5658
optFns = append(optFns, config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(keyID, secretKey, tokenID)))
@@ -61,6 +63,20 @@ func newRoute53(m map[string]string, _ json.RawMessage) (*route53Provider, error
6163
return nil, err
6264
}
6365

66+
if roleArn != "" {
67+
stsClient := sts.NewFromConfig(config)
68+
sessionName := fmt.Sprintf("dnscontrol-route53-%d", time.Now().Unix())
69+
70+
var assumeOpts []func(*stscreds.AssumeRoleOptions)
71+
if externalId != "" {
72+
assumeOpts = append(assumeOpts, func(o *stscreds.AssumeRoleOptions) { o.ExternalID = aws.String(externalId) })
73+
}
74+
assumeOpts = append(assumeOpts, func(o *stscreds.AssumeRoleOptions) { o.RoleSessionName = sessionName })
75+
76+
stsCredsProvider := stscreds.NewAssumeRoleProvider(stsClient, roleArn, assumeOpts...)
77+
config.Credentials = aws.NewCredentialsCache(stsCredsProvider)
78+
}
79+
6480
var dls *string
6581
if val, ok := m["DelegationSet"]; ok {
6682
printer.Printf("ROUTE53 DelegationSet %s configured\n", val)

0 commit comments

Comments
 (0)