使用STS assumeRole凭证上传S3失败的问题求助
问题描述
我正尝试集成STS assumeRole身份认证以将文件上传至S3存储桶,但遇到以下问题:
场景1:使用aws-sdk调用sts.assumeRole时持续报错
InvalidClientTokenId: The security token included in the request is invalid -- 823 | at Request.extractError (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/protocol/query.js:50:29) 824 | at Request.callListeners (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/sequential_executor.js:106:20) 825 | at Request.emit (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/sequential_executor.js:78:10) 826 | at Request.emit (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/request.js:686:14) 827 | at Request.transition (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/request.js:22:10) 828 | at AcceptorStateMachine.runTo (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/state_machine.js:14:12) 829 | at /var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/state_machine.js:26:10) 830 | at Request.<anonymous> (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/request.js:38:9) 831 | at Request.<anonymous> (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/request.js:688:12) 832 | at Request.callListeners (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/sequential_executor.js:116:18) { 833 | code: 'InvalidClientTokenId', 834 | time: 2023-05-18T13:59:07.868Z, 835 | requestId: '3bc35552-7494-4605-9380-1fb8743e7d51', 836 | statusCode: 403, 837 | retryable: false, 838 | retryDelay: 62.92943618134528 839 | }
对应的代码片段:
AWS.config.update({ region: 'ap-south-1', maxRetries: 3, accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, sessionToken: process.env.AWS_SESSION_TOKEN, }) const roleToAssume = { RoleArn: process.env.ASSUME_ROLE_ARN, RoleSessionName: 'codebuild', DurationSeconds: 900, } const sts = new AWS.STS({ apiVersion: '2011-06-15', region: 'ap-south-1', endpoint: 'sts.ap-south-1.amazonaws.com', }) sts.assumeRole(roleToAssume, function (err, assumedRole) { if (err) { reject__(err) console.log('err>>>', err, err.stack) } else { console.log( '🚀 ~ file: uploadTos3.js:30 ~ sts.assumeRole ~ data:', assumedRole ) fileArray.map((file) => { // Configuring parameters for S3 Object const s3 = new AWS.S3({ accessKeyId: assumedRole.Credentials.AccessKeyId, secretAccessKey: assumedRole.Credentials.SecretAccessKey, sessionToken: assumedRole.Credentials.SessionToken, }) const S3params = { Bucket: process.env.S3_BUCKET, Body: fs.createReadStream(file), Key: generateFileKey(file), } s3.upload(S3params, function (err, data) { if (err) { console.error(err) } else { console.log(`Assets uploaded to S3: `, data) } }) }) response__() } })
场景2:使用AWS CLI获取STS凭证后传入aws-sdk调用S3上传报错
InvalidToken: The provided token is malformed or otherwise invalid. -- 16 | at Request.extractError (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/services/s3.js:711:35) 17 | at Request.callListeners (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/sequential_executor.js:106:20) 18 | at Request.emit (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/sequential_executor.js:78:10) 19 | at Request.emit (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/request.js:686:14) 20 | at Request.transition (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/request.js:22:10) 21 | at AcceptorStateMachine.runTo (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/state_machine.js:14:12) 22 | at /var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/state_machine.js:26:10) 23 | at Request.<anonymous> (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/request.js:38:9) 24 | at Request.<anonymous> (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/request.js:688:12) 25 | at Request.callListeners (/var/loco/loco/node_modules/.pnpm/aws-sdk@2.1379.0/node_modules/aws-sdk/lib/sequential_executor.js:116:18) { 26 | code: 'InvalidToken', 27 | region: null, 28 | time: 2023-05-18T13:44:22.058Z, 29 | requestId: 'CH90H7F00MZ4AYQB', 30 | extendedRequestId: 'SHL6HZeiY9Ts+Iu+RGahpQufpxTigrEmOO0t4ICtlqJ9AjEoREb6pRai4XtfDpxLqiN3VjmrQEM=', 31 | cfId: undefined, 32 | statusCode: 400, 33 | retryable: false, 34 | retryDelay: 0.14215548664469058 35 | }
预期行为
成功通过STS assumeRole获取凭证,并使用该凭证将文件上传至S3存储桶。怀疑可能存在RoleARN权限问题,但无法确认。
当前行为
- 通过AWS CLI可获取STS assumeRole凭证,但无法在aws-sdk中用于S3上传
- 无法通过aws-sdk调用sts.assumeRole获取有效凭证
复现步骤
- 在upload_to_bucket.js中编写上述代码
- 通过Docker运行
node upload_to_bucket.js
环境信息
- SDK版本:
aws-sdk: "^2.1379.0" - 运行环境:AWS CodeBuild
如需更多信息,可联系邮箱sanskardahiya98@gmail.com。
内容的提问来源于stack exchange,提问作者Sanskar Dahiya
相关产品推荐
相关产品推荐

