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::
. Por ejemplo, el atributo ServiceName
::ResourceType
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
: !RefLogicalResourceName
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
: !GetAttLogicalResourceName
.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.
Temas
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