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?
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]
[...]
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
.
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
CommaDelimitedList
sans Fn::Split
Vous obtiendrez l'erreur Syntax errors in policy