Skip to content

Commit e245e2c

Browse files
authored
fix: resolve region only when profile credentials require it (#582)
1 parent f5a22c5 commit e245e2c

File tree

2 files changed

+31
-28
lines changed

2 files changed

+31
-28
lines changed

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/ProfileCredentialsProvider.kt

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ import aws.smithy.kotlin.runtime.http.engine.HttpClientEngine
1717
import aws.smithy.kotlin.runtime.io.Closeable
1818
import aws.smithy.kotlin.runtime.logging.Logger
1919
import aws.smithy.kotlin.runtime.time.TimestampFormat
20+
import aws.smithy.kotlin.runtime.util.LazyAsyncValue
2021
import aws.smithy.kotlin.runtime.util.Platform
2122
import aws.smithy.kotlin.runtime.util.PlatformProvider
23+
import aws.smithy.kotlin.runtime.util.asyncLazy
2224

2325
/**
2426
* A [CredentialsProvider] that gets credentials from a profile in `~/.aws/config` or the shared credentials
@@ -74,7 +76,6 @@ public class ProfileCredentialsProvider(
7476
private val platformProvider: PlatformProvider = Platform,
7577
private val httpClientEngine: HttpClientEngine? = null,
7678
) : CredentialsProvider, Closeable {
77-
7879
private val namedProviders = mapOf(
7980
"Environment" to EnvironmentCredentialsProvider(platformProvider::getenv),
8081
"Ec2InstanceMetadata" to ImdsCredentialsProvider(
@@ -99,7 +100,7 @@ public class ProfileCredentialsProvider(
99100

100101
// if profile is overridden for this provider, attempt to resolve it from there first
101102
val profileOverride = profileName?.let { profiles[it] }
102-
val region = region ?: profileOverride?.get("region") ?: resolveRegion(platformProvider)
103+
val region = asyncLazy { region ?: profileOverride?.get("region") ?: resolveRegion(platformProvider) }
103104

104105
val leaf = chain.leaf.toCredentialsProvider(region)
105106
logger.debug { "Resolving credentials from ${chain.leaf.description()}" }
@@ -121,34 +122,39 @@ public class ProfileCredentialsProvider(
121122
}
122123
}
123124

124-
private fun LeafProvider.toCredentialsProvider(region: String): CredentialsProvider = when (this) {
125-
is LeafProvider.NamedSource -> namedProviders[name] ?: throw ProviderConfigurationException("unknown credentials source: $name")
126-
is LeafProvider.AccessKey -> StaticCredentialsProvider(credentials)
127-
is LeafProvider.WebIdentityTokenRole -> StsWebIdentityCredentialsProvider(
128-
roleArn,
129-
webIdentityTokenFile,
130-
region = region,
131-
roleSessionName = sessionName,
132-
platformProvider = platformProvider,
133-
httpClientEngine = httpClientEngine
134-
)
135-
is LeafProvider.Sso -> SsoCredentialsProvider(
136-
accountId = ssoAccountId,
137-
roleName = ssoRoleName,
138-
startUrl = ssoStartUrl,
139-
ssoRegion = ssoRegion,
140-
httpClientEngine = httpClientEngine,
141-
platformProvider = platformProvider
142-
)
143-
}
125+
private suspend fun LeafProvider.toCredentialsProvider(region: LazyAsyncValue<String>): CredentialsProvider =
126+
when (this) {
127+
is LeafProvider.NamedSource -> namedProviders[name]
128+
?: throw ProviderConfigurationException("unknown credentials source: $name")
129+
130+
is LeafProvider.AccessKey -> StaticCredentialsProvider(credentials)
131+
132+
is LeafProvider.WebIdentityTokenRole -> StsWebIdentityCredentialsProvider(
133+
roleArn,
134+
webIdentityTokenFile,
135+
region = region.get(),
136+
roleSessionName = sessionName,
137+
platformProvider = platformProvider,
138+
httpClientEngine = httpClientEngine
139+
)
140+
141+
is LeafProvider.Sso -> SsoCredentialsProvider(
142+
accountId = ssoAccountId,
143+
roleName = ssoRoleName,
144+
startUrl = ssoStartUrl,
145+
ssoRegion = ssoRegion,
146+
httpClientEngine = httpClientEngine,
147+
platformProvider = platformProvider
148+
)
149+
}
144150

145-
private fun RoleArn.toCredentialsProvider(
151+
private suspend fun RoleArn.toCredentialsProvider(
146152
creds: Credentials,
147-
region: String
153+
region: LazyAsyncValue<String>,
148154
): CredentialsProvider = StsAssumeRoleCredentialsProvider(
149155
credentialsProvider = StaticCredentialsProvider(creds),
150156
roleArn = roleArn,
151-
region = region,
157+
region = region.get(),
152158
roleSessionName = sessionName,
153159
externalId = externalId,
154160
httpClientEngine = httpClientEngine

aws-runtime/aws-config/common/test/aws/sdk/kotlin/runtime/auth/credentials/ProfileCredentialsProviderTest.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ class ProfileCredentialsProviderTest {
2222
fs = mapOf(
2323
"config" to """
2424
[default]
25-
region = us-east-2
2625
aws_access_key_id = AKID-Default
2726
aws_secret_access_key = Default-Secret
2827
""".trimIndent()
@@ -50,7 +49,6 @@ class ProfileCredentialsProviderTest {
5049
aws_secret_access_key = Default-Secret
5150
5251
[profile my-profile]
53-
region = us-east-2
5452
aws_access_key_id = AKID-Profile
5553
aws_secret_access_key = Profile-Secret
5654
""".trimIndent()
@@ -74,7 +72,6 @@ class ProfileCredentialsProviderTest {
7472
env = mapOf(
7573
"AWS_CONFIG_FILE" to "config",
7674
"AWS_PROFILE" to "my-profile",
77-
"AWS_REGION" to "us-west-1"
7875
),
7976
fs = mapOf(
8077
"config" to """

0 commit comments

Comments
 (0)