Il s’agit du nouveau Guide de référence des modèles CloudFormation. Veuillez mettre à jour vos favoris et vos liens. Pour obtenir de l’aide pour démarrer avec CloudFormation, consultez le Guide de l’utilisateur AWS CloudFormation.
Fn::Sub
La fonction intrinsèque Fn::Sub permet de remplacer les variables contenues dans une chaîne d'entrée par des valeurs que vous spécifiez. Dans vos modèles, vous pouvez utiliser cette fonction pour construire des commandes ou des sorties qui incluent des valeurs qui ne sont pas disponibles tant que vous ne créez ou ne mettez à jour une pile.
Déclaration
Les sections suivantes présentent la syntaxe de la fonction.
JSON
{ "Fn::Sub" : [String, {Var1Name:Var1Value,Var2Name:Var2Value} ] }
Si vous remplacez uniquement des paramètres de modèle, des ID logiques de ressources ou des attributs de ressource dans le paramètre , ne spécifiez pas de mappage de variable.String
{ "Fn::Sub" :String}
YAML
Syntaxe pour le nom complet de la fonction :
Fn::Sub: -String-Var1Name:Var1ValueVar2Name:Var2Value
Syntaxe pour la forme courte :
!Sub -String-Var1Name:Var1ValueVar2Name:Var2Value
Si vous remplacez uniquement des paramètres de modèle, des ID logiques de ressources ou des attributs de ressource dans le paramètre , ne spécifiez pas de mappage de variable.String
Syntaxe pour le nom complet de la fonction :
Fn::Sub:String
Syntaxe pour la forme courte :
!SubString
Paramètres
String-
Chaîne contenant des variables que CloudFormation remplacera par leur valeur associée au moment de l’exécution. Les variables s'écrivent sous la forme
${. Il peut s'agir de noms de paramètres de modèle, des ID logiques de ressources, des attributs de ressource ou une variable dans un mappage clé-valeur. Si vous spécifiez uniquement des noms de paramètres de modèle, des ID logiques de ressources et des attributs de ressource, ne spécifiez pas de mappage clé-valeur.MyVarName}Si vous spécifiez des noms de paramètres de modèle ou des ID logiques de ressources, tels que
${InstanceTypeParameter}, CloudFormation retourne les mêmes valeurs que si vous utilisiez la fonction intrinsèqueRef. Si vous spécifiez des attributs de ressource, tels que${MyInstance.PublicIp}, CloudFormation retourne les mêmes valeurs que si vous utilisiez la fonction intrinsèqueFn::GetAtt.Pour écrire un signe dollar et des accolades (
${}) de façon littérale, ajoutez un point d'exclamation (!) après l'accolade ouvrante, par exemple,${!. CloudFormation résout ce texte enLiteral}${.Literal}Si vous utilisez un modèle de lancement, ajoutez une barre oblique inverse
\avant le signe dollar, comme\${!Literal}, sinon la valeur littérale sera résolue en chaîne vide. VarName-
Nom d'une variable que vous avez incluse dans le paramètre
String. VarValue-
Valeur que CloudFormation remplace par le nom de variable associé lors de l'exécution.
Valeur renvoyée
CloudFormation retourne la chaîne d'origine en remplaçant les valeurs de toutes les variables.
Exemples
Les exemples suivants montrent comment utiliser la fonction Fn::Sub.
Utilisation de Fn::Sub sans mappage clé-valeur
Dans cet exemple simple, la description de la ressource InstanceSecurityGroup est générée dynamiquement à l’aide du pseudo-paramètre AWS::StackName. Par exemple, si le nom de la pile est « VPC-EC2-ALB-Stack », la description obtenue sera « SSH security group for VPC-EC2-ALB-Stack ».
JSON
"InstanceSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : {"Fn::Sub": "SSH security group for ${AWS::StackName}"} }}
YAML
InstanceSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: !Sub "SSH security group for ${AWS::StackName}"
Utilisation de Fn::Sub avec un mappage clé-valeur
Dans cet exemple, le nom de la ressourceWWWBucket est généré dynamiquement avec un mappage clé-valeur. La fonction Fn::Sub remplace ${Domain} dans la chaîne d’entrée www.${Domain} par la valeur issue de la fonction Ref, qui référence le paramètre RootDomainName défini dans le même modèle de pile. Par exemple, si le nom de domaine racine est « mydomain.com », le nom résultant de cette ressource sera « www.mydomain.com ».
JSON
"WWWBucket":{ "Type":"AWS::S3::Bucket", "Properties":{ "BucketName":{ "Fn::Sub":[ "www.${Domain}", { "Domain":{ "Ref":"RootDomainName" } } ] } } }
YAML
WWWBucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub - 'www.${Domain}' - Domain: !Ref RootDomainName
Utilisation de plusieurs variables pour construire des ARN
L’exemple suivant utilise Fn::Sub avec les pseudo-paramètres AWS::Region et AWS::AccountId, ainsi que l’ID logique de la ressource vpc, pour créer un Amazon Resource Name (ARN) pour un VPC.
JSON
{ "Fn::Sub": "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}" }
YAML
!Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
Transmission des valeurs de paramètres dans des scripts de données utilisateur
L’exemple suivant utilise Fn::Sub pour remplacer les pseudo-paramètres AWS::StackName et AWS::Region par le nom de la pile et la région au moment de l’exécution.
JSON
Pour plus de lisibilité, l'exemple JSON utilise la fonction Fn::Join pour séparer chaque commande, au lieu de spécifier l'intégralité du script de données utilisateur dans une même valeur de chaîne.
"UserData": { "Fn::Base64": { "Fn::Join": ["\n", [ "#!/bin/bash -xe", "yum update -y aws-cfn-bootstrap", { "Fn::Sub": "/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}" }, { "Fn::Sub": "/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}" }]] }}
YAML
L'exemple YAML utilise un bloc littéral pour spécifier le script de données utilisateur.
UserData: Fn::Base64: !Sub | #!/bin/bash -xe yum update -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region} /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
Spécification de valeurs conditionnelles à l’aide de mappages
Dans cet exemple, le nom de la ressource myLogGroup est créé dynamiquement en remplaçant la variable log_group_name par la valeur résultante de la fonction Fn::FindInMap.
JSON
{ "Mappings": { "LogGroupMapping": { "Test": { "Name": "test_log_group" }, "Prod": { "Name": "prod_log_group" } } }, "Resources": { "myLogGroup": { "Type": "AWS::Logs::LogGroup", "Properties": { "LogGroupName": { "Fn::Sub": [ "cloud_watch_${log_group_name}", { "log_group_name": { "Fn::FindInMap": [ "LogGroupMapping", "Test", "Name" ] } } ] } } } } }
YAML
Mappings: LogGroupMapping: Test: Name: test_log_group Prod: Name: prod_log_group Resources: myLogGroup: Type: 'AWS::Logs::LogGroup' Properties: LogGroupName: !Sub - 'cloud_watch_${log_group_name}' - log_group_name: !FindInMap - LogGroupMapping - Test - Name
Fonctions prises en charge
Pour le paramètre String, vous ne pouvez pas utiliser de fonction. Vous devez spécifier une valeur de type chaîne.
Pour les paramètres VarName et VarValue, vous pouvez utiliser les fonctions suivantes :