Referencia sintáctica de la sección Resources para las plantillas de CloudFormation - AWS CloudFormation

Referencia sintáctica de la sección Resources para las plantillas de CloudFormation

La sección Resources es una sección de nivel superior obligatoria en una plantilla de CloudFormation. Declara los recursos de AWS que usted desea que CloudFormation aprovisione y configure como parte de su pila.

Sintaxis

La sección Resources usa la siguiente sintaxis:

JSON

"Resources" : { "LogicalResourceName1" : { "Type" : "AWS::ServiceName::ResourceType", "Properties" : { "PropertyName1" : "PropertyValue1", ... } }, "LogicalResourceName2" : { "Type" : "AWS::ServiceName::ResourceType", "Properties" : { "PropertyName1" : "PropertyValue1", ... } } }

YAML

Resources: LogicalResourceName1: Type: AWS::ServiceName::ResourceType Properties: PropertyName1: PropertyValue1 ... LogicalResourceName2: Type: AWS::ServiceName::ResourceType Properties: PropertyName1: PropertyValue1 ...

ID lógico (también denominado nombre lógico)

En una plantilla de CloudFormation, los recursos se identifican por sus nombres de recursos lógicos. Estos nombres deben ser alfanuméricos (A-Za-z0-9) y únicos dentro de la plantilla. Los nombres lógicos se usan para referenciar a los recursos de otras secciones de la plantilla.

Tipo de recurso

Cada recurso debe tener un atributo Type, que define el tipo de recurso de AWS que es. El atributo Type tiene el formato AWS::ServiceName::ResourceType. Por ejemplo, el atributo Type de un bucket de Amazon S3 es AWS::S3::Bucket.

Para obtener la lista completa de los tipos de recursos admitidos, consulte la Referencia de tipos de recursos y propiedades de AWS.

Propiedades de recursos

Las propiedades de recursos son opciones adicionales que puede especificar para definir los detalles de configuración para un tipo de recurso específico. Algunas propiedades son obligatorias, mientras que otras son opcionales. Algunas propiedades tienen valores predeterminados, por lo que especificarlas es opcional.

Para obtener información sobre las propiedades compatibles con cada tipo de recurso, consulte los temas en Referencia de tipos de recursos y propiedades de AWS.

Los valores de la propiedad pueden ser cadenas literales, listas de cadenas, booleanos, referencias dinámicas, referencias de parámetros, pseudoreferencias o el valor devuelto por una función. En los siguientes ejemplos, se indica cómo declarar diferentes tipos de valores de propiedades:

JSON

"Properties" : { "String" : "A string value", "Number" : 123, "LiteralList" : [ "first-value", "second-value" ], "Boolean" : true }

YAML

Properties: String: A string value Number: 123 LiteralList: - first-value - second-value Boolean: true

ID físicos

Además de lo IDs lógicos, determinados recursos también tienen un ID físico, que es el nombre asignado real de dicho recurso, como un ID de instancia de EC2 o un nombre de bucket de S3. Utilice los ID físicos para identificar recursos fuera de las plantillas de CloudFormation, pero solo después de que se hayan creado los recursos. Por ejemplo, suponga que da a un recurso de instancia de EC2 un ID lógico de MyEC2Instance. Cuando CloudFormation crea la instancia, CloudFormation genera y asigna automáticamente un ID físico (como por ejemplo i-1234567890abcdef0) a la instancia. Puede utilizar este ID físico para identificar la instancia y ver sus propiedades (como, por ejemplo, el nombre de DNS) a través de la consola de Amazon EC2.

Para los buckets de Amazon S3 y muchos otros recursos, CloudFormation genera automáticamente un nombre físico único para el recurso si no se especifica uno de forma explícita. Este nombre físico se basa en una combinación del nombre de la pila de CloudFormation, el nombre lógico del recurso especificado en la plantilla de CloudFormation y un identificador único. Por ejemplo, si tiene un bucket de Amazon S3 con el nombre lógico MyBucket en una pila con nombre MyStack, CloudFormation podría dar nombre al bucket con el nombre físico MyStack-MyBucket-abcdefghijk1.

En el caso de los recursos compatibles con los nombres personalizados, puede asignar sus propios nombres para identificar rápidamente los recursos. Por ejemplo, puede denominar un bucket de S3 que almacena registros MyPerformanceLogs. Para obtener más información, consulte Tipo de nombre.

Recursos de referencia

A menudo, es necesario establecer las propiedades de un recurso en función del nombre o la propiedad de otro recurso. Por ejemplo, puede crear una instancia de EC2 que utilice los grupos de seguridad de EC2 o una distribución de CloudFront respladada por un bucket de S3. Todos estos recursos se pueden crear en la misma plantilla de CloudFormation.

CloudFormation proporciona funciones intrínsecas que puede utilizar para hacer referencia a otros recursos y sus propiedades. Estas funciones le permiten crear dependencias entre los recursos y pasar valores de un recurso a otro.

La función de Ref

Por lo general, la función Ref se utiliza para recuperar una propiedad de identificación de los recursos definidos en la misma plantilla de CloudFormation. Los resultados dependen del tipo de recurso. En la mayoría de recursos, devuelve el nombre físico del recurso. Sin embargo, es posible que algunos tipos de recurso devuelvan un valor diferente, como, por ejemplo, una dirección IP para un recurso AWS::EC2::EIP o un Nombre de recurso de Amazon (ARN) para un tema de Amazon SNS.

