Skip to content

Commit 5895251

Browse files
sichanyooSichan Yoo
andauthored
feat: Decompose CRT default chain into individual wrappers (#1926)
Co-authored-by: Sichan Yoo <[email protected]>
1 parent 707152b commit 5895251

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/AWSClientConfigDefaultsProvider.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77

88
@_spi(FileBasedConfig) import AWSSDKCommon
9-
@_spi(DefaultAWSCredentialIdentityResolverChain) import AWSSDKIdentity
9+
import AWSSDKIdentity
1010
import SmithyIdentity
1111
import SmithyIdentityAPI
1212
import struct ClientRuntime.DefaultSDKRuntimeConfiguration
@@ -28,13 +28,10 @@ public class AWSClientConfigDefaultsProvider: ClientConfigDefaultsProvider {
2828
_ awsCredentialIdentityResolver: (any AWSCredentialIdentityResolver)? = nil
2929
) throws -> any AWSCredentialIdentityResolver {
3030
let resolvedAWSCredentialIdentityResolver: any AWSCredentialIdentityResolver
31-
let fileBasedConfig = try CRTFileBasedConfiguration.make()
3231
if let awsCredentialIdentityResolver {
3332
resolvedAWSCredentialIdentityResolver = awsCredentialIdentityResolver
3433
} else {
35-
resolvedAWSCredentialIdentityResolver = try DefaultAWSCredentialIdentityResolverChain(
36-
fileBasedConfig: fileBasedConfig
37-
)
34+
resolvedAWSCredentialIdentityResolver = DefaultAWSCredentialIdentityResolverChain()
3835
}
3936
return resolvedAWSCredentialIdentityResolver
4037
}

Sources/Core/AWSSDKIdentity/Sources/AWSSDKIdentity/AWSCredentialIdentityResolvers/DefaultAWSCredentialIdentityResolverChain.swift

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import class AwsCommonRuntimeKit.CredentialsProvider
99
import ClientRuntime
1010
import protocol SmithyIdentity.AWSCredentialIdentityResolvedByCRT
1111
@_spi(FileBasedConfig) import AWSSDKCommon
12+
import protocol SmithyIdentity.AWSCredentialIdentityResolver
13+
import struct Smithy.Attributes
1214

1315
// swiftlint:disable type_name
1416
// ^ Required to mute swiftlint warning about type name being too long.
@@ -24,21 +26,33 @@ import protocol SmithyIdentity.AWSCredentialIdentityResolvedByCRT
2426
/// 5. EC2 Instance Metadata (IMDSv2)
2527
///
2628
/// The credentials retrieved from the chain are cached for 15 minutes.
27-
public struct DefaultAWSCredentialIdentityResolverChain: AWSCredentialIdentityResolvedByCRT {
28-
public let crtAWSCredentialIdentityResolver: AwsCommonRuntimeKit.CredentialsProvider
29-
29+
public struct DefaultAWSCredentialIdentityResolverChain: AWSCredentialIdentityResolver {
3030
/// Creates a credential identity resolver that uses the default AWS credential identity resolver chain used by most AWS SDKs.
31-
public init() throws {
32-
let fileBasedConfig = try CRTFileBasedConfiguration()
33-
try self.init(fileBasedConfig: fileBasedConfig)
34-
}
31+
public init() {}
32+
33+
public func getIdentity(identityProperties: Attributes?) async throws -> AWSCredentialIdentity {
34+
typealias ResolverFactory = () throws -> any AWSCredentialIdentityResolver
35+
36+
let resolverFactories: [ResolverFactory] = [
37+
{ try EnvironmentAWSCredentialIdentityResolver() },
38+
{ try ProfileAWSCredentialIdentityResolver() },
39+
{ try STSWebIdentityAWSCredentialIdentityResolver() },
40+
{ try ECSAWSCredentialIdentityResolver() },
41+
{ try IMDSAWSCredentialIdentityResolver() }
42+
]
43+
44+
let lastIndex = resolverFactories.count - 1
45+
for index in 0..<lastIndex {
46+
do {
47+
let resolver = try resolverFactories[index]()
48+
return try await resolver.getIdentity(identityProperties: identityProperties)
49+
} catch {
50+
// Continue to the next resolver factory.
51+
}
52+
}
3553

36-
@_spi(DefaultAWSCredentialIdentityResolverChain)
37-
public init(fileBasedConfig: CRTFileBasedConfiguration) throws {
38-
self.crtAWSCredentialIdentityResolver = try AwsCommonRuntimeKit.CredentialsProvider(source: .defaultChain(
39-
bootstrap: SDKDefaultIO.shared.clientBootstrap,
40-
fileBasedConfiguration: fileBasedConfig
41-
))
54+
// The error thrown from the last resolver is not caught and instead gets thrown to caller.
55+
return try await resolverFactories[lastIndex]().getIdentity(identityProperties: identityProperties)
4256
}
4357
}
4458

Sources/Core/AWSSDKIdentity/Tests/AWSSDKIdentityTests/AWSCredentialIdentityResolverTests/DefaultAWSCredentialIdentityResolverChainTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class DefaultAWSCredentialIdentityResolverChainTests: XCTestCase {
1919
unsetenv("AWS_SECRET_ACCESS_KEY")
2020
}
2121

22-
let subject = try DefaultAWSCredentialIdentityResolverChain()
22+
let subject = DefaultAWSCredentialIdentityResolverChain()
2323
let credentials = try await subject.getIdentity()
2424

2525
XCTAssertEqual(credentials.accessKey, "some_access_key_b")

0 commit comments

Comments
 (0)