使用AWS SDK v3在JS/TS中通过角色凭证创建SSMClient失败
解决方案
核心问题分析
- 未传入临时凭证到SSMClient:你已通过
AssumeRole获取有效临时凭证,但创建SSMClient时未配置这些凭证,导致客户端仍尝试使用默认凭证链(如环境变量、本地配置文件),触发"缺少凭证"错误。 - RoleArn参数错误:你传入的
RoleArn是IAM策略的ARN(arn:aws:iam::425112775363:policy/SSMFullAccessCognito),但AssumeRole要求传入IAM角色的ARN,这会导致角色切换逻辑存在潜在问题。
修正后的代码
import { STSClient, AssumeRoleCommand } from "@aws-sdk/client-sts"; import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; const REGION = "你的区域标识"; // 例如 us-east-1 // 1. 替换为正确的IAM角色ARN const assumeRoleParams = { RoleArn: "arn:aws:iam::425112775363:role/你的目标角色名称", RoleSessionName: "session1", DurationSeconds: 900, }; // 方式一:手动传入临时凭证 const stsClient = new STSClient({ region: REGION }); const assumeRoleData = await stsClient.send(new AssumeRoleCommand(assumeRoleParams)); const tempCredentials = { accessKeyId: assumeRoleData.Credentials!.AccessKeyId, secretAccessKey: assumeRoleData.Credentials!.SecretAccessKey, sessionToken: assumeRoleData.Credentials!.SessionToken, }; const ssmClient = new SSMClient({ region: REGION, credentials: tempCredentials, // 注入临时凭证 }); // 方式二:使用SDK内置的临时凭证提供者(更推荐,自动处理凭证过期) // const ssmClient = new SSMClient({ // region: REGION, // credentials: fromTemporaryCredentials({ // params: assumeRoleParams, // region: REGION, // }), // }); // 获取SSM参数 const getParamCmd = new GetParameterCommand({ Name: 'test', WithDecryption: false }); const paramResult = await ssmClient.send(getParamCmd); console.info(paramResult);
Amplify环境额外注意事项
- 确保Amplify的认证凭证不会与手动切换的角色凭证冲突,避免凭证链优先级导致的异常。
- 确认AssumeRole的目标角色信任策略中,已添加Amplify身份池的ARN,允许Amplify用户/身份切换到该角色。
- 验证目标角色拥有
ssm:GetParameter权限,且SSM参数的资源策略允许该角色访问。
内容的提问来源于stack exchange,提问作者Dave Barrineau
相关产品推荐
相关产品推荐

