【问题标题】:Two profiles sharing same configuration两个配置文件共享相同的配置
【发布时间】:2019-11-06 04:27:23
【问题描述】:

我在~/.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 配置文件。


有没有办法做到这一点?

【问题讨论】:

  • 同一个人资料名称不同的原因是什么?
  • @TarunLalwani 我想这样做的原因之一是,例如,我以编程方式根据其名称动态使用正确的配置文件。我有一个用例,多个“名称”应该产生相同的配置文件。
  • 如果您以编程方式尝试设置配置文件信息并检索它,不确定这是否有助于参数化? stackoverflow.com/a/33966456/4142873
  • @Woodrow 感谢您的建议。不幸的是,应用程序没有更新配置文件 - 只是使用它。它希望这样的配置文件已经到位。我知道情况并不理想,但也许 SDK 提供了解决方案。

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


【解决方案1】:

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

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

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

  • 让我们看看 node.js 的 ini provider 实现(因为它是我过去常用的):

    • 它在一个名为 SharedIniFileCredentials 的数据结构中解析信息。 [2]
    • 它使用 parseFile 方法来执行此操作。 [3]
    • 解析被委托给实用程序“类”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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我想这样做的原因之一是,例如,我正在以编程方式根据其名称动态使用正确的配置文件。我有一个用例,多个“名称”应该产生相同的配置文件。
      • 需要更多解释
      猜你喜欢
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多