可以将AWS CLI与凭据文件一起使用,但不能与环境变量一起使用



我通常在使用环境变量AWS_PROFILE~/.aws/credentials文件设置配置文件后使用AWS CLI命令。这是有效的。

我目前正在尝试通过环境变量设置访问权限。为此,我在.bash_profile文件中设置了这些变量——我从凭据文件中复制了aws_access_key_idaws_secret_access_key条目,并将它们放在我的bash_profile文件中,名称分别为AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

环境变量被正确设置,但是,当我尝试访问AWS资源时(在这种情况下,我试图在bucket上运行lsS3命令,所以区域无关紧要(,我得到消息

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_TOKENAWS_SECURITY_TOKEN环境变量。

如果之前使用了不同的AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY环境变量,并且直接或间接运行了AWS CLI命令,则在第一次身份验证之后,将设置上述两个令牌变量。在我们用新值覆盖现有的AWS_ACCESS_KEY_IDAWS_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获取要使用的身份验证的优先顺序的顶部,因此它会覆盖令牌环境变量,并适用于您的情况。

最新更新