Skip to content

Commit 5375c91

Browse files
feat(credential-providers): collect credential providers in single package (#2672)
* feat(credential-providers): collect credential providers in public facing package * feat(credential-providers): support temporary credentials provider Equivalent to ChainableTemporaryCredentials class in v2 SDK. The provider is not re-exported from standalone package or used in the credential- provider-ini because the roleAssumers function interface in other packages does not suite the usecase of this provider. In roleAssumer interface, the master credential is required. It's not true for fromTemporaryCredentials, where master credentials can be skipped, in which case the default credential will be used. * docs: remove inline import to improve docs * docs(credentail-providers): wrap other providers and add README * docs(credential-provider): mark other provider as internal * docs(upgrading): update the upgrading guide * docs: use clientConfig to override all creds providers client config Co-authored-by: Trivikram Kamat <[email protected]>
1 parent fac5f27 commit 5375c91

34 files changed

+1983
-567
lines changed

UPGRADING.md

+49-64
Original file line numberDiff line numberDiff line change
@@ -221,33 +221,25 @@ Default credential provider is how SDK resolve the AWS credential if you DO NOT
221221
masterCredentials during instantiation, precluding the ability to refresh credentials which require intermediate, temporary credentials.
222222

223223
The original [`TemporaryCredentials`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/TemporaryCredentials.html)
224-
has been **deprecated** in favor of `ChainableTemporaryCredentials` in v2 and ``
224+
has been **deprecated** in favor of `ChainableTemporaryCredentials` in v2.
225225

226-
- **v3**: Partially supported. You can retrieve the temporary credential from STS with the
227-
[role assumer function based on `sts:AssumeRole`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-sts/globals.html#getdefaultroleassumer). The difference to v2 is that `sts:getSessionToken` is not called
228-
if no `RoleArn` is supplied. Please open a [feature request](https://github.com/aws/aws-sdk-js-v3/issues/new?assignees=&labels=feature-request&template=---feature-request.md&title=)
229-
if you need it.
230-
Here's an example:
226+
- **v3**: [`Temporary Credentials Provider`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_providers.html).
227+
You can call `fromTemporaryCredentials()` from `@aws-sdk/credential-providers` package. Here's an example:
231228

232229
```javascript
233230
import { FooClient } from "@aws-sdk/client-foo";
234-
import { getDefaultRoleAssumer } from "@aws-sdk/client-sts"; // ES6 import
231+
import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; // ES6 import
235232
// const { FooClient } = require("@aws-sdk/client-foo");
236-
// const { getDefaultRoleAssumer } = require("@aws-sdk/client-sts"); // CommonJS import
233+
// const { fromTemporaryCredentials } = require("@aws-sdk/credential-providers"); // CommonJS import
237234

238-
/* role assumer function that calls sts:AssumeRole API */
239-
const roleAssumer = getDefaultRoleAssumer();
240-
const sourceCredential = {
241-
/* A credential can be a credential object or an async function that returns a credential object */
235+
const sourceCredentials = {
236+
// A credential can be a credential object or an async function that returns a credential object
242237
};
243-
/* A credential can be a credential object or an async function that returns a credential object */
244-
const derivativeCredentials = () =>
245-
roleAssumer(sourceCredentials, {
246-
RoleArn,
247-
RoleSessionName,
248-
});
249238
const client = new FooClient({
250-
credentials: derivativeCredentials,
239+
credentials: fromTemporaryCredentials({
240+
masterCredentials: sourceCredentials,
241+
params: { RoleArn },
242+
}),
251243
});
252244
```
253245

@@ -257,11 +249,11 @@ Load credentials from Cognito Identity service, normally used in browsers.
257249

258250
- **v2**: [`CognitoIdentityCredentials`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html)
259251
Represents credentials retrieved from STS Web Identity Federation using the Amazon Cognito Identity service.
260-
- **v3**: [`Cognito Identity Credential Provider`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_provider_cognito_identity.html#fromcognitoidentity-1)
261-
The [`@aws/credential-provider-cognito-identity` package](https://www.npmjs.com/package/@aws-sdk/credential-provider-cognito-identity)
262-
provides two credential provider functions, one of which [`fromCognitoIdentity`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_provider_cognito_identity.html#fromcognitoidentity-1)
252+
- **v3**: [`Cognito Identity Credential Provider`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_providers.html)
253+
The [`@aws/credential-providers` package](https://www.npmjs.com/package/@aws-sdk/credential-providers)
254+
provides two credential provider functions, one of which [`fromCognitoIdentity`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_providers.html)
263255
takes an identity ID and calls `cognitoIdentity:GetCredentialsForIdentity`, while the other
264-
[`fromCognitoIdentityPool`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_provider_cognito_identity.html#fromcognitoidentitypool-1)
256+
[`fromCognitoIdentityPool`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_providers.html)
265257
takes an identity pool ID, calls `cognitoIdentity:GetId` on the first invocation, and then calls`fromCognitoIdentity`.
266258
Subsequent invocations of the latter do not re-invoke GetId
267259

@@ -272,18 +264,13 @@ Load credentials from Cognito Identity service, normally used in browsers.
272264

273265
```javascript
274266
// fromCognitoIdentityPool example
275-
import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity";
276-
import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; // ES6 import
277-
// const { fromCognitoIdentityPool } = require("@aws-sdk/credential-provider-cognito-identity");
278-
// const { CognitoIdentityClient } = require("@aws-sdk/client-cognito-identity"); // CommonJS import
267+
import { fromCognitoIdentityPool } from "@aws-sdk/credential-providers"; // ES6 import
268+
// const { fromCognitoIdentityPool } = require("@aws-sdk/credential-providers"); // CommonJS import
279269

280270
const client = new FooClient({
281271
region: "us-east-1",
282272
credentials: fromCognitoIdentityPool({
283-
client: new CognitoIdentityClient({
284-
// specify Cognito Identity client config here
285-
region: "us-east-1",
286-
}),
273+
clientConfig: cognitoIdentityClientConfig, // Optional
287274
identityPoolId: "us-east-1:1699ebc0-7900-4099-b910-2df94f52a030",
288275
customRoleArn: "arn:aws:iam::1234567890:role/MYAPP-CognitoIdentity", // Optional
289276
logins: {
@@ -298,15 +285,13 @@ Load credentials from Cognito Identity service, normally used in browsers.
298285

299286
```javascript
300287
// fromCognitoIdentity example
301-
import { fromCognitoIdentity } from "@aws-sdk/credential-provider-cognito-identity";
302-
import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity"; // ES6 import
288+
import { fromCognitoIdentity } from "@aws-sdk/credential-providers"; // ES6 import
303289
// const { fromCognitoIdentity } = require("@aws-sdk/credential-provider-cognito-identity");
304-
// const { CognitoIdentityClient } = require("@aws-sdk/client-cognito-identity"); // CommonJS import
305290

306291
const client = new FooClient({
307292
region: "us-east-1",
308293
credentials: fromCognitoIdentity({
309-
client: new CognitoIdentityClient({ region: "us-east-1" }),
294+
clientConfig: cognitoIdentityClientConfig, // Optional
310295
identityId: "us-east-1:128d0a74-c82f-4553-916d-90053e4a8b0f",
311296
customRoleArn: "arn:aws:iam::1234567890:role/MYAPP-CognitoIdentity", // Optional
312297
logins: {
@@ -324,11 +309,12 @@ Load credentials from Cognito Identity service, normally used in browsers.
324309
Represents credentials received from the metadata service on an EC2 instance.
325310

326311
- **v2**: [`EC2MetadataCredentials`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html)
327-
- **v3**: [`fromInstanceMetadata`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_provider_imds.html#frominstancemetadata-1): Creates a credential provider that will source credentials from the EC2 Instance Metadata Service.
312+
- **v3**: [`fromInstanceMetadata`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_providers.html):
313+
Creates a credential provider that will source credentials from the EC2 Instance Metadata Service.
328314

329315
```javascript
330-
import { fromInstanceMetadata } from "@aws-sdk/credential-provider-imds"; // ES6 import
331-
// const { fromInstanceMetadata } = require("@aws-sdk/credential-provider-imds"); // CommonJS import
316+
import { fromInstanceMetadata } from "@aws-sdk/credential-providers"; // ES6 import
317+
// const { fromInstanceMetadata } = require("@aws-sdk/credential-providers"); // CommonJS import
332318

333319
const client = new FooClient({
334320
credentials: fromInstanceMetadata({
@@ -345,11 +331,11 @@ URI specified by the `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` or the `AWS_CONTAI
345331
variable.
346332

347333
- **v2**: `ECSCredentials` or [`RemoteCredentials`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/RemoteCredentials.html).
348-
- **v3**: [`fromContainerMetadata`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_provider_imds.html#fromcontainermetadata-1) creates a credential provider that will source credentials from the ECS Container Metadata Service.
334+
- **v3**: [`fromContainerMetadata`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_providers.html)
335+
creates a credential provider that will source credentials from the ECS Container Metadata Service.
349336

350337
```javascript
351-
import { fromContainerMetadata } from "@aws-sdk/credential-provider-imds"; // ES6 import
352-
// const { fromContainerMetadata } = require("@aws-sdk/credential-provider-imds"); // CommonJS import
338+
import { fromContainerMetadata } from "@aws-sdk/credential-providers"; // ES6 import
353339

354340
const client = new FooClient({
355341
credentials: fromContainerMetadata({
@@ -382,13 +368,11 @@ refer to the [shared config and credentials files document](https://docs.aws.ama
382368
for more information.
383369

384370
- **v2**: [`SharedIniFileCredentials`](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SharedIniFileCredentials.html)
385-
- **v3**: [`fromIni`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_provider_ini.html).
371+
- **v3**: [`fromIni`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_providers.html).
386372

387373
```javascript
388-
import { fromIni } from "@aws-sdk/credential-provider-ini";
389-
import { getDefaultRoleAssumer, getDefaultRoleAssumerWithWebIdentity } from "@aws-sdk/client-sts"; // ES6 import
390-
// const { fromIni } from("@aws-sdk/credential-provider-ini");
391-
// const { getDefaultRoleAssumer, getDefaultRoleAssumerWithWebIdentity } = require("@aws-sdk/client-sts"); // CommonJS import
374+
import { fromIni } from "@aws-sdk/credential-providers";
375+
// const { fromIni } from("@aws-sdk/credential-providers");
392376

393377
const client = new FooClient({
394378
credentials: fromIni({
@@ -399,8 +383,7 @@ for more information.
399383
return "some_code";
400384
}, // Optional
401385
profile: "default", // Optional
402-
roleAssumer: getDefaultRoleAssumer(), // Optional. Required if you specify role to assume
403-
roleAssumerWithWebIdentity: getDefaultRoleAssumerWithWebIdentity(), // Optional. Required if you specify role to assume using `sts:AssumeRoleWithWebIdentity` API
386+
clientConfig: { region }, // Optional
404387
}),
405388
});
406389
```
@@ -413,17 +396,18 @@ Retrieves credentials using OIDC token from a file on disk. It's commonly used i
413396
- **v3**: [`fromTokenFile`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_provider_web_identity.html#fromtokenfile-1)
414397

415398
```javascript
416-
import { fromTokenFile } from "@aws-sdk/credential-provider-web-identity";
417-
import { getDefaultRoleAssumerWithWebIdentity } from "@aws-sdk/client-sts"; // ES6 import
418-
// const { fromIni } from("@aws-sdk/credential-provider-ini");
419-
// const { getDefaultRoleAssumerWithWebIdentity } = require("@aws-sdk/client-sts"); // CommonJS import
399+
import { fromTokenFile } from "@aws-sdk/credential-providers"; // ES6 import
400+
// const { fromIni } from("@aws-sdk/credential-providers"); // CommonJS import
420401

421402
const client = new FooClient({
422403
credentials: fromTokenFile({
423-
roleAssumerWithWebIdentity: getDefaultRoleAssumerWithWebIdentity(),
424-
roleArn: "arn:xxxx" // Optional. Otherwise read from `AWS_ROLE_ARN` environmental variable
425-
roleSessionName: "session:a" // Optional. Otherwise read from `AWS_ROLE_SESSION_NAME` environmental variable
426-
})
404+
// Optional. If skipped, read from `AWS_ROLE_ARN` environmental variable
405+
roleArn: "arn:xxxx",
406+
// Optional. If skipped, read from `AWS_ROLE_SESSION_NAME` environmental variable
407+
roleSessionName: "session:a",
408+
// Optional. STS client config to make the assume role request.
409+
clientConfig: { region },
410+
}),
427411
});
428412
```
429413

@@ -435,17 +419,18 @@ Retrieves credentials from STS web identity federation support.
435419
- **v3**: [`fromWebToken`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_credential_provider_web_identity.html#fromwebtoken-1)
436420

437421
```javascript
438-
import { fromWebToken } from "@aws-sdk/credential-provider-web-identity";
439-
import { getDefaultRoleAssumerWithWebIdentity } from "@aws-sdk/client-sts"; // ES6 import
440-
// const { fromWebToken } from("@aws-sdk/credential-provider-web-identity");
441-
// const { getDefaultRoleAssumerWithWebIdentity } = require("@aws-sdk/client-sts"); // CommonJS import
422+
import { fromWebToken } from "@aws-sdk/credential-providers"; // ES6 import
423+
// const { fromWebToken } from("@aws-sdk/credential-providers"); // CommonJS import
442424

443425
const client = new FooClient({
444426
credentials: fromWebToken({
445-
roleAssumerWithWebIdentity: getDefaultRoleAssumerWithWebIdentity(),
446-
roleArn: "arn:xxxx" // Otherwise read from `AWS_ROLE_ARN` environmental variable
447-
roleSessionName: "session:a" // Otherwise read from `AWS_ROLE_SESSION_NAME` environmental variable
448-
})
427+
// Optional. If skipped, read from `AWS_ROLE_ARN` environmental variable
428+
roleArn: "arn:xxxx",
429+
// Optional. If skipped, read from `AWS_ROLE_SESSION_NAME` environmental variable
430+
roleSessionName: "session:a",
431+
// Optional. STS client config to make the assume role request.
432+
clientConfig: { region },
433+
}),
449434
});
450435
```
451436

packages/credential-provider-cognito-identity/README.md

+7
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,10 @@
22

33
[![NPM version](https://img.shields.io/npm/v/@aws-sdk/credential-provider-cognito-identity/latest.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-cognito-identity)
44
[![NPM downloads](https://img.shields.io/npm/dm/@aws-sdk/credential-provider-cognito-identity.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-cognito-identity)
5+
6+
> An internal package
7+
8+
## Usage
9+
10+
You probably shouldn't, at least directly. Please use [@aws-sdk/credential-providers](https://www.npmjs.com/package/@aws-sdk/credential-providers)
11+
instead.

packages/credential-provider-env/README.md

+4-15
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,9 @@
33
[![NPM version](https://img.shields.io/npm/v/@aws-sdk/credential-provider-env/latest.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-env)
44
[![NPM downloads](https://img.shields.io/npm/dm/@aws-sdk/credential-provider-env.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-env)
55

6-
## AWS Credential Provider for Node.JS - Environment Variables
6+
> An internal package
77
8-
This module provides a `CredentialProvider` function, `fromEnv`, that reads from
9-
the following environment variables:
8+
## Usage
109

11-
- `AWS_ACCESS_KEY_ID` - The access key for your AWS account.
12-
- `AWS_SECRET_ACCESS_KEY` - The secret key for your AWS account.
13-
- `AWS_SESSION_TOKEN` - The session key for your AWS account. This is only
14-
needed when you are using temporary credentials.
15-
- `AWS_CREDENTIAL_EXPIRATION` - The expiration time of the credentials contained
16-
in the environment variables described above. This value must be in a format
17-
compatible with the [ISO-8601 standard](https://en.wikipedia.org/wiki/ISO_8601)
18-
and is only needed when you are using temporary credentials.
19-
20-
If either the `AWS_ACCESS_KEY_ID` or `AWS_SECRET_ACCESS_KEY` environment
21-
variable is not set or contains a falsy value, the promise returned by the
22-
`fromEnv` function will be rejected.
10+
You probably shouldn't, at least directly. Please use [@aws-sdk/credential-providers](https://www.npmjs.com/package/@aws-sdk/credential-providers)
11+
instead.

packages/credential-provider-imds/README.md

+4-28
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,9 @@
33
[![NPM version](https://img.shields.io/npm/v/@aws-sdk/credential-provider-imds/latest.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-imds)
44
[![NPM downloads](https://img.shields.io/npm/dm/@aws-sdk/credential-provider-imds.svg)](https://www.npmjs.com/package/@aws-sdk/credential-provider-imds)
55

6-
## AWS Credential Provider for Node.JS - Instance and Container Metadata
6+
> An internal package
77
8-
This module provides two `CredentialProvider` factory functions,
9-
`fromContainerMetadata` and `fromInstanceMetadata`, that will create
10-
`CredentialProvider` functions that read from the ECS container metadata service
11-
and the EC2 instance metadata service, respectively.
8+
## Usage
129

13-
A `CredentialProvider` function created with `fromContainerMetadata` will return
14-
a promise that will resolve with credentials for the IAM role associated with
15-
containers in an Amazon ECS task. Please see [IAM Roles for Tasks](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)
16-
for more information on using IAM roles with Amazon ECS.
17-
18-
A `CredentialProvider` function created with `fromInstanceMetadata` will return
19-
a promise that will resolve with credentials for the IAM role associated with
20-
an EC2 instance.
21-
Please see [IAM Roles for Amazon EC2](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)
22-
for more information on using IAM roles with Amazon EC2.
23-
Both IMDSv1 (a request/response method) and IMDSv2 (a session-oriented method) are supported.
24-
Please see [Configure the instance metadata service](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html) for more information.
25-
26-
## Supported configuration
27-
28-
You may customize how credentials are resolved by providing an options hash to
29-
the `fromContainerMetadata` and `fromInstanceMetadata` factory functions. The
30-
following options are supported:
31-
32-
- `timeout` - The connection timeout (in milliseconds) to apply to any remote
33-
requests. If not specified, a default value of `1000` (one second) is used.
34-
- `maxRetries` - The maximum number of times any HTTP connections should be
35-
retried. If not specified, a default value of `0` will be used.
10+
You probably shouldn't, at least directly. Please use [@aws-sdk/credential-providers](https://www.npmjs.com/package/@aws-sdk/credential-providers)
11+
instead.

0 commit comments

Comments
 (0)