我通常在使用环境变量AWS_PROFILE
和~/.aws/credentials
文件设置配置文件后使用AWS CLI命令。这是有效的。
我目前正在尝试通过环境变量设置访问权限。为此,我在.bash_profile
文件中设置了这些变量——我从凭据文件中复制了aws_access_key_id
和aws_secret_access_key
条目,并将它们放在我的bash_profile
文件中,名称分别为AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
。
环境变量被正确设置,但是,当我尝试访问AWS资源时(在这种情况下,我试图在bucket上运行ls
S3命令,所以区域无关紧要(,我得到消息
An error occurred (InvalidAccessKeyId) when calling the ListObjectsV2 operation: The AWS Access Key Id you provided does not exist in our records
这对我来说很奇怪,因为钥匙完全一样。为了确认这一点,我切换到带有AWS_PROFILE
环境变量的凭据配置文件,然后命令正常工作。
我怀疑,不知怎么的,我设置了错误的环境变量,或者类似的东西。然后,我阅读了这本AWS指南,并运行了命令aws configure list
,在第一种情况下(仅限环境变量的情况(,它返回
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************AAAA env
secret_key ****************AAAA env
region us-east-1 env ['AWS_REGION', 'AWS_DEFAULT_REGION']
对于第二种情况(配置文件集(,它返回
Name Value Type Location
---- ----- ---- --------
profile dev-staging manual --profile
access_key ****************AAAA shared-credentials-file
secret_key ****************AAAA shared-credentials-file
region us-east-1 env ['AWS_REGION', 'AWS_DEFAULT_REGION']
换句话说,环境变量的设置是正确的,AWS CLI会确认它们,它们的值与通过凭据文件设置时的值相同,但由于某种原因,它不能以这种方式工作。
我认为这可能是由于aws_session_token,我也试图将其设置为环境变量,但没有成功。
我需要以这种方式访问AWS资源,以模拟我的代码将在其中运行的环境,我不明白为什么这不会以我想要的方式工作。
任何关于如何解决它的想法都将受到赞赏。
如果要引用环境变量中的凭据而不是凭据文件,则需要编辑~/.aws/config文件。
有了凭证文件中的AWS访问密钥,您必须将配置文件设置为,或者任何配置文件都没有source_profile
配置:
[default]
source_profile = default
但是,当您想使用环境变量或bash_profile中设置的凭据时,请将此设置更改/添加到配置文件中的每个配置文件:
[default]
credential_source = Environment
有了这个更改,它也应该可以与您的环境变量一起使用。
如果~/.aws/config文件中有多个配置文件,只需用credential_source = Environment
替换/添加source_profile = <profile-name>
如果有人偶然发现了这一点,可能的罪魁祸首可能是AWS_SESSION_TOKEN
和AWS_SECURITY_TOKEN
环境变量。
如果之前使用了不同的AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
环境变量,并且直接或间接运行了AWS CLI
命令,则在第一次身份验证之后,将设置上述两个令牌变量。在我们用新值覆盖现有的AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
之后,旧的令牌变量仍然保持原样,AWS CLI
没有明确检查访问/密钥是否更新,它继续使用旧的令牌,导致旧的密钥在内部使用,并将继续这样做,直到令牌过期。aws configure
将继续显示新的访问密钥,但由于缓存的令牌,它在内部将使用旧的访问密钥。
因此,如果您想在这种情况下继续使用环境变量,您需要unset
包含令牌的两个环境变量,并且在您的情况下,在环境变量中设置新的访问/密钥后,还需要为两个令牌变量添加unset
命令。
unset AWS_SESSION_TOKEN
unset AWS_SECURITY_TOKEN
这种行为是人们更喜欢使用aws configure
或编辑~/.aws/*
文件的不同配置文件,并在命令中使用--profile
而不是使用环境变量明确指定它们的原因之一。
根据AWS cli配置的优先顺序,~/.aws/config
文件的使用位于AWS cli获取要使用的身份验证的优先顺序的顶部,因此它会覆盖令牌环境变量,并适用于您的情况。