Как передать список строк в качестве параметра в CloudFormation? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть вложенный шаблон CloudFormation, который принимает ряд параметров из своего корневого шаблона для его настройки. В данный момент я передаю только простые строковые параметры, но теперь мне нужно передать список ARN-блоков S3 в дочерний шаблон.

ChildLambdaStack:
  Type: AWS::CloudFormation::Stack
  Properties:
    Parameters:
      AwsRegion: !Ref AwsRegion
      Environment: !Ref Environment
      Product: !Ref Product
      S3Buckets: "arn:aws:s3:::bucket1,arn:aws:s3:::bucket2"
    TemplateURL: "https://s3.amazonaws.com/child-template.yml"

А потом в дочернем шаблоне у меня это

AWSTemplateFormatVersion: "2010-09-09"
Description: "Child Lambda"

Parameters:
  AwsRegion:
    Type: String
  Environment:
    Type: String
  Product:
    Type: String
  S3Buckets:
    Type: String

Resources:
  DeployerPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - s3:PutObject
              - s3:GetObject
              - s3:DeleteObject
              - s3:CreateBucket
              - s3:DeleteBucket
              - s3:ListBucket
              - s3:PutBucketNotification
            Resource:
              - Fn::Split:
                - ","
                - !Ref S3Buckets

Моя идея состоит в том, что этот список ARN сегментов S3, которые я вводю, расширяется в дочернем шаблоне, как это

Resource:
  - arn:aws:s3:::bucket1
  - arn:aws:s3:::bucket2

Но когда я запускаю шаблон, он просто выдает ошибку

Syntax errors in policy. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument)

Я пробовал другие варианты, такие как использование типа параметра CommaDelimitedList, но ни один из них не работает. Есть ли простой способ передать список строк в качестве параметра?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Как указывает @ MaiKaY , недостаток кода @ Liam Mayfair состоит в том, что Fn::Split предшествует -, что приводит к списку, содержащему один элемент который является списком. Фиксированный код будет выглядеть как

...
            Resource:
              Fn::Split:
                - ","
                - !Ref S3Buckets

На более общей ноте вы должны обязательно использовать тип параметра String, а не CommaDelimitedList при использовании Fn::Split, так как он не разделит CommaDelimitedList.

  • Если вы используете CommaDelimitedList с Fn::Split, вы получите ошибку Template error: every Fn::Split object requires two parameters, (1) a string delimiter and (2) a string to be split or a function that returns a string to be split
  • Если вы используете CommaDelimitedList без Fn::Split, вы получите ошибку Syntax errors in policy
0 голосов
/ 30 августа 2018

Поскольку возвращаемое значение !Split равно A list of string values., я бы сделал это следующим образом:

[...]
    Resource: !Split [",", !Ref S3Buckets]
[...]
...