Plantillas de de ejemplo
Cree condicionalmente recursos para una pila de producción, desarrollo o prueba
En algunos casos, es posible que desee crear pilas que son similares, pero con pequeñas modificaciones. Por ejemplo, podría tener una plantilla que utiliza para aplicaciones de producción. Tiene que crear la misma pila de producción para poder usarla con fines de desarrollo o de realización de pruebas. Sin embargo, para el desarrollo y la realización de pruebas, es posible que no necesite toda la capacidad adicional que se incluye en una pila de nivel de producción. En su lugar, puede utilizar un parámetro de entrada de tipo de entorno para crear condicionalmente recursos de la pila específicos de producción, desarrollo o pruebas, tal y como se muestra en el siguiente ejemplo:
ejemplo JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-0ff8a91507f77f867"}, "us-west-1" : { "AMI" : "ami-0bdb828fd58c52235"}, "us-west-2" : { "AMI" : "ami-a0cfeed8"}, "eu-west-1" : { "AMI" : "ami-047bb4163c506cd98"}, "sa-east-1" : { "AMI" : "ami-07b14488da8ea02a0"}, "ap-southeast-1" : { "AMI" : "ami-08569b978cc4dfa10"}, "ap-southeast-2" : { "AMI" : "ami-09b42976632b27e9b"}, "ap-northeast-1" : { "AMI" : "ami-06cd52961ce9f0d85"} } }, "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "dev", "test"], "ConstraintDescription" : "must specify prod, dev, or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]}, "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}, "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c1.xlarge", {"Fn::If" : [ "CreateDevResources", "m1.large", "m1.small" ]} ]} } }, "MountPoint" : { "Type" : "AWS::EC2::VolumeAttachment", "Condition" : "CreateProdResources", "Properties" : { "InstanceId" : { "Ref" : "EC2Instance" }, "VolumeId" : { "Ref" : "NewVolume" }, "Device" : "/dev/sdh" } }, "NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "CreateProdResources", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} } } } }
ejemplo YAML
AWSTemplateFormatVersion: "2010-09-09" Mappings: RegionMap: us-east-1: AMI: "ami-0ff8a91507f77f867" us-west-1: AMI: "ami-0bdb828fd58c52235" us-west-2: AMI: "ami-a0cfeed8" eu-west-1: AMI: "ami-047bb4163c506cd98" sa-east-1: AMI: "ami-07b14488da8ea02a0" ap-southeast-1: AMI: "ami-08569b978cc4dfa10" ap-southeast-2: AMI: "ami-09b42976632b27e9b" ap-northeast-1: AMI: "ami-06cd52961ce9f0d85" Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: [prod, dev, test] ConstraintDescription: must specify prod, dev, or test. Conditions: CreateProdResources: !Equals [!Ref EnvType, prod] CreateDevResources: !Equals [!Ref EnvType, "dev"] Resources: EC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI] InstanceType: !If [CreateProdResources, c1.xlarge, !If [CreateDevResources, m1.large, m1.small]] MountPoint: Type: "AWS::EC2::VolumeAttachment" Condition: CreateProdResources Properties: InstanceId: !Ref EC2Instance VolumeId: !Ref NewVolume Device: /dev/sdh NewVolume: Type: "AWS::EC2::Volume" Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
Puede especificar prod
, dev
o test
para el parámetro EnvType
. Para cada tipo de entorno, la plantilla especifica un tipo de instancia diferente. Los tipos de instancia varían desde un tipo de instancia grande optimizada para computación a un tipo de instancia pequeño de uso general. Para especificar condicionalmente el tipo de instancia, la plantilla define dos condiciones en la sección Conditions de la plantilla: CreateProdResources
, que se evalúa como true si el valor del parámetro EnvType
es igual a prod
y CreateDevResources
, que se evalúa como true si el valor del parámetro es igual a dev
.
En la propiedad InstanceType
, la plantilla anida dos funciones intrínsecas Fn::If
para determinar qué tipo de instancia utilizar. Si la condición CreateProdResources
es true, el tipo de instancia es c1.xlarge
. Si la condición es falsa, se evalúa la condición CreateDevResources
. Si la condición CreateDevResources
es true, el tipo de instancia es m1.large
o de lo contrario el tipo de instancia es m1.small
.
Además del tipo de instancia, el entorno de producción crea y adjunta un volumen de Amazon EC2 a la instancia. Los recursos MountPoint
y NewVolume
se asocian con la condición CreateProdResources
para que los recursos se creen únicamente si la condición se evalúa como true.
Asignación condicional de una propiedad de recurso
En este ejemplo, puede crear una instancia de base de datos de Amazon RDS a partir de una instantánea. Si especifica el parámetro DBSnapshotName
, CloudFormation utiliza el valor del parámetro como nombre de la instantánea al crear la instancia de base de datos. Si mantiene el valor predeterminado (cadena vacía), CloudFormation elimina la propiedad DBSnapshotIdentifier
y crea una instancia de base de datos desde cero.
El ejemplo define los parámetros DBUser
y DBPassword
con la propiedad NoEcho
establecida en true
. Si establece el atributo NoEcho
en true
, CloudFormation devuelve el valor del parámetro enmascarado como asteriscos (*****) para cualquier llamada que describa la pila o los eventos de la pila, excepto para la información almacenada en las ubicaciones especificadas a continuación.
importante
El uso del atributo NoEcho
no enmascara ninguna información almacenada en lo que se muestra a continuación:
-
La sección de la plantilla
Metadata
. CloudFormation no transforma, modifica ni redacta ninguna información que incluya en la secciónMetadata
. Para obtener más información, consulte Referencia sintáctica de la sección Metadata para las plantillas de CloudFormation. -
La sección de la plantilla
Outputs
. Para obtener más información, consulte Referencia sintáctica de la sección Outputs para las plantillas de CloudFormation. -
El atributo
Metadata
de una definición de recurso. Para obtener más información, consulte Atributo Metadata.
Recomendamos encarecidamente que no utilice estos mecanismos para incluir información confidencial, como contraseñas o secretos.
importante
En lugar de integrar información confidencial directamente en las plantillas de CloudFormation, se recomienda utilizar parámetros dinámicos en la plantilla de la pila para hacer referencia a la información confidencial almacenada y administrada fuera de CloudFormation, como en AWS Systems Manager Parameter Store o AWS Secrets Manager.
Para obtener más información, consulte las Prácticas recomendadas de No integre credenciales en sus plantillas.
ejemplo JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters": { "DBUser": { "NoEcho": "true", "Description" : "The database admin account username", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*", "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters." }, "DBPassword": { "NoEcho": "true", "Description" : "The database admin account password", "Type": "String", "MinLength": "1", "MaxLength": "41", "AllowedPattern" : "[a-zA-Z0-9]*", "ConstraintDescription" : "must contain only alphanumeric characters." }, "DBSnapshotName": { "Description": "The name of a DB snapshot (optional)", "Default": "", "Type": "String" } }, "Conditions": { "UseDBSnapshot": {"Fn::Not": [{"Fn::Equals" : [{"Ref" : "DBSnapshotName"}, ""]}]} }, "Resources" : { "MyDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.t2.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }, "MyRDSParamGroup" : { "Type": "AWS::RDS::DBParameterGroup", "Properties" : { "Family" : "MySQL5.5", "Description" : "CloudFormation Sample Database Parameter Group", "Parameters" : { "autocommit" : "1" , "general_log" : "1", "old_passwords" : "0" } } } } }
ejemplo YAML
AWSTemplateFormatVersion: "2010-09-09" Parameters: DBUser: NoEcho: true Description: The database admin account username Type: String MinLength: 1 MaxLength: 16 AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*" ConstraintDescription: must begin with a letter and contain only alphanumeric characters. DBPassword: NoEcho: true Description: The database admin account password Type: String MinLength: 1 MaxLength: 41 AllowedPattern: "[a-zA-Z0-9]*" ConstraintDescription: must contain only alphanumeric characters. DBSnapshotName: Description: The name of a DB snapshot (optional) Default: "" Type: String Conditions: UseDBSnapshot: !Not [!Equals [!Ref DBSnapshotName, ""]] Resources: MyDB: Type: "AWS::RDS::DBInstance" Properties: AllocatedStorage: 5 DBInstanceClass: db.t2.small Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"] MyRDSParamGroup: Type: "AWS::RDS::DBParameterGroup" Properties: Family: MySQL5.5 Description: CloudFormation Sample Database Parameter Group Parameters: autocommit: 1 general_log: 1 old_passwords: 0
La condición UseDBSnapshot
se evalúa como true únicamente si el DBSnapshotName
no es una cadena vacía. Si la condición UseDBSnapshot
se evalúa como true, CloudFormation utiliza el valor del parámetro DBSnapshotName
para la propiedad DBSnapshotIdentifier
. Si se evalúa la condición como false, CloudFormation elimina la propiedad DBSnapshotIdentifier
. El pseudoparámetro AWS::NoValue
elimina la propiedad de recurso correspondiente cuando se utiliza como un valor devuelto.
Uso condicional de un recurso existente
En este ejemplo, puede utilizar un grupo de seguridad de Amazon EC2 que ya se ha creado o puede crear un grupo de seguridad nuevo, que se especifica en la plantilla. Para el parámetro ExistingSecurityGroup
, puede especificar el nombre del grupo de seguridad default
o NONE
. Si especifica default
, CloudFormation utiliza un grupo de seguridad que ya se ha creado y se llama default
. Si especifica NONE
, CloudFormation crea el grupo de seguridad que se define en la plantilla.
ejemplo JSON
{ "Parameters" : { "ExistingSecurityGroup" : { "Description" : "An existing security group ID (optional).", "Default" : "NONE", "Type" : "String", "AllowedValues" : ["default", "NONE"] } }, "Conditions" : { "CreateNewSecurityGroup" : {"Fn::Equals" : [{"Ref" : "ExistingSecurityGroup"}, "NONE"] } }, "Resources" : { "MyInstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "ami-0ff8a91507f77f867", "SecurityGroups" : [{ "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] }] } }, "NewSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Condition" : "CreateNewSecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80", "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0" } ] } } }, "Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] } } } }
ejemplo YAML
Parameters: ExistingSecurityGroup: Description: An existing security group ID (optional). Default: NONE Type: String AllowedValues: - default - NONE Conditions: CreateNewSecurityGroup: !Equals [!Ref ExistingSecurityGroup, NONE] Resources: MyInstance: Type: "AWS::EC2::Instance" Properties: ImageId: "ami-0ff8a91507f77f867" SecurityGroups: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup] NewSecurityGroup: Type: "AWS::EC2::SecurityGroup" Condition: CreateNewSecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]
Para determinar si desea crear el recurso NewSecurityGroup
, el recurso se asocia a la condición CreateNewSecurityGroup
. El recurso se crea únicamente cuando la condición es true (cuando el parámetro ExistingSecurityGroup
es igual a NONE
).
En la propiedad SecurityGroups
, la plantilla utiliza la función intrínseca Fn::If
para determinar qué grupo de seguridad utilizar. Si la condición CreateNewSecurityGroup
se evalúa como true, la propiedad del grupo de seguridad hace referencia al recurso NewSecurityGroup
. Si la condición CreateNewSecurityGroup
se evalúa como false, la propiedad del grupo de seguridad hace referencia al parámetro ExistingSecurityGroup
(el grupo de seguridad default
).
Por último, la plantilla devuelve condicionalmente el ID del grupo de seguridad. Si la condición CreateNewSecurityGroup
se evalúa como true, CloudFormation devuelve el ID del grupo de seguridad del recurso NewSecurityGroup
. Si la condición es false, CloudFormation devuelve el ID de grupo de seguridad del recursoExistingSecurityGroup
.