Как использовать Fn :: If со значениями массивов в шаблонах формирования облаков

Я работаю над шаблоном формирования облака для ключа KMS. В политическом документе я хочу указать принципалов в зависимости от этапа (будь то продвижение или тестирование). Я могу легко использовать Fn:If, если есть только один принципал для обоих этапов. Но у меня более одного принципала для каждого этапа, и Fn: If only позволяет вам назначать значение, а не коллекцию в соответствии с моим пониманием (поправьте меня, если я ошибаюсь).

Я попытался назначить коллекцию значению, и это дает мне ошибку «ключи карты должны быть строками; вместо этого получена коллекция» при проверке шаблона с помощью конструктора CloudFormation в учетной записи AWS.

"MyEncryptionKey": {
            "DeletionPolicy": "Retain",
            "Properties": {
                "Description": "MyEncryptionKey",
                "EnableKeyRotation": true,
                "Enabled": true,
                "KeyPolicy": {
                    "Statement": [
                        {
                            "Action": "kms:*",
                            "Effect": "Allow",
                            "Principal": {
                                "AWS": "root"
                            },
                            "Resource": "*"
                        },
                        {
                            "Action": "kms:Decrypt",
                            "Effect": "Allow",
                            "Principal": {
                                "AWS": [
                                    {
                                        "Fn::If": [
                                            "IsProd",
                                            {["arn1","arn2"]},
                                            "arn2"
                                        ]
                                    }
                                ]
                            },
                            "Resource": "*"
                        }
                    ]
                }
            },
            "Version": "2012-10-17",
            "Type": "AWS::KMS::Key"
        }

В идеале второй оператор в ключевой политике должен иметь два значения arn, если prod, и одно значение arn, если не prod.

Я также открыт для изучения, есть ли какой-либо другой способ добиться этого вместо использования Fn::If здесь


person SanD    schedule 10.07.2019    source источник


Ответы (1)


Вместо того, чтобы рассматривать значение, вычисленное из Fn :: If, как отдельный элемент массива, рассматривайте его как массив. Замените принципала следующим, и он будет работать.

JSON

{
  "Principal": {
    "AWS": {
      "Fn::If": [
        "IsProd",
        [
          "arn1"
        ],
        [
          "arn1",
          "arn2"
        ]
      ]
    }
  }
}

Просто на ямле будет смотреться

Principal:
  AWS:
    Fn::If:
    - IsProd
    - - arn1
    - - arn1
      - arn2
person chamikaw    schedule 10.07.2019
comment
Этого достаточно для небольших массивов ... А как насчет больших списков - разве нет возможности не указывать все общие элементы дважды? - person Tomasz Gandor; 19.03.2021