web-dev-qa-db-fra.com

Comment passer une liste de chaînes en tant que paramètre dans CloudFormation?

J'ai un modèle CloudFormation imbriqué qui accepte un certain nombre de paramètres de son modèle racine pour le configurer. Pour le moment, je ne transmets que des paramètres de chaîne simples, mais maintenant je dois transmettre une liste d'ARN de compartiment S3 au modèle enfant.

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"

Et puis dans le modèle enfant, j'ai ceci

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

Mon idée est que cette liste d'ARN de compartiment S3 que je saisis est développée dans le modèle enfant comme ceci

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

Mais lorsque j'exécute le modèle, il ne fait que des erreurs

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

J'ai essayé d'autres variantes comme l'utilisation d'un type de paramètre CommaDelimitedList, mais aucune ne fonctionne. Existe-t-il un moyen simple de passer une liste de chaînes en paramètre?

7
Liam Mayfair

Parce que la valeur de retour de !Split est A list of string values. Je le ferais de la manière suivante:

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

Comme le souligne @ MaiKaY , la faille dans le code de @ Liam Mayfair est que Fn::Split Est précédé de - Ce qui se traduit par un liste contenant un seul élément qui est une liste. Le code fixe ressemblerait à

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

D'une manière plus générale, vous devez vous assurer d'utiliser un type de paramètre String pas CommaDelimitedList lorsque vous utilisez Fn::Split Car il ne divisera pas un CommaDelimitedList .

  • Si vous utilisez CommaDelimitedList avec Fn::Split Vous obtiendrez l'erreur 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
  • Si vous utilisez CommaDelimitedList sans Fn::Split Vous obtiendrez l'erreur Syntax errors in policy
4
gene_wood