Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
CloudFormation prise en charge des extensions linguistiques
Les modèles de AWS SAMCLI support qui utilisent la AWS::LanguageExtensions transformation, y compris Fn::ForEachFn::Length,Fn::ToJsonString, et Fn::FindInMap avecDefaultValue. Pour obtenir des informations de référence complètes sur ces constructions, voir AWS::LanguageExtensions transformation dans le guide de l'AWS CloudFormation utilisateur.
Pour utiliser des extensions de langue dans un AWS SAM modèle, AWS::LanguageExtensions listez-les dans la Transform section précédente AWS::Serverless-2016-10-31 :
Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31
Lorsque la Transform section d'un modèle est AWS SAMCLI détectée AWS::LanguageExtensions et que vous avez opté pour le traitement local, les structures d'extension de langue s'étendent localement avant d'exécuter les AWS SAM transformations. Cela permet à sam buildsam package,sam deploy,sam sync,sam validate,sam local invoke,sam local start-api, et sam local start-lambda de travailler avec des modèles qui utilisent ces constructions.
Le traitement local est désactivé par défaut. Lorsque cette option est désactivée AWS SAMCLI, le modèle est transmis tel quel et CloudFormation traite la AWS::LanguageExtensions transformation côté serveur au moment du déploiement. Pour les méthodes d'activation, voirActivation des extensions de langue.
L'extension s'effectue en deux phases lorsqu'elle est activée :
-
Phase 1 (extensions de langage) : les
Fn::ForEachboucles sont étendues, les fonctions intrinsèques sont résolues dans la mesure du possible et le modèle est converti en standard CloudFormation. -
Phase 2 (AWS SAM transformation) — Le modèle développé est traité par le AWS SAM traducteur comme d'habitude.
Le modèle d'origine (Fn::ForEachintact) est conservé pour CloudFormation le déploiement, car il CloudFormation traite la AWS::LanguageExtensions transformation côté serveur.
Activation des extensions de langue
Le traitement local de AWS::LanguageExtensions est activé par commande. Il existe trois méthodes d'activation équivalentes, répertoriées par ordre de priorité :
-
CLIdrapeau —
--language-extensionstransmettre une seule invocation :sam build --language-extensions sam package --language-extensions ... sam deploy --language-extensions ...--no-language-extensionsdésactive explicitement, en remplaçant les deux variablessamconfig.tomlainsi que la variable d'environnement décrite ci-dessous. -
samconfig.toml— conserver le choix par projet :[default.build.parameters] language_extensions = true [default.package.parameters] language_extensions = true [default.deploy.parameters] language_extensions = true [default.sync.parameters] language_extensions = true [default.local_invoke.parameters] language_extensions = true [default.local_start_api.parameters] language_extensions = true [default.local_start_lambda.parameters] language_extensions = true [default.validate.parameters] language_extensions = trueUne
samconfig.tomlentrée est chargée par défaut pour la commande. Elle prend donc effet comme si l'indicateur était passé, et l'emporte donc sur la variable d'environnement. -
Variable d'environnement — définie
SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1pour être activée pour le shell actuel :export SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1 sam build sam local invoke MyFunctionLes valeurs véridiques (sans distinction majuscules/majuscules) sont
1, ettrue.yesTout le reste, y compris la chaîne vide, est considéré comme non activé. La variable d'environnement n'est consultée que lorsque ni l'CLIindicateur nisamconfig.tomlla valeur ne sont définis.
Important
Chaque commande nécessite sa propre activation. Le passage --language-extensions à sam build ne se propage pas à une version ultérieure sam local invoke : le traitement local est décidé par appel de commande. Utilisez la variable d'environnement ou une samconfig.toml entrée pour activer toutes les commandes sans répéter l'indicateur.
Ventilateur : ForEach
Fn::ForEachgénère plusieurs ressources, conditions ou sorties à partir d'une seule définition de modèle :
Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31 Parameters: ServiceNames: Type: CommaDelimitedList Default: "Users,Orders,Products" Resources: Fn::ForEach::Services: - Name - !Ref ServiceNames - ${Name}Function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.12 CodeUri: ./services/${Name}
L'exécution sam build étend cela àUsersFunction,OrdersFunction, etProductsFunction, chacun construit à partir de son répertoire source respectif.
Propriétés dynamiques des artefacts
Lorsqu'une propriété packageable utilise une variable de boucle (par exemple,./services/${Name}), elle AWS SAMCLI génère une CloudFormation Mappings section qui fait correspondre la valeur de chaque collection à son Amazon S3. URI Le Fn::ForEach corps est réécrit pour être utilisé Fn::FindInMap afin de CloudFormation pouvoir résoudre le bon artefact au moment du déploiement.
Les propriétés reconnues des artefacts sont les mêmes que celles qui sont sam package réécrites aujourd'hui. Cela inclut :
| Type de ressource | Propriété |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pour les propriétés en pointillés (par exemple, Command.ScriptLocation on AWS::Glue::Job ou Code.ImageUri onAWS::Lambda::Function), la valeur est lue et écrite à l'emplacement imbriqué sur la ressource. Le nom de mappage généré utilise uniquement le segment de feuille du chemin de propriété.
Lorsque la propriété est modélisée en boucle, le nom du mappage est SAM<LeafProperty><LoopName> (par exemple, SAMCodeUriServices ou). SAMScriptLocationJobs
Important
Customer-authored les mappages ne doivent pas commencer par ces SAM* préfixes ; ils sont réservés au. AWS SAMCLI Consultez Limitations.
Par exemple, après sam package :
Mappings: SAMCodeUriServices: Users: CodeUri: s3://my-bucket/abc123 Orders: CodeUri: s3://my-bucket/def456 Products: CodeUri: s3://my-bucket/ghi789 Resources: Fn::ForEach::Services: - Name - !Ref ServiceNames - ${Name}Function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.12 CodeUri: !FindInMap [SAMCodeUriServices, !Ref Name, CodeUri]
Plusieurs ressources par ForEach organisme
Un seul Fn::ForEach corps peut émettre plusieurs ressources par itération. Chaque ressource est générée pour chaque valeur de collection :
Resources: Fn::ForEach::Tables: - TableName - [Users, Orders, Products] - ${TableName}Table: Type: AWS::DynamoDB::Table Properties: TableName: !Sub "${AWS::StackName}-${TableName}" # ... ${TableName}StreamProcessor: Type: AWS::Serverless::Function Properties: CodeUri: stream-processors/${TableName}/ Events: DDBStream: Type: DynamoDB Properties: Stream: !GetAtt - !Sub "${TableName}Table" - StreamArn
Résolution des collisions entre noms de mappage
Lorsque deux ressources du même Fn::ForEach corps déclarent la même propriété d'artefact dynamique (par exemple, un Api et un StateMachine usageDefinitionUri), un suffixe extrait de la partie statique du modèle Logical-ID de ressource est AWS SAMCLI ajouté pour que les noms de mappage restent uniques :
| Modèle de ressource | Propriété | Nom du mappage |
|---|---|---|
|
|
|
|
|
|
En l'absence de collision, le nom de base (par exemple,SAMDefinitionUriServices) est utilisé.
Parameter-based collections
Lorsque la Fn::ForEach collection est une référence de paramètre (par exemple,!Ref ServiceNames) et que le corps de la boucle utilise une propriété d'artefact dynamique (par exemple,CodeUri: ./services/${Name}), elle AWS SAMCLI a besoin des valeurs de collection pour générer les SAM* mappages décrits dans. Propriétés dynamiques des artefacts Il les résout lorsqu'il traite le modèle, à partir de :
-
--parameter-overridespassé à la AWS SAMCLI commande. -
La
Defaultvaleur du paramètre dans le modèle.
Important
Comme les SAM* mappages sont intégrés au moment du package, vous devez les reconditionner chaque fois que vous modifiez la valeur du paramètre (par exemple, lors de l'ajout d'un nouveau service) afin que les mappages incluent des entrées pour les nouvelles valeurs. Cela s'applique uniquement lorsque le paramètre entraîne une boucle d'artefact dynamique ; les autres remplacements de paramètres peuvent être modifiés au moment du déploiement, comme d'habitude.
# Package with the values you intend to deploy with sam package --language-extensions --parameter-overrides ServiceNames="Users,Orders,Products" # Deploy with the same values sam deploy --language-extensions --parameter-overrides ServiceNames="Users,Orders,Products"
Piles imbriquées
Fn::ForEachdans les modèles de pile imbriqués (AWS::CloudFormation::Stack) est pris en charge. Transmet AWS SAMCLI la Parameters propriété de la pile parent à l'extension du modèle enfant, de sorte que les Fn::ForEach collections enfants qui font référence à des paramètres fournis par le parent soient résolues correctement.
# parent.yaml Resources: ChildStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./child.yaml Parameters: ServiceNames: "Users,Orders,Products"
Ventilateur imbriqué : ForEach
Jusqu'à 5 niveaux d'imbrication sont pris en charge, conformément à la CloudFormation limite :
Resources: Fn::ForEach::Envs: - Env - [Dev, Staging, Prod] - Fn::ForEach::Services: - Svc - [Users, Orders] - ${Env}${Svc}Function: Type: AWS::Serverless::Function Properties: CodeUri: ./services/${Svc} Environment: Variables: STAGE: ${Env}
ForEach dans Sorties
Fn::ForEachles blocs sont également développés à l'intérieur de la Outputs section, de sorte que vous pouvez émettre une sortie par valeur de collection :
Outputs: Fn::ForEach::FunctionArns: - Name - [alpha, beta] - ${Name}FunctionArn: Value: !GetAtt - !Sub "${Name}Function" - Arn
Conditions et DependsOn
Les ressources émises par Fn::ForEach can carry Condition and DependsOn like n'importe quelle autre ressource. La condition ou la dépendance est répliquée sur chaque ressource générée :
Conditions: IsProd: !Equals [!Ref Environment, prod] Resources: SharedTable: Type: AWS::DynamoDB::Table # ... Fn::ForEach::Functions: - Name - [api, worker] - ${Name}Function: Type: AWS::Serverless::Function Condition: IsProd DependsOn: SharedTable Properties: Handler: main.handler CodeUri: functions/${Name}/
&syntaxe {identifier}
La &{identifier} syntaxe supprime les caractères non alphanumériques de la valeur substituée, ce qui est utile pour générer des identifiants logiques valides à partir de valeurs telles que les adresses IP :
Fn::ForEach::Hosts: - IP - ["10.0.0.1", "10.0.0.2"] - Host&{IP}: Type: AWS::EC2::Instance # Expands to Host10001, Host10002
Fonctions intrinsèques prises en charge
Les fonctions intrinsèques suivantes sont résolues localement lors de l'expansion :
| Fonction | Description |
|---|---|
|
Expansion de la boucle. |
|
Renvoie le nombre d'éléments de la liste. |
|
Convertit une valeur en JSON chaîne. |
|
Recherche cartographique, y compris l'option facultative |
|
Sélection de valeur conditionnelle. |
|
Substitution de chaînes. |
|
Concaténation de chaînes. |
|
Fendage de cordes. |
|
Sélection d'éléments de liste. |
|
Encodage Base64. |
|
Évaluation de l'état. |
|
Références de paramètres et de pseudo-paramètres. |
Les fonctions qui nécessitent des ressources déployées (Fn::GetAttFn::ImportValue,,Fn::GetAZs) sont conservées CloudFormation pour être résolues au moment du déploiement.
Erreurs de validation
Les problèmes de modèle suivants sont détectés localement avant l'exécution de la AWS SAM transformation :
| Cause | Message d’erreur |
|---|---|
La |
|
Plus de 5 niveaux |
|
La collection se résout en une liste vide (par exemple, un |
Aucune erreur : la boucle est ignorée en silence et aucune ressource n'est émise. |
La |
Aucune erreur : la référence non résolue est conservée dans le modèle. Au moment du déploiement, le problème CloudFormation sera résolu côté serveur. |
Limitations
-
Les collections doivent pouvoir être résolues à un build/package moment donné.
Fn::ForEachles collections qui utilisent ouFn::GetAttFn::ImportValueles références dynamiques SSM/Secrets du gestionnaire ne peuvent pas être étendues localement. Utilisez--parameter-overridesplutôt un paramètre avec. -
Les mappages d'artefacts dynamiques sont corrigés au moment du package. Lorsqu'une
Fn::ForEachcollection est une référence de paramètre et que le corps de la boucle utilise une propriété d'artefact dynamique (par exemple,CodeUri: ./services/${Name}), lesSAM*mappages générés contiennent uniquement des entrées pour les valeurs des paramètres qui ont été résolues au moment du package. Si vous modifiez--parameter-overridesce paramètre au moment du déploiement sans reconditionner, les nouvelles valeurs ne comporteront pas d'entrées de mappage et le déploiement échouera. Cela ne s'applique pas aux paramètres qui ne sont pas utilisés pour piloter un artefactFn::ForEachdynamique. -
DeletionPolicyetUpdateReplacePolicysont validés et résolus lors de l'extension. Ils prennent en chargeRefles paramètres mais pas les autres fonctions intrinsèques. -
Limite de nidification. Jusqu'à 5 niveaux
Fn::ForEachpeuvent être imbriqués, correspondant à la limite CloudFormation côté serveur. -
Noms de mappage réservés. Les noms de mappage commençant par l'un des suivants sont réservés aux AWS SAMCLI : ne créez pas vos propres mappages avec ces préfixes :
-
SAMCodeUri,SAMImageUri,SAMContentUri,SAMDefinitionUri,,SAMSchemaUri,SAMBodyS3Location,SAMDefinitionS3Location,SAMTemplateURLSAMCode,SAMContent— émis parsam packagepour les propriétés dynamiques des artefacts. Voir le Propriétés dynamiques des artefacts tableau. -
SAMLayers— émissam buildlorsqu'une fonctionFn::ForEachgénérée récupère des références de couche de dépendance générées automatiquement (couches AWS SAMCLI Lambda intégrées dans une pile imbriquée). Ce préfixe n'a aucune propriété correspondante créée par l'utilisateur ; il est ajouté automatiquement.
-
Télémétrie
Le AWS SAMCLI émet un événement de CFNLanguageExtensions télémétrie lorsqu'une commande est invoquée avec --language-extensions (ou son équivalent en variable d'environnement) et que le modèle déclare la transformation. AWS::LanguageExtensions L'événement se déclenche une fois par invocation et aucun contenu du modèle n'est transmis. Lorsque le traitement local est désactivé (par défaut), aucun événement ne se déclenche.