Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
CloudFormation compatibilidad con extensiones de idioma
AWS SAMCLIAdmite plantillas que utilizan la AWS::LanguageExtensions transformación, incluidasFn::ForEach, Fn::LengthFn::ToJsonString, y Fn::FindInMap conDefaultValue. Para obtener información de referencia completa sobre estas construcciones, consulte la AWS::LanguageExtensions transformación en la Guía del AWS CloudFormation usuario.
Para usar extensiones de idioma en una AWS SAM plantilla, enumere AWS::LanguageExtensions en la Transform sección anteriorAWS::Serverless-2016-10-31:
Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31
Cuando se AWS SAMCLI detecta AWS::LanguageExtensions en la Transform sección de una plantilla y se ha optado por el procesamiento local, se expanden las construcciones de extensiones de idioma de forma local antes de ejecutar las AWS SAM transformaciones. Esto permitesam build, sam packagesam deploy,sam sync,sam validate, sam local invokesam local start-api, y sam local start-lambda trabajar con plantillas que utilizan estas construcciones.
El procesamiento local está desactivado de forma predeterminada. Cuando está desactivada, AWS SAMCLI transfiere la plantilla sin cambios y CloudFormation procesa la AWS::LanguageExtensions transformación del lado del servidor en el momento de la implementación. Para conocer los métodos de activación, consulte. Habilitar las extensiones de idioma
La expansión se produce en dos fases cuando está habilitada:
-
Fase 1 (extensiones de idioma): los
Fn::ForEachbucles se expanden, las funciones intrínsecas se resuelven siempre que es posible y la plantilla se convierte en estándar CloudFormation. -
Fase 2 (AWS SAM transformación): el AWS SAM traductor procesa la plantilla expandida como de costumbre.
La plantilla original (Fn::ForEachintacta) se conserva para su CloudFormation implementación, ya que CloudFormation procesa la AWS::LanguageExtensions transformación en el servidor.
Habilitar las extensiones de idioma
El procesamiento local de AWS::LanguageExtensions es opcional para cada comando. Hay tres métodos de activación equivalentes, enumerados por orden de prioridad:
-
CLIbandera: transmite una
--language-extensionssola invocación:sam build --language-extensions sam package --language-extensions ... sam deploy --language-extensions ...--no-language-extensionsdeshabilita explícitamente, anulando tantosamconfig.tomlla variable de entorno como la que se describe a continuación. -
samconfig.toml— conservar la elección por proyecto:[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 = trueLa
samconfig.tomlentrada se carga de forma predeterminada para el comando, por lo que surte efecto como si se hubiera pasado la bandera y, por lo tanto, prevalece sobre la variable de entorno. -
Variable de entorno: configurada
SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1para habilitarla en el shell actual:export SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1 sam build sam local invoke MyFunctionLos valores verdaderos (no distinguen mayúsculas de minúsculas) son
1, ytrue.yesTodo lo demás, incluida la cadena vacía, se considera desactivado. La variable de entorno solo se consulta cuando ni la CLI marca nisamconfig.tomlestablece un valor.
importante
Cada comando necesita su propia activación. La transferencia --language-extensions a sam build no se propaga a otra versión posteriorsam local invoke: el procesamiento local se decide en función de la invocación del comando. Utilice la variable de entorno o una samconfig.toml entrada para activar todos los comandos sin repetir la marca.
Ventilador: ForEach
Fn::ForEachgenera múltiples recursos, condiciones o resultados a partir de una única definición de plantilla:
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}
Al sam build ejecutarlo, se expande y UsersFunction OrdersFunctionProductsFunction, cada uno se crea a partir de su directorio fuente respectivo.
Propiedades de los artefactos dinámicos
Cuando una propiedad empaquetable utiliza una variable de bucle (por ejemplo,./services/${Name}), AWS SAMCLI genera una CloudFormation Mappings sección que asigna cada valor de colección a su Amazon S3. URI El Fn::ForEach cuerpo se ha reescrito para usarlo de forma que se Fn::FindInMap CloudFormation pueda resolver el artefacto correcto en el momento de la implementación.
Las propiedades de los artefactos reconocidas son las mismas que se reescriben en la actualidad. sam package Esto incluye:
| Tipo de recurso | Propiedad |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
En el caso de las propiedades punteadas (por ejemplo, Command.ScriptLocation Code.ImageUri activadas AWS::Glue::Job o activadasAWS::Lambda::Function), el valor se lee y escribe en la ubicación anidada del recurso. El nombre de mapeo generado usa solo el segmento de hoja de la ruta de la propiedad.
Cuando la propiedad tiene una plantilla de bucle, el nombre del mapeo es SAM<LeafProperty><LoopName> (por ejemplo, o). SAMCodeUriServices SAMScriptLocationJobs
importante
Customer-authored las asignaciones no deben empezar con estos SAM* prefijos, sino que están reservadas para. AWS SAMCLI Consulte Limitaciones.
Por ejemplo, después de: 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]
Múltiples recursos por ForEach organismo
Un solo Fn::ForEach cuerpo puede emitir más de un recurso por iteración. Cada recurso se genera para cada valor de colección:
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
Mapeo: nombre, resolución de colisiones
Cuando dos recursos del mismo Fn::ForEach cuerpo declaran la misma propiedad de artefacto dinámico (por ejemplo, un artefacto dinámico Api y un StateMachine usoDefinitionUri), se AWS SAMCLI añade un sufijo tomado de la parte estática de la plantilla de ID lógico del recurso para mantener la exclusividad de los nombres de los mapas:
| Plantilla de recursos | Propiedad | Nombre de mapeo |
|---|---|---|
|
|
|
|
|
|
Cuando no hay colisión, se utiliza el nombre base (por ejemplo,SAMDefinitionUriServices).
Parameter-based colecciones
Cuando la Fn::ForEach colección es una referencia de parámetros (por ejemplo!Ref ServiceNames) y el cuerpo del bucle utiliza una propiedad de artefacto dinámico (por ejemplo,CodeUri: ./services/${Name}), AWS SAMCLI necesita los valores de la colección para generar SAM* las asignaciones descritas en. Propiedades de los artefactos dinámicos Los resuelve cuando procesa la plantilla, a partir de:
-
--parameter-overridespasados al AWS SAMCLI comando. -
El
Defaultvalor del parámetro en la plantilla.
importante
Como SAM* las asignaciones se incorporan al empaquetar, debe volver a empaquetarlas siempre que cambie el valor del parámetro (por ejemplo, al añadir un nuevo servicio) para que las asignaciones incluyan entradas para los nuevos valores. Esto solo se aplica cuando el parámetro genera un bucle de artefactos dinámico; otras anulaciones de parámetros se pueden cambiar en el momento de la implementación, como de costumbre.
# 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"
Pilas anidadas
Fn::ForEachen pilas anidadas, se admiten plantillas (AWS::CloudFormation::Stack). AWS SAMCLIPasa la Parameters propiedad de la pila principal a la expansión de la plantilla secundaria, de modo que Fn::ForEach las colecciones secundarias que hacen referencia a los parámetros proporcionados por la matriz se resuelvan correctamente.
# parent.yaml Resources: ChildStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./child.yaml Parameters: ServiceNames: "Users,Orders,Products"
Ventilador anidado: ForEach
Se admiten hasta 5 niveles de anidación, igualando el límite: CloudFormation
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 en salidas
Fn::ForEachlos bloques también se expanden dentro de la Outputs sección, por lo que puedes emitir una salida por cada valor de colección:
Outputs: Fn::ForEach::FunctionArns: - Name - [alpha, beta] - ${Name}FunctionArn: Value: !GetAtt - !Sub "${Name}Function" - Arn
Condiciones y DependsOn
Los recursos emitidos por Fn::ForEach pueden transportar Condition y DependsOn como cualquier otro recurso. La condición o dependencia se replica en cada recurso generado:
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}/
&Sintaxis {identifier}
La &{identifier} sintaxis elimina los caracteres no alfanuméricos del valor sustituido, lo que resulta útil para generar identificadores lógicos válidos a partir de valores como las direcciones IP:
Fn::ForEach::Hosts: - IP - ["10.0.0.1", "10.0.0.2"] - Host&{IP}: Type: AWS::EC2::Instance # Expands to Host10001, Host10002
Funciones intrínsecas compatibles
Las siguientes funciones intrínsecas se resuelven localmente durante la expansión:
| Función | Description (Descripción) |
|---|---|
|
Expansión de bucles. |
|
Devuelve el recuento de elementos de la lista. |
|
Convierte un valor en una JSON cadena. |
|
Búsqueda de mapas, incluida la opcional |
|
Selección de valores condicionales. |
|
Sustitución de cadenas. |
|
Concatenación de cadenas. |
|
División de cadenas. |
|
Selección de elementos de lista. |
|
Codificación Base64. |
|
Evaluación del estado. |
|
Referencias de parámetros y pseudoparámetros. |
Las funciones que requieren recursos desplegados (Fn::GetAtt,Fn::ImportValue,Fn::GetAZs) se conservan para que se resuelvan en CloudFormation el momento de la implementación.
Errores de validación
Los siguientes problemas de plantilla se detectan localmente antes de que se ejecute la AWS SAM transformación:
| Causa | Mensaje de error |
|---|---|
El |
|
|
|
La colección se resuelve en una lista vacía (por ejemplo, un |
Sin error: el ciclo se omite silenciosamente y no se emite ningún recurso. |
El |
Sin error: la referencia no resuelta se conserva en la plantilla. En el momento de la implementación, lo CloudFormation resolverá del lado del servidor. |
Limitaciones
-
Las colecciones deben poder resolverse en el momento. build/package
Fn::ForEachLas colecciones que utilizanFn::GetAttreferencias dinámicas de SSM/Secrets Manager o Manager no se pueden expandir localmente.Fn::ImportValueEn su--parameter-overrideslugar, utilice un parámetro con. -
Los mapeos dinámicos de artefactos se fijan en el momento del paquete. Cuando una
Fn::ForEachcolección es una referencia de parámetro y el cuerpo del bucle utiliza una propiedad de artefacto dinámico (por ejemplo,CodeUri: ./services/${Name}), lasSAM*asignaciones generadas solo contienen entradas para los valores de los parámetros que se resolvieron en el momento del paquete. Si--parameter-overridescambias ese parámetro en el momento del despliegue sin volver a empaquetarlo, los nuevos valores no tendrán entradas de mapeo y el despliegue fallará. Esto no se aplica a los parámetros que no se utilizan para controlar un artefactoFn::ForEachdinámico. -
DeletionPolicyyUpdateReplacePolicyse validan y resuelven durante la expansión. Son compatibles conReflos parámetros, pero no con otras funciones intrínsecas. -
Límite de anidación. Se
Fn::ForEachpueden anidar hasta 5 niveles de, lo que coincide con el límite del lado del CloudFormation servidor. -
Nombres de mapeo reservados. Los nombres de mapeo que comiencen con alguno de los siguientes están reservados para el AWS SAMCLI; no cree sus propios mapeos con estos prefijos:
-
SAMCodeUri,SAMImageUri,,SAMContentUri,SAMDefinitionUri,SAMSchemaUri,,SAMBodyS3Location,SAMDefinitionS3LocationSAMTemplateURLSAMCode,SAMContent— emitido porsam packagepara propiedades de artefactos dinámicos. Consulte la Propiedades de los artefactos dinámicos tabla. -
SAMLayers— emitidosam buildcuando una funciónFn::ForEachgenerada recoge referencias de capa de dependencia generadas automáticamente (Lambda coloca las compilaciones en capas AWS SAMCLI en una pila anidada). Este prefijo no tiene ninguna propiedad correspondiente creada por el usuario; se añade automáticamente.
-
Telemetría
AWS SAMCLIEmite un evento de CFNLanguageExtensions telemetría cuando se invoca un comando con --language-extensions (o su equivalente en una variable de entorno) y la plantilla declara la transformación. AWS::LanguageExtensions El evento se activa una vez por invocación y no se transmite el contenido de la plantilla. Cuando el procesamiento local está desactivado (opción predeterminada), no se desencadena ningún evento.