diff --git a/discovery/aws/ec2.go b/discovery/aws/ec2.go index 962c60ed17..deefa52e9c 100644 --- a/discovery/aws/ec2.go +++ b/discovery/aws/ec2.go @@ -93,6 +93,7 @@ type EC2SDConfig struct { SecretKey config.Secret `yaml:"secret_key,omitempty"` Profile string `yaml:"profile,omitempty"` RoleARN string `yaml:"role_arn,omitempty"` + ExternalID string `yaml:"external_id,omitempty"` RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` Port int `yaml:"port"` Filters []*EC2Filter `yaml:"filters"` @@ -225,7 +226,11 @@ func (d *EC2Discovery) ec2Client(ctx context.Context) (ec2Client, error) { // If the role ARN is set, assume the role to get credentials and set the credentials provider in the config. if d.cfg.RoleARN != "" { - assumeProvider := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), d.cfg.RoleARN) + assumeProvider := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), d.cfg.RoleARN, func(o *stscreds.AssumeRoleOptions) { + if d.cfg.ExternalID != "" { + o.ExternalID = aws.String(d.cfg.ExternalID) + } + }) cfg.Credentials = aws.NewCredentialsCache(assumeProvider) } diff --git a/discovery/aws/lightsail.go b/discovery/aws/lightsail.go index 39e4716957..9f200b69e2 100644 --- a/discovery/aws/lightsail.go +++ b/discovery/aws/lightsail.go @@ -75,6 +75,7 @@ type LightsailSDConfig struct { SecretKey config.Secret `yaml:"secret_key,omitempty"` Profile string `yaml:"profile,omitempty"` RoleARN string `yaml:"role_arn,omitempty"` + ExternalID string `yaml:"external_id,omitempty"` RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` Port int `yaml:"port"` @@ -184,7 +185,11 @@ func (d *LightsailDiscovery) lightsailClient(ctx context.Context) (*lightsail.Cl // If the role ARN is set, assume the role to get credentials and set the credentials provider in the config. if d.cfg.RoleARN != "" { - assumeProvider := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), d.cfg.RoleARN) + assumeProvider := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), d.cfg.RoleARN, func(o *stscreds.AssumeRoleOptions) { + if d.cfg.ExternalID != "" { + o.ExternalID = aws.String(d.cfg.ExternalID) + } + }) cfg.Credentials = aws.NewCredentialsCache(assumeProvider) } diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 8346f58d1b..c0cc50404d 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -1861,6 +1861,9 @@ See below for the configuration options for EC2 discovery: # AWS Role ARN, an alternative to using AWS API keys. [ role_arn: ] +# Optional External ID that can go along with role_arn. +[ external_id: ] + # Refresh interval to re-read the instance list. [ refresh_interval: | default = 60s ] @@ -2747,6 +2750,9 @@ See below for the configuration options for Lightsail discovery: # AWS Role ARN, an alternative to using AWS API keys. [ role_arn: ] +# Optional External ID that can go along with role_arn. +[ external_id: ] + # Refresh interval to re-read the instance list. [ refresh_interval: | default = 60s ]