两个配置文件共享相同的配置

Two profiles sharing same configuration

我在 ~/.aws/config 中有以下配置文件:

[profile foo]
role_arn = arn:aws:iam::##########:role/SomeRole
source_profile = other_profile
region = us-west-2

出于不相关的原因,我想创建一个新的配置文件 - 使用不同的名称 - 但共享与 foo 相同的配置。

因为我不喜欢重复的东西,所以我想知道是否有办法让两个配置文件使用相同的配置?

我试过以下方法:

[profile bar]
[profile foo]
role_arn = arn:aws:iam::##########:role/SomeRole
source_profile = other_profile
region = us-west-2

它没有用。 CLI 认为 bar 是一个空配置文件。

我也试过:

[profile foo bar]
role_arn = arn:aws:iam::##########:role/SomeRole
source_profile = other_profile
region = us-west-2

也没有用。 CLI 无法找到 bar 配置文件。


有办法实现吗?

这是微不足道的,因此无法在同一个配置文件中实现。您没有理由使用 "exactly" 相同的配置创建两个配置文件。您宁愿使用相同的配置文件。如果您遇到环境问题并且想要创建不同的配置文件,请复制配置。显然,即使在那种情况下,至少角色也会有所不同。

我用多个排列检查了这个,AWS CLI 似乎无法处理这个用例。 AWS documentation 中对此也有非常模糊的提及 每个命名的配置文件使用不同的凭据。

你现在最好的选择似乎是以编程方式处理这个问题。

我认为这是不可能实现的。

让我解释一下为什么我认为这是不可能的:

  • 您建议的语法必须得到所有官方 AWS SDK 的支持,因为它们都在其他凭证提供程序中解析 aws 凭证文件。有关现有凭证提供程序的概述,请参阅 [1]。解析 ~/.aws/config 文件的凭证提供程序称为 ini 提供程序

  • 让我们看一下 ini 提供程序 node.js 的实现(因为它是我过去通常使用的那个):

    • 它解析名为 SharedIniFileCredentials 的数据结构中的信息。 [2]
    • 它使用 parseFile 方法来做到这一点。 [3]
    • 解析委托给实用程序 "class" AWS.util.ini,如下所示 [4]:
parse: function string(ini) {
      var currentSection, map = {};
      util.arrayEach(ini.split(/\r?\n/), function(line) {
        line = line.split(/(^|\s)[;#]/)[0]; // remove comments
        var section = line.match(/^\s*\[([^\[\]]+)\]\s*$/);
        if (section) {
          currentSection = section[1];
        } else if (currentSection) {
          var item = line.match(/^\s*(.+?)\s*=\s*(.+?)\s*$/);
          if (item) {
            map[currentSection] = map[currentSection] || {};
            map[currentSection][item[1]] = item[2];
          }
        }
      });

      return map;
}

如您所见,解析器逐行扫描文件内容,并在一行中出现 /^\s*\[([^\[\]]+)\]\s*$/ 序列后开始一个新部分。 没有额外的逻辑将多行映射到两个(或更多)不同的部分。如果您想要多个部分具有相同的内容,则必须为每个配置文件名称复制您的配置。

我希望我的分析令人信服,这个功能在句法上确实是不可能的。如果你问我,也不可能将其作为功能请求提出,因为 AWS 必须调整所有现有的 SDK,这需要大量的工作。

参考资料

[1] https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials_provider.html
[2] https://github.com/aws/aws-sdk-js/blob/d78f62f9d86066e67d3cb7302fe2656210732f07/lib/credentials/shared_ini_file_credentials.js
[3] https://github.com/aws/aws-sdk-js/blob/cb1604ca89a077ffdb86127884292d3b18c8b4df/lib/shared-ini/ini-loader.js#L5
[4] https://github.com/aws/aws-sdk-js/blob/cb1604ca89a077ffdb86127884292d3b18c8b4df/lib/util.js#L192