Los siguientes ejemplos muestran cómo utilizar la función Ref en propiedades. En cada uno de estos ejemplos, el resultado de la función Ref será el nombre real del recurso LogicalResourceName declarado en otra parte de la plantilla. El ejemplo de sintaxis !Ref del ejemplo del archivo YAML es solo una forma más corta de escribir la función Ref.

JSON

"Properties" : { "PropertyName" : { "Ref" : "LogicalResourceName" } }

YAML

Properties: PropertyName1: Ref: LogicalResourceName PropertyName2: !Ref LogicalResourceName

Para obtener información detallada sobre el uso de la función Ref, consulte la función Ref.

La función de Fn::GetAtt

La función Ref es útil si el parámetro o el valor que se brinda para un recurso es exactamente lo que desea. Sin embargo, es posible que necesite otros atributos de un recurso. Por ejemplo, si desea crear una distribución de CloudFront con un origen de S3, debe especificar la ubicación del bucket mediante una dirección de estilo DNS. Una serie de recursos tienen atributos adicionales cuyos valores puede utilizar en su plantilla. Para obtener estos atributos, utilice la función Fn::GetAtt.

Los siguientes ejemplos muestran cómo utilizar la función GetAtt en propiedades. La función Fn::GetAtt tiene dos parámetros: el nombre lógico del recurso y el nombre del atributo que debe recuperarse. El ejemplo de sintaxis !GetAtt del ejemplo del archivo YAML es solo una forma más corta de escribir la función GetAtt.

JSON

"Properties" : { "PropertyName" : { "Fn::GetAtt" : [ "LogicalResourceName", "AttributeName" ] } }

YAML

Properties: PropertyName1: Fn::GetAtt: - LogicalResourceName - AttributeName PropertyName2: !GetAtt LogicalResourceName.AttributeName

Para obtener información detallada sobre el uso de la función GetAtt, consulte Fn::GetAtt.

Ejemplos

En los siguientes ejemplos, se ilustra cómo declarar los recursos y cómo las plantillas de CloudFormation pueden referenciar a otros recursos definidos en la misma plantilla y a los recursos de AWS existentes.

Declaración de un único recurso con un nombre personalizado

En el siguiente ejemplo, se declara un único recurso de tipo AWS::S3::Bucket con el nombre lógico MyBucket. La propiedad BucketName está establecida en amzn-s3-demo-bucket y debe sustituirse por el nombre deseado para su bucket de S3.

Si utiliza esta declaración de recursos para crear una pila, CloudFormation creará un bucket de Amazon S3 con la configuración predeterminada. Para otros recursos, como una instancia de Amazon EC2 o un grupo de escalado automático, CloudFormation requiere más información.

JSON

{ "Resources": { "MyBucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket" } } } }

YAML

Resources: MyBucket: Type: 'AWS::S3::Bucket' Properties: BucketName: amzn-s3-demo-bucket

Referencias a otros recursos con la función Ref

En los siguientes ejemplos, se muestra una declaración de recursos que define una instancia de EC2 y un grupo de seguridad. El recurso Ec2Instance referencia al recurso InstanceSecurityGroup como parte de su propiedad SecurityGroupIds con la función Ref. También incluye un grupo de seguridad existente (sg-12a4c434) que no está declarado en la plantilla. Debe utilizar cadenas literales para hacer referencia a recursos de AWS existentes.

JSON

{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroupIds": [ { "Ref": "InstanceSecurityGroup" }, "sg-12a4c434" ], "KeyName": "MyKey", "ImageId": "ami-1234567890abcdef0" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } } } }

YAML

Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroupIds: - !Ref InstanceSecurityGroup - sg-12a4c434 KeyName: MyKey ImageId: ami-1234567890abcdef0 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0

Referencias a los atributos de los recursos con la función Fn::GetAtt

En los siguientes ejemplos, se muestra una declaración de recursos que define un recurso de distribución de CloudFront y un bucket de S3. El recurso MyDistribution especifica el nombre DNS del recurso MyBucket con la función Fn::GetAtt para obtener el atributo DomainName del bucket. Observará que la función Fn::GetAtt enumera sus dos parámetros en una matriz. Para funciones que utilizan varios parámetros, usted utiliza una matriz para especificar los parámetros.

JSON

{ "Resources": { "MyBucket": { "Type": "AWS::S3::Bucket" }, "MyDistribution": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "Origins": [ { "DomainName": { "Fn::GetAtt": [ "MyBucket", "DomainName" ] }, "Id": "MyS3Origin", "S3OriginConfig": {} } ], "Enabled": "true", "DefaultCacheBehavior": { "TargetOriginId": "MyS3Origin", "ForwardedValues": { "QueryString": "false" }, "ViewerProtocolPolicy": "allow-all" } } } } } }

YAML

Resources: MyBucket: Type: 'AWS::S3::Bucket' MyDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: !GetAtt - MyBucket - DomainName Id: MyS3Origin S3OriginConfig: {} Enabled: 'true' DefaultCacheBehavior: TargetOriginId: MyS3Origin ForwardedValues: QueryString: 'false' ViewerProtocolPolicy: allow-all