Skip to content

Commit 9ef4e72

Browse files
authored
fix(cli): failure to get credentials when session token is not set (#32134)
In Node.js, if you assign `undefined` to an environment variable, that variable ends up having the string `"undefined"`. If we are using IAM user credentials, `AWS_SESSION_TOKEN` should not be set, but because we were not handling this edge case, it was getting assigned an invalid value: ``` Welcome to Node.js v22.9.0. Type ".help" for more information. > process.env.AWS_SESSION_TOKEN || process.env.AMAZON_SESSION_TOKEN undefined > process.env.AWS_SESSION_TOKEN = process.env.AWS_SESSION_TOKEN || process.env.AMAZON_SESSION_TOKEN undefined > process.env.AWS_SESSION_TOKEN 'undefined' ``` Closes #32120. ### Checklist - [ ] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent 339fed1 commit 9ef4e72

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

packages/aws-cdk/lib/api/aws-auth/awscli-compatible.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,16 @@ function caBundlePathFromEnvironment(): string | undefined {
182182
function shouldPrioritizeEnv() {
183183
const id = process.env.AWS_ACCESS_KEY_ID || process.env.AMAZON_ACCESS_KEY_ID;
184184
const key = process.env.AWS_SECRET_ACCESS_KEY || process.env.AMAZON_SECRET_ACCESS_KEY;
185-
process.env.AWS_SESSION_TOKEN = process.env.AWS_SESSION_TOKEN || process.env.AMAZON_SESSION_TOKEN;
186185

187186
if (!!id && !!key) {
188187
process.env.AWS_ACCESS_KEY_ID = id;
189188
process.env.AWS_SECRET_ACCESS_KEY = key;
189+
190+
const sessionToken = process.env.AWS_SESSION_TOKEN ?? process.env.AMAZON_SESSION_TOKEN;
191+
if (sessionToken) {
192+
process.env.AWS_SESSION_TOKEN = sessionToken;
193+
}
194+
190195
return true;
191196
}
192197

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { AwsCliCompatible } from '../../../lib/api/aws-auth/awscli-compatible';
2+
3+
describe('Session token', () => {
4+
beforeEach(() => {
5+
process.env.AWS_ACCESS_KEY_ID = 'foo';
6+
process.env.AWS_SECRET_ACCESS_KEY = 'bar';
7+
});
8+
9+
test('does not mess up with session token env variables if they are undefined', async () => {
10+
// Making sure these variables are not defined
11+
delete process.env.AWS_SESSION_TOKEN;
12+
delete process.env.AMAZON_SESSION_TOKEN;
13+
14+
await AwsCliCompatible.credentialChainBuilder();
15+
16+
expect(process.env.AWS_SESSION_TOKEN).toBeUndefined();
17+
});
18+
19+
test('preserves AWS_SESSION_TOKEN if it is defined', async () => {
20+
process.env.AWS_SESSION_TOKEN = 'aaa';
21+
delete process.env.AMAZON_SESSION_TOKEN;
22+
23+
await AwsCliCompatible.credentialChainBuilder();
24+
25+
expect(process.env.AWS_SESSION_TOKEN).toEqual('aaa');
26+
});
27+
28+
test('assigns AWS_SESSION_TOKEN if it is not defined but AMAZON_SESSION_TOKEN is', async () => {
29+
delete process.env.AWS_SESSION_TOKEN;
30+
process.env.AMAZON_SESSION_TOKEN = 'aaa';
31+
32+
await AwsCliCompatible.credentialChainBuilder();
33+
34+
expect(process.env.AWS_SESSION_TOKEN).toEqual('aaa');
35+
});
36+
37+
test('preserves AWS_SESSION_TOKEN if both are defined', async () => {
38+
process.env.AWS_SESSION_TOKEN = 'aaa';
39+
process.env.AMAZON_SESSION_TOKEN = 'bbb';
40+
41+
await AwsCliCompatible.credentialChainBuilder();
42+
43+
expect(process.env.AWS_SESSION_TOKEN).toEqual('aaa');
44+
});
45+
});

0 commit comments

Comments
 (0)