在PowerShell $PROFILE中配置AWS STS角色切换函数遇问题求助
AWS Tools for PowerShell角色切换函数加载后凭证不生效问题解决
问题背景
我的.aws/credentials文件配置如下:
[profile source] aws_access_key_id=... aws_secret_access_key=... [profile target] role_arn = arn:aws:iam::123412341234:role/rolename mfa_serial = arn:aws:iam::123412341234:mfa/mylogin source_profile = source
由于MFA及1小时凭证有效期限制,我在PowerShell的$PROFILE中定义了角色切换函数:
function Use-SomeAWS { Clear-AWSCredential $Response=(Use-STSRole arn:aws:iam::123412341234:role/rolename -ProfileName target -RoleSessionName "my email").Credentials $Creds=(New-AWSCredentials -AccessKey $Response.AccessKeyId -SecretKey $Response.SecretAccessKey -SessionToken $Response.SessionToken) Set-AWSCredential -Credential $Creds }
直接复制函数内的代码执行完全正常,但加载配置文件(. $PROFILE)后运行Use-SomeAWS时,虽然会提示输入MFA代码且看似执行成功,但会话并未正确设置凭证。尝试通过-StoreAs保存凭证再调用的方法可以解决,但不符合原本的无持久化需求。
问题原因
核心是PowerShell的作用域机制:当函数在$PROFILE中加载后执行时,Set-AWSCredential默认会把凭证设置在函数的局部作用域内,全局会话无法访问局部作用域的凭证;而直接复制代码执行时是在全局作用域,所以凭证能正常生效。
解决方法
在Set-AWSCredential和Clear-AWSCredential命令中添加-Scope Global参数,强制将操作作用于全局作用域:
function Use-SomeAWS { Clear-AWSCredential -Scope Global $Response=(Use-STSRole arn:aws:iam::123412341234:role/rolename -ProfileName target -RoleSessionName "my email").Credentials $Creds=(New-AWSCredentials -AccessKey $Response.AccessKeyId -SecretKey $Response.SecretAccessKey -SessionToken $Response.SessionToken) Set-AWSCredential -Credential $Creds -Scope Global }
修改后重新加载$PROFILE(. $PROFILE),执行Use-SomeAWS即可让凭证在全局会话中生效。
内容的提问来源于stack exchange,提问作者Kimvais
相关产品推荐
相关产品推荐

