

# Sintaxis de Resources de la plantilla de CloudFormation
<a name="resources-section-structure"></a>

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
<a name="resources-section-structure-syntax"></a>

La sección `Resources` usa la siguiente sintaxis:

### JSON
<a name="resources-section-structure-syntax.json"></a>

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

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

### YAML
<a name="resources-section-structure-syntax.yaml"></a>

```
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*)
<a name="resources-section-logical-id"></a>

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
<a name="resources-section-resource-type"></a>

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 una lista completa de los tipos de recursos compatibles, consulte [Referencia de tipos de recursos y propiedades de AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

## Propiedades de recursos
<a name="resources-section-resource-properties"></a>

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](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

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
<a name="resource-properties-example.json"></a>

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

### YAML
<a name="resource-properties-example.yaml"></a>

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

## ID físicos
<a name="resources-section-physical-id"></a>

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](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-name.html).

## Recursos de referencia
<a name="using-cross-resource-references"></a>

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`
<a name="resource-properties-ref"></a>

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
<a name="resource-properties-ref-example.json"></a>

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

#### YAML
<a name="resource-properties-ref-example.yaml"></a>

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

Para obtener información detallada sobre el uso de la función `Ref`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html). 

### La función de `Fn::GetAtt`
<a name="resource-properties-getatt"></a>

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
<a name="resource-properties-getatt-example.json"></a>

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

#### YAML
<a name="resource-properties-getatt-example.yaml"></a>

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

Para obtener información detallada sobre el uso de la función `GetAtt`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html).

## Ejemplos
<a name="resources-section-structure-examples"></a>

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.

**Topics**
+ [Declaración de un único recurso con un nombre personalizado](#resources-section-structure-examples-single-resource)
+ [Referencias a otros recursos con la función `Ref`](#resources-section-structure-examples-ref)
+ [Referencias a los atributos de los recursos con la función `Fn::GetAtt`](#resources-section-structure-examples-getatt)

### Declaración de un único recurso con un nombre personalizado
<a name="resources-section-structure-examples-single-resource"></a>

En los siguientes ejemplos, 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
<a name="resources-section-structure-examples-single-resource.json"></a>

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

#### YAML
<a name="resources-section-structure-examples-single-resource.yaml"></a>

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

### Referencias a otros recursos con la función `Ref`
<a name="resources-section-structure-examples-ref"></a>

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
<a name="resources-section-structure-examples-ref.json"></a>

```
{
    "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
<a name="resources-section-structure-examples-ref.yaml"></a>

```
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`
<a name="resources-section-structure-examples-getatt"></a>

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
<a name="resources-section-structure-examples-getatt.json"></a>

```
{
  "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
<a name="resources-section-structure-examples-getatt.yaml"></a>

```
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
```