【问题标题】:Can use AWS CLI with credentials file but not with environment variables可以将 AWS CLI 与凭证文件一起使用,但不能与环境变量一起使用
【发布时间】:2021-01-15 14:49:25
【问题描述】:

我通常在使用环境变量 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 资源时(在这种情况下,我尝试在存储桶上运行 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 guide,并运行了命令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 资源来模拟我的代码将在其中运行的环境,但我不明白为什么这不能按我的预期方式工作。

感谢任何关于如何解决它的想法。

【问题讨论】:

  • "把它们放在我的 bash_profile" - 你是怎么把它们放的?你是从那里导出的吗?
  • 是的,我导出了它们。它们已正确设置,我可以从新的终端会话中访问它们。他们甚至出现在aws configure list 上进行新会话,所以这部分正在工作......
  • 你为什么说aws_session_token?这仅适用于临时凭证。我猜,如果您使用 IAM 用户凭据,为什么会有它?
  • 嗯,到那时,所有合乎逻辑的解释都已经用尽了,我只是在尝试一些我认为可以解释正在发生的事情的随机事情。无论如何,这无关紧要,有没有。事实上,我仍然不明白为什么如果凭证相同,我无法访问 AWS 资源,只是它们的来源不同。
  • 根据您的描述,您的设置是正确的,理论上应该可以工作。您能否在控制台中运行 env | grep AWS 并验证凭据是否正确导出、没有丢失单个字符或没有被其他导出覆盖?

标签: amazon-web-services amazon-s3 aws-cli


【解决方案1】:

当您想从环境变量而不是 credentials 文件中引用凭据时,您需要编辑 ~/.aws/config 文件。

使用凭证文件中的 AWS 访问密钥,您必须将配置文件设置为,否则任何配置文件都没有这样的 source_profile 配置:

[default]
source_profile = default

但是,当您想使用在环境变量或 bash_profile 中设置的凭据时,请将此设置更改/添加到配置文件中的每个配置文件中:

[default]
credential_source = Environment

通过此更改,它也应该适用于您的环境变量。

如果您在 ~/.aws/config 文件中有多个配置文件,只需将 source_profile = &lt;profile-name&gt; 替换/添加为 credential_source = Environment

【讨论】:

  • 只有config 文件是在~/.aws/config 找到的那个吗?目前,我在该位置的配置文件只为每个配置文件设置了regionoutput - 那里没有设置source_profile...:/
  • 如果没有source_profile,则默认为source_profile = default。只需在每个配置文件下添加credential_source = Environment 并尝试执行您的命令。当然,别忘了重启你的终端 ;-)
  • 我在默认配置文件下添加了它,没有任何改变。我很难理解这里的基本原理,因为在新终端上,AWS_PROFILE 是空的,这意味着 AWS CLI 没有使用任何配置文件配置......
  • 您要执行哪个命令? aws s3 ls --profile dev-staging 或只是aws s3 ls
  • aws s3 ls
【解决方案2】:

万一有人偶然发现了这个问题,可能的罪魁祸首可能是 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 configuration precedence order~/.aws/config 文件的使用位于 AWS CLI 获取要使用的身份验证的优先顺序的顶部,因此它会覆盖令牌环境变量并适用于您的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2022-07-26
    相关资源
    最近更新 更多