

# Trabalhar com modelos do CloudFormation
<a name="template-guide"></a>

Um modelo do AWS CloudFormation define os recursos da AWS que você deseja criar, atualizar ou excluir como parte de uma pilha. Ele consiste em várias seções, mas a única seção necessária é a seção [Resources](resources-section-structure.md), que deve declarar pelo menos um recurso. 

É possível criar modelos usando os seguintes métodos:
+ **AWS Infrastructure Composer**: uma interface visual para criar modelos.
+ **Editor de texto**: escreva modelos diretamente na sintaxe JSON ou YAML.
+ **Gerador de IaC**: gere modelos com base em recursos provisionados em sua conta que não são gerenciados pelo CloudFormation no momento. O gerador de IaC funciona com uma grande variedade de tipos de recursos compatíveis com a API do Cloud Control na sua região.

Esta seção fornece um guia abrangente sobre como usar as diferentes seções de um modelo do CloudFormation e como começar a criar modelos de pilha. Ela abrange os seguintes tópicos:

**Topics**
+ [Onde os modelos são armazenados](#where-they-get-stored)
+ [Validar modelos](#template-validation)
+ [Conceitos básicos de modelos](#getting-started)
+ [Exemplos de modelo](#sample-templates)
+ [Formato de modelo](template-formats.md)
+ [Seções do modelo](template-anatomy.md)
+ [Compositor de Infraestrutura da AWS](infrastructure-composer-for-cloudformation.md)
+ [AWS CloudFormation Language Server](ide-extension.md)
+ [Gerador de IaC](generate-IaC.md)
+ [Obter valores armazenados em outros serviços](dynamic-references.md)
+ [Obtenha valores da AWS](pseudo-parameter-reference.md)
+ [Obter saídas de pilhas](using-cfn-stack-exports.md)
+ [Especificar recursos existentes no runtime](cloudformation-supplied-parameter-types.md)
+ [Instruções](walkthroughs.md)
+ [Trechos de modelo](template-snippets.md)
+ [Pilhas baseadas em Windows](cfn-windows-stacks.md)
+ [Usar tipos de recursos fornecidos pelo CloudFormation](cloudformation-supplied-resource-types.md)
+ [Criar configurações de recursos reutilizáveis com módulos](modules.md)

## Onde os modelos são armazenados
<a name="where-they-get-stored"></a>

**Bucket do Amazon S3**  
Você pode armazenar modelos do CloudFormation em um bucket do Amazon S3. Ao criar ou atualizar uma pilha, é possível especificar o URL do modelo no S3 em vez de carregá-lo diretamente.

Se você fizer upload de modelos diretamente por meio do Console de gerenciamento da AWS ou AWS CLI, um bucket do S3 será criado automaticamente para você. Para obter mais informações, consulte [Criar uma pilha no console do CloudFormation](cfn-console-create-stack.md).

**Repositório Git**  
Com o [Git sync](git-sync.md), é possível armazenar modelos em um repositório Git. Ao criar ou atualizar uma pilha, é possível especificar o local do repositório Git e a ramificação que contém o modelo, em vez de carregá-lo diretamente ou fazer referência a um URL do S3. O CloudFormation monitora automaticamente o repositório e a ramificação especificados em busca de alterações no modelo. Para obter mais informações, consulte [Criar uma pilha com base no código-fonte do repositório com a sincronização do Git](git-sync-create-stack-from-repository-source-code.md).

## Validar modelos
<a name="template-validation"></a>

**Validação de sintaxe**  
É possível verificar a sintaxe JSON ou YAML do seu modelo usando o comando [validate-template](service_code_examples.md#validate-template-sdk) da CLI ou especificando o modelo no console. O console realiza a validação automaticamente. Para obter mais informações, consulte [Criar uma pilha no console do CloudFormation](cfn-console-create-stack.md). 

No entanto, esses métodos apenas verificam a sintaxe do seu modelo e não validam os valores de propriedade especificados para um recurso.

**Ferramentas adicionais de validação**  
Para validações mais complexas e verificações de melhores práticas, é possível usar ferramentas adicionais, como:
+ [CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint): valide modelos em relação aos [esquemas do provedor de recursos do CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html). Isso inclui verificar se foram usados valores válidos para propriedades dos recursos e práticas recomendadas.
+ [CloudFormation Rain (rain fmt](https://github.com/aws-cloudformation/rain)): formate seus modelos do CloudFormation em um padrão consistente ou reformate um modelo de JSON para YAML (ou YAML para JSON). Ele preserva os comentários ao usar o YAML e muda o uso de funções intrínsecas para a sintaxe curta sempre que possível.

## Conceitos básicos de modelos
<a name="getting-started"></a>

Para começar a criar um modelo do CloudFormation, siga estas etapas:

1. **Escolha recursos**: identifique os recursos da AWS que deseja incluir em sua pilha, como instâncias do EC2, VPCs, grupos de segurança e muito mais.

1. **Escreva o modelo**: escreva o modelo no formato JSON ou YAML, definindo os recursos e suas propriedades.

1. **Salvar o modelo**: salve o modelo localmente com uma extensão de arquivo como: `.json`, `.yaml` ou `.txt`.

1. **Valide o modelo**: valide o modelo usando os métodos descritos na seção [Validar modelos](#template-validation).

1. **Crie uma pilha**: crie uma pilha usando o modelo validado. 

### Planejar o uso da referência do modelo do CloudFormation
<a name="additional-resources"></a>

Ao criar seus modelos, você poderá encontrar documentação sobre a sintaxe detalhada de diferentes tipos de recursos na [Referência de tipos de propriedades e recursos da AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

Geralmente, seus modelos de pilha exigirão funções intrínsecas para atribuir valores de propriedades que não estão disponíveis até o momento da execução, bem como atributos especiais para controlar o comportamento dos recursos. Ao escrever seu modelo, consulte os seguintes recursos para obter orientação:
+ [Referência de função intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html): algumas funções intrínsecas comumente usadas incluem:
  + `Ref`: recupera o valor de um parâmetro ou o ID físico de um recurso.
  + `Sub`: substitui espaços reservados em strings por valores reais.
  + `GetAtt`: retorna o valor de um atributo de um recurso no modelo.
  + `Join`: une um conjunto de valores em uma única string.
+ [Referência de atributo de recurso](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html): alguns atributos especiais comumente usados incluem:
  + `DependsOn`: use esse atributo para especificar que um recurso deve ser criado depois de outro.
  + `DeletionPolicy`: use esse atributo para especificar como o CloudFormation deve lidar com a exclusão de um recurso.

## Exemplos de modelo
<a name="sample-templates"></a>

O CloudFormation fornece modelos de pilha de código aberto que você pode usar para começar. Para obter mais informações, consulte [CloudFormation Sample Templates](https://github.com/aws-cloudformation/aws-cloudformation-templates) no site do GitHub.

Tenha em mente que esses modelos não pretendem estar prontos para produção. Você deve dedicar algum tempo para aprender como eles funcionam, adaptá-los às suas necessidades e garantir que atendam aos padrões de conformidade da sua empresa.

Cada modelo nesse repositório passa pelas verificações do [Linter do CloudFormation](https://github.com/aws-cloudformation/cfn-lint) (cfn-lint) e também por um conjunto básico de regras do AWS CloudFormation Guard baseadas nos Center for Internet Security (CIS) Top 20, com exceção de algumas regras em que era importante manter a amostra concentrada em um único caso de uso.

# Formato de modelo do CloudFormation
<a name="template-formats"></a>

Você pode criar modelos do CloudFormation nos formatos JSON ou YAML. Ambos os formatos atendem ao mesmo propósito, mas oferecem vantagens distintas em termos de legibilidade e complexidade.
+ **JSON**: o JSON é um formato leve de intercâmbio de dados que é fácil de ser analisado e gerado por computadores. No entanto, ele pode ser complicado para humanos lerem e escreverem, especialmente em configurações complexas. Em JSON, o modelo é estruturado usando chaves `{}` e colchetes `[]` aninhados para definir recursos, parâmetros e outros componentes. Sua sintaxe requer uma declaração explícita de cada elemento, o que pode tornar o modelo extremamente detalhado, mas garante a adesão estrita a um formato estruturado. 
+ **YAML**: o YAML foi projetado para ser mais legível por humanos e menos detalhado do que o JSON. Ele usa recuo em vez de chaves e colchetes para denotar o aninhamento, o que pode facilitar a visualização da hierarquia de recursos e parâmetros. O YAML geralmente é preferido por sua clareza e facilidade de uso, especialmente ao lidar com modelos mais complexos. No entanto, a dependência do YAML do uso de recuos pode levar a erros se o espaçamento não for consistente, o que requer atenção cuidadosa para manter a precisão.

## Estrutura do modelo
<a name="template-structure"></a>

Os modelos do CloudFormation são divididos em seções diferentes, e cada seção se destina a conter um tipo específico de informação. Algumas seções devem ser declaradas em uma ordem específica e, para outras, a ordem não importa. No entanto, à medida que você cria o modelo, pode ser útil usar a ordem lógica dos exemplos a seguir, porque valores em uma seção podem fazer referência a valores de uma seção anterior. 

Ao criar modelos, não use seções importantes duplicadas, por exemplo, a seção `Resources`. Embora o CloudFormation possa aceitar o modelo, ele terá um comportamento indefinido ao processá-lo e poderá provisionar recursos incorretamente ou retornar erros inexplicáveis.

### JSON
<a name="template-structure.json"></a>

O exemplo a seguir mostra a estrutura de um modelo no formato JSON com todas as seções disponíveis.

```
{
  "AWSTemplateFormatVersion" : "version date",

  "Description" : "JSON string",

  "Metadata" : {
    template metadata
  },

  "Parameters" : {
    set of parameters
  },
  
  "Rules" : {
    set of rules
  },

  "Mappings" : {
    set of mappings
  },

  "Conditions" : {
    set of conditions
  },

  "Transform" : {
    set of transforms
  },

  "Resources" : {
    set of resources
  },
  
  "Outputs" : {
    set of outputs
  }
}
```

### YAML
<a name="template-structure.yaml"></a>

O exemplo a seguir mostra a estrutura de um modelo no formato YAML com todas as seções disponíveis.

```
---
AWSTemplateFormatVersion: version date

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Rules:
  set of rules

Mappings:
  set of mappings

Conditions:
  set of conditions

Transform:
  set of transforms

Resources:
  set of resources

Outputs:
  set of outputs
```

## Comentários
<a name="template-comments"></a>

Em modelos formatados em JSON, não há suporte a comentários. O JSON, por design, não inclui uma sintaxe para comentários, o que significa que não é possível adicionar comentários diretamente na estrutura JSON. No entanto, se você precisar incluir notas explicativas ou documentação, considere adicionar metadados. Para obter mais informações, consulte o atributo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).

Nos modelos formatados em YAML, é possível incluir comentários em linha usando o símbolo `#`.

O exemplo a seguir mostra um modelo YAML com comentários em linha.

```
AWSTemplateFormatVersion: 2010-09-09
Description: A sample CloudFormation template with YAML comments.
# Resources section
Resources:
  MyEC2Instance: 
    Type: AWS::EC2::Instance
    Properties: 
      # Linux AMI
      ImageId: ami-1234567890abcdef0 
      InstanceType: t2.micro
      KeyName: MyKey
      BlockDeviceMappings:
        - DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
```

## Especificações
<a name="template-formats.supported-specifications"></a>

O CloudFormation é compatível com as seguintes especificações de JSON e YAML:

JSON  
O CloudFormation segue o padrão JSON ECMA-404. Para obter mais informações sobre o formato JSON, consulte [http://www.json.org](http://www.json.org).

YAML  
O CloudFormation é compatível com a especificação do YAML versão 1.1 com algumas exceções. O CloudFormation não é compatível com os seguintes recursos:  
+ As tags `binary`, `omap`, `pairs`, `set` e `timestamp`
+ Aliases
+ Mesclagens de hash
Para obter mais informações sobre o YAML, consulte [https://yaml.org/](https://yaml.org/).

## Saiba mais
<a name="template-formats.learnmore"></a>

Para cada recurso especificado no modelo, você define as propriedades e os valores usando as regras de sintaxe específicas do JSON ou do YAML. Para obter mais informações sobre a sintaxe de modelo de cada formato, consulte [Seções de modelos do CloudFormation](template-anatomy.md).

# Usar expressões regulares em modelos do CloudFormation
<a name="cfn-regexes"></a>

É possível usar expressões regulares (conhecidas como regexes) em vários lugares dentro de um modelo do CloudFormation, como para a propriedade `AllowedPattern` ao criar o [parâmetro](parameters-section-structure.md) de um modelo.

Todas as expressões regulares no CloudFormation estão em conformidade com a sintaxe regex de Java. Consulte uma descrição abrangente da sintaxe regex do Java e de seus constructos em [java.util.regex.Pattern](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html).

Se escrever o modelo do CloudFormation na sintaxe JSON, você deverá escapar qualquer caractere de barra invertida (\$1) na expressão regular adicionando uma barra invertida adicional. Isso porque o JSON interpreta barras invertidas como caracteres de escape, e você precisa escapá-las para garantir que elas sejam tratadas como barras invertidas literais na expressão regular.

Por exemplo, se você incluir `\d` em sua expressão regular para corresponder a um caractere de dígito, você precisará escrevê-lo como `\\d` em seu modelo JSON.

No exemplo a seguir, a propriedade `AllowedPattern` especifica uma expressão regular que corresponde a quatro caracteres de dígitos consecutivos (`\d{4}`). No entanto, como a expressão regular é definida em um modelo JSON, o caractere de barra invertida precisa ser escapado com uma barra invertida adicional (`\\d`).

```
{
  "Parameters": {
    "MyParameter": {
      "Type": "String",
      "AllowedPattern": "\\d{4}"
    }
  }
}
```

Se escrever o modelo do CloudFormation na sintaxe YAML, você deverá colocar a expressão regular entre aspas simples (‘’). Nenhum escape adicional é necessário.

```
Parameters:
  MyParameter:
    Type: String
    AllowedPattern: '\d{4}'
```

**nota**  
Expressões regulares no CloudFormation só são aceitas para fins de validação em contextos específicos, como `AllowedPattern`. Elas não são aceitas como operações de correspondência de padrões nas funções intrínsecas do CloudFormation, como `Fn::Equals`, que realizam somente a comparação exata de strings, e não a correspondência de padrões.

# Seções de modelos do CloudFormation
<a name="template-anatomy"></a>

Cada modelo do CloudFormation consiste em uma ou mais seções, cada uma servindo a um propósito específico. 

A seção **Recursos** é obrigatória em todos os modelos do CloudFormation e forma o núcleo do modelo. Ela especifica os recursos da pilha e suas propriedades, como uma instância do Amazon EC2 ou um bucket do Amazon S3. Cada recurso é definido com um ID lógico exclusivo, tipo e detalhes de configuração específicos. 

A seção **Parâmetros**, embora opcional, desempenha um papel importante para tornar os modelos mais flexíveis. Ele permite que os usuários passem valores em tempo de execução ao criarem ou atualizarem uma pilha. Esses parâmetros podem ser referenciados nas seções `Resources` e `Outputs`, permitindo a personalização sem alterar o modelo em si. Por exemplo, você pode usar parâmetros para especificar tipos de instância ou configurações de ambiente que variam entre as implantações.

A seção **Saídas**, também opcional, define os valores que são retornados quando as propriedades de uma pilha são visualizadas. As saídas fornecem informações úteis, como identificadores de recursos ou URLs, as quais podem ser aproveitadas para fins operacionais ou para integração com outras pilhas. Esta seção ajuda os usuários a recuperar e usar detalhes importantes sobre os recursos criados pelo modelo.

Outras seções opcionais incluem **Mapeamentos**, que funcionam como tabelas de pesquisa para gerenciar valores condicionais. Com os mapeamentos, você define pares de chave valor e os usa com a função intrínseca `Fn::FindInMap` nas seções `Resources` e `Outputs`. Isso é útil para cenários em que você precisa ajustar as configurações com base em condições como Região da AWS ou ambiente.

As seções **Metadados** e **Regras**, embora menos usadas, fornecem funcionalidades adicionais. `Metadata` pode incluir informações adicionais sobre o modelo, ao mesmo tempo que `Rules` valida um parâmetro ou uma combinação de parâmetros durante a criação ou as atualizações da pilha, garantindo que atendam a critérios específicos. A seção **Condições** aumenta ainda mais a flexibilidade ao controlar se determinados recursos são criados ou propriedades são atribuídas a um valor com base em condições como o tipo de ambiente.

Por fim, a seção **Transformar** é usada para aplicar macros durante o processamento do modelo. Para aplicações sem servidor (também chamadas de aplicações do Lambda), ele especifica a versão do [AWS Serverless Application Model (AWS SAM)](https://github.com/awslabs/serverless-application-specification) que deve ser usada. Quando você especifica uma transformação, você pode usar a sintaxe AWS SAM para declarar recursos em seu modelo. O modelo define a sintaxe que você pode usar e como ela é processada. Você também pode usar a transformação `AWS::Include` para incluir trechos de modelo que são armazenados separadamente do modelo principal do CloudFormation. 

Os tópicos a seguir fornecem informações adicionais e exemplos para usar cada seção.

**Topics**
+ [Resources](resources-section-structure.md)
+ [Parameters](parameters-section-structure.md)
+ [Outputs](outputs-section-structure.md)
+ [Mappings](mappings-section-structure.md)
+ [Metadata](metadata-section-structure.md)
+ [Rules](rules-section-structure.md)
+ [Conditions](conditions-section-structure.md)
+ [Transform](transform-section-structure.md)
+ [Versão do formato](format-version-structure.md)
+ [Description](template-description-structure.md)

# Sintaxe de Resources de modelo do CloudFormation
<a name="resources-section-structure"></a>

A seção `Resources` é uma seção obrigatória de nível superior em um modelo do CloudFormation. Ela declara os recursos da AWS que você deseja que o CloudFormation provisione e configure como parte da sua pilha.

## Sintaxe
<a name="resources-section-structure-syntax"></a>

A seção `Resources` usa a seguinte sintaxe:

### 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 (também chamado de *nome lógico*)
<a name="resources-section-logical-id"></a>

Em um modelo do CloudFormation, os recursos são identificados por seus nomes de recursos lógicos. Esses nomes devem ser alfanuméricos (A-Z a-z 0-9) e exclusivos no modelo. Os nomes lógicos são usados para referenciar recursos de outras seções do modelo. 

## Tipo de recurso
<a name="resources-section-resource-type"></a>

Um recurso deve ter um atributo `Type`, que define que tipo de recurso da AWS ele é. O atributo `Type` tem o formato `AWS::ServiceName::ResourceType`. Por exemplo, o atributo `Type` para um bucket do Amazon S3 é `AWS::S3::Bucket`. 

Para obter uma lista completa dos tipos de recursos compatíveis, consulte a [Referência de tipos de propriedades e recursos da AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

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

Propriedades de recursos são opções adicionais que você pode especificar para definir detalhes de configuração para o tipo de recurso específico. Algumas propriedades são obrigatórias, enquanto outras são opcionais. Algumas propriedades têm valores padrão, portanto, especificá-las é opcional.

Para obter detalhes sobre as propriedades com suporte para cada tipo de recurso, consulte os tópicos na [Referência de tipos de propriedades e recursos da AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

Os valores das propriedades podem ser strings literais, listas de strings, booleanos, referências dinâmicas, referências de parâmetros, pseudoreferências ou o valor retornado por uma função. Os exemplos a seguir mostram como declarar diferentes tipos de valor de propriedade:

### 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ísico
<a name="resources-section-physical-id"></a>

Além do ID lógico, determinados recursos também têm um ID físico, que é o nome real atribuído a esse recurso, como o ID de uma instância EC2 ou o nome de um bucket do S3. Use os IDs físicos para identificar recursos fora dos modelos do CloudFormation, mas apenas depois que os recursos forem criados. Por exemplo, suponha que você forneça a um recurso de instância do EC2 um ID lógico de `MyEC2Instance`. Quando o CloudFormation cria a instância, ele gera e atribui automaticamente um ID físico (como `i-1234567890abcdef0`) à instância. Você pode usar esse ID físico para identificar a instância e visualizar suas propriedades (como o nome DNS) usando o console do Amazon EC2. 

Para buckets do Amazon S3 e muitos outros recursos, o CloudFormation gera automaticamente um nome físico exclusivo para o recurso, caso você não especifique um de maneira explícita. Esse nome físico é baseado em uma combinação do nome da pilha do CloudFormation, do nome lógico do recurso especificado no modelo do CloudFormation e de um ID exclusivo. Por exemplo, se você tiver um bucket do Amazon S3 com o nome lógico `MyBucket` em uma pilha chamada `MyStack`, o CloudFormation poderá nomear o bucket com o nome físico `MyStack-MyBucket-abcdefghijk1`.

Para recursos que oferecem suporte a nomes personalizados, é possível atribuir seus próprios nomes físicos para ajudar a identificar os recursos rapidamente. Por exemplo, você pode nomear um bucket do S3 que armazena logs como `MyPerformanceLogs`. Para obter mais informações, consulte [Tipo de nome](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-name.html).

## Fazer referência a recursos
<a name="using-cross-resource-references"></a>

Frequentemente, é necessário definir as propriedades em um recurso com base no nome ou na propriedade de outro recurso. Por exemplo, é possível criar uma instância do EC2 que usa grupos de segurança do EC2 ou uma distribuição do CloudFront baseada em um bucket do S3. Todos esses recursos podem ser criados no mesmo modelo do CloudFormation. 

O CloudFormation oferece funções intrínsecas que você pode usar para fazer referência a outros recursos e suas propriedades. Essas funções permitem criar dependências entre recursos e passar valores de um recurso para outro.

### A função `Ref`
<a name="resource-properties-ref"></a>

A função `Ref` é comumente usada para recuperar uma propriedade de identificação de recursos definidos no mesmo modelo do CloudFormation. O que ela retorna depende do tipo de recurso. Para a maioria de recursos, ela retorna o nome físico do recurso. No entanto, para alguns tipos de recurso, ela pode retornar um valor diferente, como um endereço IP para um recurso `AWS::EC2::EIP` ou um nome do recurso da amazon (ARN) para um tópico do Amazon SNS. 

Os exemplos a seguir demonstram como usar a função `Ref` em propriedades. Em cada um desses exemplos, a função `Ref` retornará o nome real do recurso `LogicalResourceName` declarado em outro lugar no modelo. O exemplo de sintaxe de `!Ref` no exemplo do YAML é apenas uma forma mais curta de escrever a função `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 obter informações mais detalhadas sobre como usar a função `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). 

### A função `Fn::GetAtt`
<a name="resource-properties-getatt"></a>

A função `Ref` será útil se o parâmetro ou o valor retornado para um recurso for exatamente o que você deseja. No entanto, outras propriedades de um recurso podem ser necessárias. Por exemplo, se você deseja criar uma distribuição do CloudFront com uma origem do S3, especifique o local do bucket usando um endereço no estilo de DNS. Diversos recursos têm atributos adicionais cujos valores você pode usar em seu modelo. Para obter esses atributos, é necessário usar a função `Fn::GetAtt`.

Os exemplos a seguir demonstram como usar a função `GetAtt` em propriedades. A função `Fn::GetAtt` utiliza dois parâmetros, o nome lógico do recurso e o nome do atributo para ser recuperado. O exemplo de sintaxe de `!GetAtt` no exemplo do YAML é apenas uma forma mais curta de escrever a função `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 obter informações mais detalhadas sobre como usar a função `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).

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

Os exemplos a seguir ilustram como declarar recursos e como os modelos do CloudFormation podem referenciar outros recursos definidos no mesmo modelo e nos recursos da AWS existentes.

**Topics**
+ [Declarar um único recurso com um nome personalizado](#resources-section-structure-examples-single-resource)
+ [Fazer referência a outros recursos com a função `Ref`](#resources-section-structure-examples-ref)
+ [Fazer referência a atributos de recursos usando a função `Fn::GetAtt`](#resources-section-structure-examples-getatt)

### Declarar um único recurso com um nome personalizado
<a name="resources-section-structure-examples-single-resource"></a>

O exemplo a seguir declara um único recurso do tipo `AWS::S3::Bucket` com o nome lógico `MyBucket`. A propriedade `BucketName` está definida como *amzn-s3-demo-bucket*, que deve ser substituída pelo nome desejado para seu bucket do S3.

Se você usar essa declaração de recurso para criar uma pilha, o CloudFormation criará um bucket do Amazon S3 com configurações padrão. Para outros recursos, como uma instância do Amazon EC2 ou grupo do Auto Scaling, o CloudFormation requer mais informações.

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

### Fazer referência a outros recursos com a função `Ref`
<a name="resources-section-structure-examples-ref"></a>

Os exemplos a seguir mostram uma declaração de recurso que define uma instância do EC2 e um grupo de segurança. O recurso `Ec2Instance` faz referência ao recurso `InstanceSecurityGroup` como parte de sua propriedade `SecurityGroupIds` usando a função `Ref`. Ele também inclui um grupo de segurança (`sg-12a4c434`) existente que não está declarado no modelo. Você pode usar strings literais para fazer referência a recursos da 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
```

### Fazer referência a atributos de recursos usando a função `Fn::GetAtt`
<a name="resources-section-structure-examples-getatt"></a>

Os exemplos a seguir mostram uma declaração de recursos que define um recurso de distribuição do CloudFront e um bucket do S3. O recurso `MyDistribution` especifica o nome DNS do recurso `MyBucket` usando a função `Fn::GetAtt` para obter o atributo `DomainName` do bucket. Você verá que a função `Fn::GetAtt` lista os dois parâmetros em uma matriz. Para as funções que usam vários parâmetros, você deve usar uma matriz para especificá-los.

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

# Sintaxe de Parameters de modelo do CloudFormation
<a name="parameters-section-structure"></a>

Use seção opcional `Parameters` para personalizar os modelos. Com os parâmetros, é possível inserir valores personalizados no modelo toda vez que criar ou atualizar uma pilha. Ao usar parâmetros nos modelos, é possível criar modelos reutilizáveis e flexíveis que podem ser personalizados para cenários específicos. 

Ao definir parâmetros do tipo apropriado, você pode escolher entre uma lista de identificadores de recursos existentes ao usar o console para criar sua pilha. Para obter mais informações, consulte [Especificar recursos existentes no runtime com tipos de parâmetros fornecidos pelo CloudFormation](cloudformation-supplied-parameter-types.md).

Os parâmetros são uma forma popular de especificar valores de propriedades de recursos de pilha. No entanto, pode haver configurações dependentes de região ou um pouco complexas para os usuários entenderem devido a outras condições ou dependências. Nesses casos, talvez você queira colocar alguma lógica no modelo em si de modo que os usuários possam especificar valores mais simples (ou não) para obter os resultados desejados, por exemplo, usando um mapeamento. Para obter mais informações, consulte [Sintaxe de Mappings de modelo do CloudFormation](mappings-section-structure.md).

## Sintaxe
<a name="parameters-section-structure-syntax"></a>

Você declara parâmetros em uma seção `Parameters` do modelo, que usa a seguinte sintaxe geral:

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

```
"Parameters" : {
  "ParameterLogicalID" : {
    "Description": "Information about the parameter",
    "Type" : "DataType",
    "Default" : "value",
    "AllowedValues" : ["value1", "value2"]
  }
}
```

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

```
Parameters:
  ParameterLogicalID:
    Description: Information about the parameter
    Type: DataType
    Default: value
    AllowedValues:
      - value1
      - value2
```

Um parâmetro contém uma lista de atributos que definir o valor e as restrições em relação ao seu valor. O único atributo obrigatório é `Type`, que pode ser `String`, `Number` ou um tipo de parâmetro fornecido pelo CloudFormation. Também é possível adicionar um atributo `Description` que descreve que tipo de valor deve ser especificado. O nome e a descrição do parâmetro são exibidos na página **Especificar parâmetros** quando um usuário usa o modelo no assistente **Criar pilha**.

**nota**  
Por padrão, o console do CloudFormation lista os parâmetros de entrada em ordem alfabética por ID lógico. Para substituir essa ordem padrão e agrupar os parâmetros relacionados, use a chave de metadados `AWS::CloudFormation::Interface` no modelo. Para obter mais informações, consulte [Organizar parâmetros do CloudFormation com metadados `AWS::CloudFormation::Interface`](aws-cloudformation-interface.md).

Para parâmetros com valores padrão, o CloudFormation usa os valores padrão, a menos que os usuários especifiquem outro valor. Se você omitir o atributo padrão, os usuários deverão especificar um valor para esse parâmetro. No entanto, exigir que o usuário insira um valor não garante que o valor seja válido. Para validar o valor de um parâmetro, você pode declarar restrições ou especificar um tipo de parâmetro específico da AWS.

Para parâmetros sem valores padrão, os usuários devem especificar o valor do nome de uma chave na criação da pilha. Se isso não for feito, o CloudFormation falhará ao criar a pilha e lançará uma exceção:

```
Parameters: [KeyName] must have values
```

## Propriedades
<a name="parameters-section-structure-properties"></a>

`AllowedPattern`  
Uma expressão regular que representa os padrões a serem permitidos para tipos `String` ou `CommaDelimitedList`. Quando aplicado a um parâmetro do tipo `String`, o padrão deve corresponder ao valor de parâmetro inteiro fornecido. Quando aplicado a um parâmetro do tipo `CommaDelimitedList`, o padrão deve corresponder a cada valor da lista.  
*Obrigatório*: não

`AllowedValues`  
Uma matriz que contém a lista de valores permitidos para o parâmetro. Quando aplicado a um parâmetro do tipo `String`, o valor do parâmetro deve ser um dos valores permitidos. Quando aplicado a um parâmetro do tipo `CommaDelimitedList`, cada valor da lista deve ser um dos valores permitidos especificados.  
*Obrigatório*: não  
Se você estiver usando YAML e quiser usar as strings `Yes` e `No` para `AllowedValues`, use aspas simples para evitar que o analisador YAML considere esses valores como booleanos.

`ConstraintDescription`  
Uma sequência que explica uma restrição quando a restrição é violada. Por exemplo, sem uma descrição da restrição, um parâmetro que tem um padrão permitido de `[A-Za-z0-9]+` exibe a seguinte mensagem de erro quando o usuário especifica um valor inválido:  
`Malformed input-Parameter MyParameter must match pattern [A-Za-z0-9]+`  
Ao adicionar uma descrição de restrição, como *deve conter apenas letras (maiúsculas e minúsculas) e números*, você pode exibir a seguinte mensagem de erro personalizada:  
`Malformed input-Parameter MyParameter must only contain uppercase and lowercase letters and numbers`  
*Obrigatório*: não

`Default`  
Um valor do tipo apropriado para o modelo a ser usado se nenhum valor for especificado quando uma pilha é criada. Se definir restrições para o parâmetro, você deverá especificar um valor que esteja de acordo com essas restrições.  
*Obrigatório*: não

`Description`  
Uma sequência de até 4000 caracteres que descreve o parâmetro.  
*Obrigatório*: não

`MaxLength`  
Um valor inteiro que determina o maior número de caracteres que você deseja permitir para tipos `String`.  
*Obrigatório*: não

`MaxValue`  
Um valor numérico que determina o maior valor numérico que você deseja permitir para tipos `Number`.  
*Obrigatório*: não

`MinLength`  
Um valor inteiro que determina o menor número de caracteres que você deseja permitir para tipos `String`.  
*Obrigatório*: não

`MinValue`  
Um valor numérico que determina o menor valor numérico que você deseja permitir para tipos `Number`.  
*Obrigatório*: não

`NoEcho`  
Se o valor do parâmetro deve ser mascarado para impedir que ele seja exibido no console, nas ferramentas de linha de comando ou na API. Se você definir o atributo `NoEcho` como `true`, o CloudFormation retornará o valor do parâmetro mascarado como asteriscos (\$1\$1\$1\$1\$1) para qualquer chamada que descreva a pilha ou os eventos de pilha, exceto informações armazenadas nos locais especificados abaixo.  
*Obrigatório*: não  
O uso do atributo `NoEcho` não mascara informações armazenadas no seguinte:  
+ A seção de modelo de `Metadata`. O CloudFormation não transforma, modifica nem edita nenhuma informação incluída na seção `Metadata`. Para obter mais informações, consulte [Metadados](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ A seção de modelo de `Outputs`. Para obter mais informações, consulte [Saídas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
+ O atributo `Metadata` de uma definição de recurso. Para obter mais informações, consulte o atributo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
É altamente recomendável não usar esses mecanismos para incluir informações confidenciais, como senhas ou segredos.
Em vez de incorporar informações confidenciais diretamente em modelos do CloudFormation, recomendamos usar os parâmetros dinâmicos no modelo da pilha para fazer referência a informações confidenciais que são armazenadas e gerenciadas de forma externa ao CloudFormation, como no AWS Systems Manager Parameter Store ou no AWS Secrets Manager.  
Para obter mais informações, consulte a prática recomendada [Não incorporar credenciais nos seus modelos](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).
É altamente recomendável evitar parâmetros `NoEcho`, ou dados confidenciais, nas propriedades do recurso que fazem parte do identificador primário de um recurso.  
Quando um parâmetro `NoEcho` está incluído em uma propriedade que forma um identificador de recurso primário, o CloudFormation pode utilizar o *valor de texto sem formatação real* no identificador do recurso primário. Esse ID de recurso pode aparecer em quaisquer saídas ou destinos derivados.  
Para determinar quais propriedades de recursos compreendem o identificador primário de um tipo de recurso, consulte a documentação de referência de recursos desse recurso na [Referência de tipos de propriedades e recursos da AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html). Na seção **Return values** (Valores de retorno), o valor de retorno da função `Ref` representa as propriedades do recurso que compõem o identificador primário do tipo de recurso.

`Type`  <a name="parameters-section-structure-properties-type"></a>
O tipo de dados para o parâmetro (`DataType`).  
*Obrigatório*: Sim  
O CloudFormation oferece suporte aos seguintes tipos de parâmetros:    
`String`  
Uma sequência literal. É possível usar os seguintes atributos para declarar restrições: `MinLength`, `MaxLength`, `Default`, `AllowedValues` e `AllowedPattern`.   
Por exemplo, os usuários podem especificar `"MyUserName"`.  
`Number`  
Um inteiro ou flutuante. O CloudFormation valida o valor do parâmetro como um número. No entanto, quando você usa o parâmetro em outro lugar no modelo (por exemplo, usando a função intrínseca `Ref`), o valor do parâmetro se torna uma string.  
É possível usar os seguintes atributos para declarar restrições: `MinValue`, `MaxValue`, `Default` e `AllowedValues`.  
Por exemplo, os usuários podem especificar `"8888"`.  
`List<Number>`  
Uma matriz de inteiros ou floats que são separados por vírgulas. O CloudFormation valida o valor do parâmetro como números. No entanto, quando você usa o parâmetro em outro lugar no modelo (por exemplo, usando a função intrínseca `Ref`), o valor do parâmetro se torna uma lista de strings.  
Por exemplo, os usuários poderiam especificar `"80,20"`, e uma `Ref` resultaria em `["80","20"]`.  
`CommaDelimitedList`  
Uma matriz de sequências literais que são separadas por vírgulas. O total de sequências deve ser um número a mais que o número total de vírgulas. Além disso, cada sequência membro é truncado por espaço.  
Por exemplo, os usuários poderiam especificar `"test,dev,prod"`, e uma `Ref` resultaria em `["test","dev","prod"]`.  
AWSTipos de parâmetros específicos da   
Os valores da AWS, como nomes de pares de chaves do Amazon EC2 e IDs de VPC. Para obter mais informações, consulte [Especificar recursos existentes no runtime](cloudformation-supplied-parameter-types.md).  
Tipos de parâmetros do Systems Manager  
Parâmetros que correspondem a parâmetros existentes no Armazenamento de parâmetros do Systems Manager. Você especifica uma chave de parâmetro do Systems Manager como o valor do tipo de parâmetro do Systems Manager e o CloudFormation recupera o valor mais recente no Parameter Store para usá-lo na pilha. Para obter mais informações, consulte [Especificar recursos existentes no runtime](cloudformation-supplied-parameter-types.md).

## Requisitos gerais de parâmetros
<a name="parameters-section-structure-requirements"></a>

Os seguintes requisitos se aplicam ao usar parâmetros:
+ É possível ter no máximo 200 parâmetros em um modelo do CloudFormation.
+ Cada parâmetro deve receber um nome lógico (também chamado de ID lógico), que deve ser alfanumérico e exclusivo entre todos os nomes lógicos no modelo.
+ A cada parâmetro deve ser atribuído um tipo de parâmetro compatível com o CloudFormation. Para obter mais informações, consulte [Tipo](#parameters-section-structure-properties-type).
+ A cada parâmetro deve ser atribuído um valor em runtime para que o CloudFormation provisione a pilha com êxito. Se preferir, especifique um valor padrão para o CloudFormation usar, a menos que outro valor seja fornecido.
+ Os parâmetros devem ser declarados e referenciados no mesmo modelo. Você pode fazer referência a parâmetros nas seções `Resources` e `Outputs` do modelo.

## Exemplos
<a name="parameters-section-examples"></a>

**Topics**
+ [Parâmetro String simples](#parameters-section-structure-example-1)
+ [Parâmetro de senha](#parameters-section-structure-example-2)
+ [Referenciar parâmetros](#parameters-section-structure-example-3)
+ [Parâmetro de lista delimitada por vírgulas](#parameters-section-structure-example-4)
+ [Retornar um valor de um parâmetro da lista delimitada por vírgula](#parameters-section-structure-example-5)

### Parâmetro String simples
<a name="parameters-section-structure-example-1"></a>

O exemplo a seguir declara um parâmetro chamado `InstanceTypeParameter` do tipo `String`. Esse parâmetro permite que você especifique o tipo de instância do Amazon EC2 para a pilha. Se nenhum valor for fornecido durante a criação ou atualização da pilha, o CloudFormation usará o valor padrão de `t2.micro`.

#### JSON
<a name="parameters-section-structure-example-1.json"></a>

```
"Parameters" : {
  "InstanceTypeParameter" : {
    "Description" : "Enter t2.micro, m1.small, or m1.large. Default is t2.micro.",
    "Type" : "String",
    "Default" : "t2.micro",
    "AllowedValues" : ["t2.micro", "m1.small", "m1.large"]
  }
}
```

#### YAML
<a name="parameters-section-structure-example-1.yaml"></a>

```
Parameters:
  InstanceTypeParameter:
    Description: Enter t2.micro, m1.small, or m1.large. Default is t2.micro.
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - m1.small
      - m1.large
```

### Parâmetro de senha
<a name="parameters-section-structure-example-2"></a>

O exemplo a seguir declara um parâmetro chamado `DBPwd` do tipo `String` sem valor padrão. A propriedade `NoEcho` é definida como `true` para evitar que o valor do parâmetro seja exibido nas descrições da pilha. O comprimento mínimo que pode ser especificado é `1`, e o valor máximo é `41`. O padrão permite caracteres alfabéticos maiúsculos e minúsculos e numerais. Esse exemplo também ilustra o uso de uma expressão regular para a propriedade `AllowedPattern`.

#### JSON
<a name="parameters-section-structure-example-2.json"></a>

```
"Parameters" : {
  "DBPwd" : {
    "NoEcho" : "true",
    "Description" : "The database admin account password",
    "Type" : "String",
    "MinLength" : "1",
    "MaxLength" : "41",
    "AllowedPattern" : "^[a-zA-Z0-9]*$"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-2.yaml"></a>

```
Parameters: 
  DBPwd: 
    NoEcho: true
    Description: The database admin account password
    Type: String
    MinLength: 1
    MaxLength: 41
    AllowedPattern: ^[a-zA-Z0-9]*$
```

### Referenciar parâmetros
<a name="parameters-section-structure-example-3"></a>

Você usa a função intrínseca `Ref` para fazer referência a um parâmetro, e o CloudFormation usa o valor do parâmetro para provisionar a pilha. Você pode fazer referência a parâmetros nas seções `Resources` e `Outputs` do mesmo modelo.

No exemplo a seguir, a propriedade `InstanceType` do recurso da instância do EC2 faz referência ao valor do parâmetro `InstanceTypeParameter`:

#### JSON
<a name="parameters-section-structure-example-3.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance",
  "Properties" : {
    "InstanceType" : { "Ref" : "InstanceTypeParameter" },
    "ImageId" : "ami-0ff8a91507f77f867"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-3.yaml"></a>

```
Ec2Instance:
  Type: AWS::EC2::Instance
  Properties:
    InstanceType:
      Ref: InstanceTypeParameter
    ImageId: ami-0ff8a91507f77f867
```

### Parâmetro de lista delimitada por vírgulas
<a name="parameters-section-structure-example-4"></a>

O tipo de parâmetro `CommaDelimitedList` pode ser útil quando você precisa fornecer vários valores para uma única propriedade. O exemplo a seguir declara um parâmetro chamado `DbSubnetIpBlocks` com um valor padrão de três blocos CIDR separados por vírgulas.

#### JSON
<a name="parameters-section-structure-example-4.json"></a>

```
"Parameters" : {
  "DbSubnetIpBlocks": {
    "Description": "Comma-delimited list of three CIDR blocks",
    "Type": "CommaDelimitedList",
    "Default": "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-4.yaml"></a>

```
Parameters: 
  DbSubnetIpBlocks: 
    Description: "Comma-delimited list of three CIDR blocks"
    Type: CommaDelimitedList
    Default: "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
```

### Retornar um valor de um parâmetro da lista delimitada por vírgula
<a name="parameters-section-structure-example-5"></a>

Para fazer referência a um valor específico em uma lista delimitada por vírgulas de um parâmetro, use a função intrínseca `Fn::Select` na seção `Resources` do modelo. Passe o valor do índice do objeto que você deseja e uma lista de objetos, conforme mostrado no exemplo a seguir.

#### JSON
<a name="parameters-section-structure-example-5.json"></a>

```
{
    "Parameters": {
        "VPC": {
            "Type": "String",
            "Default": "vpc-123456"
        },
        "VpcAzs": {
            "Type": "CommaDelimitedList",
            "Default": "us-west-2a, us-west-2b, us-west-2c"
        },
        "DbSubnetIpBlocks": {
            "Type": "CommaDelimitedList",
            "Default": "172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26"
        }
    },
    "Resources": {
        "DbSubnet1": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Select": [
                      0,
                      { 
                        "Ref": "VpcAzs" 
                      }
                   ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        0,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet2": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    1,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        1,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet3": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    2,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        2,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        }
    }
}
```

#### YAML
<a name="parameters-section-structure-example-5.yaml"></a>

```
Parameters:
  VPC:
    Type: String
    Default: vpc-123456
  VpcAzs:
    Type: CommaDelimitedList
    Default: us-west-2a, us-west-2b, us-west-2c
  DbSubnetIpBlocks:
    Type: CommaDelimitedList
    Default: 172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26
Resources:
  DbSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select
        - 0 
        - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 0
        - !Ref DbSubnetIpBlocks
  DbSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 1
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 1
        - !Ref DbSubnetIpBlocks
  DbSubnet3:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 2
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 2
        - !Ref DbSubnetIpBlocks
```

## Recursos relacionados
<a name="parameters-section-structure-related-resources"></a>

O CloudFormation também permite o uso de referências dinâmicas para especificar valores de propriedades dinamicamente. Por exemplo, talvez você precise fazer referência a strings seguras armazenadas no Systems Manager Parameter Store. Para obter mais informações, consulte [Obter valores armazenados em outros serviços usando referências dinâmicas](dynamic-references.md).

Você também pode usar pseudoparâmetros em uma `Ref` ou em uma função `Sub` para preencher valores dinamicamente. Para obter mais informações, consulte [Obter valores da AWS usando pseudoparâmetros](pseudo-parameter-reference.md). 

# Sintaxe de Outputs de modelo do CloudFormation
<a name="outputs-section-structure"></a>

A seção `Outputs` opcional declara os valores de saída para a pilha. Esses valores de saída podem ser usados de várias maneiras:
+ **Capture detalhes importantes sobre os recursos**: uma saída é uma forma conveniente de coletar informações importantes sobre os recursos. Por exemplo, você pode produzir o nome do bucket do S3 para uma pilha para tornar o bucket mais fácil de encontrar. Os valores de saída podem ser visualizados na guia **Saídas** do console do CloudFormation ou via comando [describe-stacks](service_code_examples.md#describe-stacks-sdk) da CLI. 
+ **Referências entre pilhas**: é possível importar valores de saída para outras pilhas para [criar referências entre pilhas](using-cfn-stack-exports.md). Isso é útil quando você precisa compartilhar recursos ou configurações em várias pilhas.

**Importante**  
O CloudFormation não edita nem ofusca nenhuma informação incluída na seção `Outputs`. É altamente recomendável não usar essa seção para gerar informações confidenciais, como senhas ou segredos.  
Os valores de saída estão disponíveis após a conclusão da operação da pilha. Os valores de saída da pilha não estão disponíveis quando um status de pilha está em qualquer um dos [status](view-stack-events.md#cfn-console-view-stack-data-resources-status-codes) `IN_PROGRESS`. Não recomendamos estabelecer dependências entre um runtime de serviço e o valor de saída da pilha porque os valores de saída podem não estar disponíveis em todos os momentos.

## Sintaxe
<a name="outputs-section-syntax"></a>

A seção `Outputs` consiste no nome da chave `Outputs`. Você pode declarar no máximo 200 saídas em um modelo.

O exemplo a seguir demonstra a estrutura da seção `Outputs`.

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

Use chaves para circunscrever todas as declarações de saída. Delimite várias saídas com vírgulas.

```
"Outputs" : {
  "OutputLogicalID" : {
    "Description" : "Information about the value",
    "Value" : "Value to return",
    "Export" : {
      "Name" : "Name of resource to export"
    }
  }
}
```

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

```
Outputs:
  OutputLogicalID:
    Description: Information about the value
    Value: Value to return
    Export:
      Name: Name of resource to export
```

### Campos de saída
<a name="outputs-section-structure-output-fields"></a>

A seção `Outputs` pode incluir os seguintes campos.

**ID lógico (também chamado de *nome lógico*)**  
Um identificador para a saída atual. O ID lógico deve ser alfanumérico (`a–z`, `A–Z`, `0–9`) e exclusivo no modelo.

**`Description` (opcional)**  
Um tipo `String` que descreve o valor da saída. O valor da declaração da descrição deve ser uma sequência literal com 0 a 1024 bytes de comprimento. Você não pode usar um parâmetro ou uma função para especificar a descrição. 

**`Value` (obrigatório)**  
O valor da propriedade retornado pelo comando [describe-stacks](service_code_examples.md#describe-stacks-sdk). O valor de uma saída pode incluir literais, referências a parâmetros, pseudoparâmetros, um valor de mapeamento ou funções intrínsecas.

**`Export` (opcional)**  
O nome da saída do recurso saída a ser exportado para uma referência de pilha cruzada.  
Você pode usar funções intrínsecas para personalizar o valor de `Name` de uma exportação.  
Para obter mais informações, consulte [Obter resultados exportados de uma pilha do CloudFormation implantada](using-cfn-stack-exports.md).

Para associar uma condição a uma saída, defina a condição na seção [Conditions](conditions-section-structure.md) do modelo.

## Exemplos
<a name="outputs-section-structure-examples"></a>

Os exemplos a seguir ilustram como funciona a saída da pilha.

**Topics**
+ [Saída da pilha](#outputs-section-structure-examples-stack-output)
+ [Personalizar o nome da exportação usando `Fn::Sub`](#outputs-section-structure-examples-cross-stack)
+ [Personalizar o nome da exportação usando `Fn::Join`](#outputs-section-structure-examples-join-export-name)
+ [Retornar um URL construído usando `Fn::Join`](#outputs-section-structure-examples-join-export-url)

### Saída da pilha
<a name="outputs-section-structure-examples-stack-output"></a>

No exemplo a seguir, a saída chamada `BackupLoadBalancerDNSName` retorna o nome DNS do recurso com o ID lógico `BackupLoadBalancer` apenas quando a condição `CreateProdResources` é verdadeira. A saída chamada `InstanceID` retorna o ID da instância do EC2 com o ID lógico `EC2Instance`.

#### JSON
<a name="outputs-section-structure-example.json"></a>

```
"Outputs" : {
  "BackupLoadBalancerDNSName" : {
    "Description": "The DNSName of the backup load balancer",  
    "Value" : { "Fn::GetAtt" : [ "BackupLoadBalancer", "DNSName" ]},
    "Condition" : "CreateProdResources"
  },
  "InstanceID" : {
    "Description": "The Instance ID",  
    "Value" : { "Ref" : "EC2Instance" }
  }
}
```

#### YAML
<a name="outputs-section-structure-example.yaml"></a>

```
Outputs:
  BackupLoadBalancerDNSName:
    Description: The DNSName of the backup load balancer
    Value: !GetAtt BackupLoadBalancer.DNSName
    Condition: CreateProdResources
  InstanceID:
    Description: The Instance ID
    Value: !Ref EC2Instance
```

### Personalizar o nome da exportação usando `Fn::Sub`
<a name="outputs-section-structure-examples-cross-stack"></a>

Nos exemplos a seguir, a saída chamada `StackVPC` retorna o ID de uma VPC e, em seguida, exporta o valor para a referência de pilha cruzada com o nome `VPCID` anexado ao nome da pilha.

#### JSON
<a name="outputs-section-structure-cross-stack-example.json"></a>

```
"Outputs" : {
  "StackVPC" : {
    "Description" : "The ID of the VPC",
    "Value" : { "Ref" : "MyVPC" },
    "Export" : {
      "Name" : {"Fn::Sub": "${AWS::StackName}-VPCID" }
    }
  }
}
```

#### YAML
<a name="outputs-section-structure-cross-stack-example.yaml"></a>

```
Outputs:
  StackVPC:
    Description: The ID of the VPC
    Value: !Ref MyVPC
    Export:
      Name: !Sub "${AWS::StackName}-VPCID"
```

Para obter mais informações sobre a função `Fn::Sub`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html).

### Personalizar o nome da exportação usando `Fn::Join`
<a name="outputs-section-structure-examples-join-export-name"></a>

Use a função `Fn::Join` para construir valores com base em parâmetros, atributos de recursos e outras strings.

Os exemplos apresentados a seguir usam a função `Fn::Join`, em vez da função `Fn::Sub`, para personalizar o nome da exportação. A função `Fn::Join` de exemplo concatena o nome da pilha com o nome `VPCID` usando dois pontos como um separador.

#### JSON
<a name="outputs-section-structure-join-export-name-example.json"></a>

```
"Outputs" : {
  "StackVPC" : {
    "Description" : "The ID of the VPC",
    "Value" : { "Ref" : "MyVPC" },
    "Export" : {
      "Name" : { "Fn::Join" : [ ":", [ { "Ref" : "AWS::StackName" }, "VPCID" ] ] }
    }
  }
}
```

#### YAML
<a name="outputs-section-structure-join-export-name-example.yaml"></a>

```
Outputs:
  StackVPC:
    Description: The ID of the VPC
    Value: !Ref MyVPC
    Export:
      Name: !Join [ ":", [ !Ref "AWS::StackName", VPCID ] ]
```

Para obter mais informações sobre a função `Fn::Join`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html).

### Retornar um URL construído usando `Fn::Join`
<a name="outputs-section-structure-examples-join-export-url"></a>

No exemplo a seguir de um modelo que cria um site do WordPress, `InstallURL` é a string retornada por uma chamada da função `Fn::Join` que concatena `http://`, o nome DNS do recurso `ElasticLoadBalancer` e `/wp-admin/install.php`. O valor de saída seria semelhante ao seguinte:

```
http://mywptests-elasticl-1gb51l6sl8y5v-206169572.aws-region.elb.amazonaws.com/wp-admin/install.php
```

#### JSON
<a name="outputs-section-structure-examples-join-export-url.json"></a>

```
{
    "Outputs": {
        "InstallURL": {
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "http://",
                        {
                            "Fn::GetAtt": [
                                "ElasticLoadBalancer",
                                "DNSName"
                            ]
                        },
                        "/wp-admin/install.php"
                    ]
                ]
            },
            "Description": "Installation URL of the WordPress website"
        }
    }
}
```

#### YAML
<a name="outputs-section-structure-examples-join-export-url.yaml"></a>

```
Outputs:
  InstallURL:
    Value: !Join 
      - ''
      - - 'http://'
        - !GetAtt 
          - ElasticLoadBalancer
          - DNSName
        - /wp-admin/install.php
    Description: Installation URL of the WordPress website
```

Para obter mais informações sobre a função `Fn::Join`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html).

# Sintaxe de Mappings de modelo do CloudFormation
<a name="mappings-section-structure"></a>

A seção opcional `Mappings` ajuda a criar pares de chave-valor que podem ser usados para especificar valores com base em determinadas condições ou dependências. 

Um caso de uso comum para a seção `Mappings` é definir valores com base na Região da AWS em que a pilha é implantada. Isso pode ser feito por meio do pseudoparâmetro `AWS::Region`. O pseudoparâmetro `AWS::Region` é um valor que o CloudFormation resolve para a região em que a pilha é criada. Os pseudoparâmetros são resolvidos pelo CloudFormation quando você cria a pilha. 

Para recuperar valores em um mapa, você pode usar a função intrínseca `Fn::FindInMap` na seção `Resources` do seu modelo. 

## Sintaxe
<a name="mappings-section-structure-syntax"></a>

A seção `Mappings` usa a seguinte sintaxe:

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

```
"Mappings" : {
  "MappingLogicalName" : {
    "Key1" : {
      "Name" : "Value1"
    },
    "Key2" : {
      "Name" : "Value2"
    },
    "Key3" : {
      "Name" : "Value3"
    }
  }
}
```

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

```
Mappings: 
  MappingLogicalName: 
    Key1: 
      Name: Value1
    Key2: 
      Name: Value2
    Key3: 
      Name: Value3
```
+ `MappingLogicalName` é o nome lógico do mapeamento.
+ Dentro de um mapeamento, cada mapa é uma chave seguida por outro mapeamento.
+ A chave deve ser um mapa de pares nome/valor e exclusiva dentro do mapeamento.
+ O par de nome/valor é um rótulo e o valor para mapear. Nomeando os valores, você pode mapear mais de um conjunto de valores para uma chave.
+ As chaves em mapeamentos devem ser sequências literais.
+ Os valores podem ser do tipo `String` ou `List`.

**nota**  
Você não pode incluir parâmetros, pseudoparâmetros ou funções intrínsecas na seção `Mappings`.   
Se os valores em um mapeamento não estiverem sendo usados atualmente pela pilha, você não poderá atualizar apenas o mapeamento. Você precisa incluir alterações que adicionam, modificam ou excluem recursos.

## Exemplos
<a name="mappings-section-structure-examples"></a>

**Topics**
+ [Mapeamento básico](#mappings-section-structure-basic-example)
+ [Mapeamento com vários valores](#mappings-section-structure-multiple-values-example)
+ [Retornar um valor de um mapeamento](#mappings-section-structure-return-value-example)
+ [Parâmetro de entrada e `Fn::FindInMap`](#mappings-section-structure-input-parameter-example)

### Mapeamento básico
<a name="mappings-section-structure-basic-example"></a>

O exemplo a seguir mostra uma seção `Mappings` com um mapa `RegionToInstanceType` que contém cinco chaves que são mapeadas para pares de nome e valor que contêm valores de sequência únicos. As chaves são nomes de regiões. Cada par de nome-valor é um tipo de instância da família T que está disponível na região representada pela chave. Os pares de nome-valor têm um nome (`InstanceType` no exemplo) e um valor. 

#### JSON
<a name="mappings-section-structure-basic-example.json"></a>

```
"Mappings" : {
  "RegionToInstanceType" : {
    "us-east-1"      : { "InstanceType" : "t2.micro" },
    "us-west-1"      : { "InstanceType" : "t2.micro" },
    "eu-west-1"      : { "InstanceType" : "t2.micro" },
    "eu-north-1"     : { "InstanceType" : "t3.micro" },
    "me-south-1"     : { "InstanceType" : "t3.micro" }
  }
}
```

#### YAML
<a name="mappings-section-structure-basic-example.yaml"></a>

```
Mappings:
  RegionToInstanceType:
    us-east-1:
      InstanceType: t2.micro
    us-west-1:
      InstanceType: t2.micro
    eu-west-1:
      InstanceType: t2.micro
    eu-north-1:
      InstanceType: t3.micro
    me-south-1:
      InstanceType: t3.micro
```

### Mapeamento com vários valores
<a name="mappings-section-structure-multiple-values-example"></a>

O exemplo a seguir tem chaves de regiões que são mapeadas para dois conjuntos de valores: uma chamada `MyAMI1` e a outra `MyAMI2`.

**nota**  
Os IDs de AMI mostrados nesses exemplos são espaços reservados para fins de demonstração. Sempre que possível, considere usar referências dinâmicas aos parâmetros AWS Systems Manager como alternativa à seção `Mappings`. Para evitar atualizar todos os modelos com um novo ID sempre que a AMI que você deseja usar for alterada, use um parâmetro AWS Systems Manager para recuperar o ID da AMI mais recente quando a pilha for criada ou atualizada. As versões mais recentes de AMIs comumente usadas também estão disponíveis como parâmetros públicos no Systems Manager. Para obter mais informações, consulte [Obter valores armazenados em outros serviços usando referências dinâmicas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html). 

#### JSON
<a name="mappings-section-structure-multiple-values-example"></a>

```
"Mappings" : {
  "RegionToAMI" : {
    "us-east-1"        : { "MyAMI1" : "ami-12345678901234567", "MyAMI2" : "ami-23456789012345678" },
    "us-west-1"        : { "MyAMI1" : "ami-34567890123456789", "MyAMI2" : "ami-45678901234567890" },
    "eu-west-1"        : { "MyAMI1" : "ami-56789012345678901", "MyAMI2" : "ami-67890123456789012" },
    "ap-southeast-1"   : { "MyAMI1" : "ami-78901234567890123", "MyAMI2" : "ami-89012345678901234" },
    "ap-northeast-1"   : { "MyAMI1" : "ami-90123456789012345", "MyAMI2" : "ami-01234567890123456" }
  }
}
```

#### YAML
<a name="mappings-section-structure-multiple-values-example.yaml"></a>

```
Mappings:
  RegionToAMI:
    us-east-1:
      MyAMI1: ami-12345678901234567
      MyAMI2: ami-23456789012345678
    us-west-1:
      MyAMI1: ami-34567890123456789
      MyAMI2: ami-45678901234567890
    eu-west-1:
      MyAMI1: ami-56789012345678901
      MyAMI2: ami-67890123456789012
    ap-southeast-1:
      MyAMI1: ami-78901234567890123
      MyAMI2: ami-89012345678901234
    ap-northeast-1:
      MyAMI1: ami-90123456789012345
      MyAMI2: ami-01234567890123456
```

### Retornar um valor de um mapeamento
<a name="mappings-section-structure-return-value-example"></a>

Você pode usar a função `Fn::FindInMap` para retornar um valor nomeado com base em uma chave especificada. O modelo de exemplo a seguir contém um recurso do Amazon EC2 cuja propriedade `InstanceType` é atribuída pela função `FindInMap`. A função `FindInMap` especifica a chave como Região da AWS onde a pilha é criada (usando o pseudoparâmetro `AWS::Region`) e `InstanceType` como o nome do valor para o qual mapear. O `ImageId` usa um parâmetro do Systems Manager para recuperar dinamicamente a AMI mais recente do Amazon Linux 2. Para obter mais informações sobre pseudoparâmetros, consulte [Obter valores da AWS usando pseudoparâmetros](pseudo-parameter-reference.md).

#### JSON
<a name="mappings-section-structure-return-value-example.json"></a>

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Mappings" : {
    "RegionToInstanceType" : {
      "us-east-1"      : { "InstanceType" : "t2.micro" },
      "us-west-1"      : { "InstanceType" : "t2.micro" },
      "eu-west-1"      : { "InstanceType" : "t2.micro" },
      "eu-north-1"     : { "InstanceType" : "t3.micro" },
      "me-south-1"     : { "InstanceType" : "t3.micro" }
    }
  },
  "Resources" : {
    "myEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "InstanceType" : { "Fn::FindInMap" : [ "RegionToInstanceType", { "Ref" : "AWS::Region" }, "InstanceType" ]}
      }
    }
  }
}
```

#### YAML
<a name="mappings-section-structure-return-value-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Mappings: 
  RegionToInstanceType: 
    us-east-1:
      InstanceType: t2.micro
    us-west-1:
      InstanceType: t2.micro
    eu-west-1:
      InstanceType: t2.micro
    eu-north-1:
      InstanceType: t3.micro
    me-south-1:
      InstanceType: t3.micro
Resources: 
  myEC2Instance: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      InstanceType: !FindInMap [RegionToInstanceType, !Ref 'AWS::Region', InstanceType]
```

### Parâmetro de entrada e `Fn::FindInMap`
<a name="mappings-section-structure-input-parameter-example"></a>

O seguinte exemplo mostra como criar uma instância do EC2 usando vários mapeamentos. O modelo usa mapeamentos aninhados para selecionar automaticamente o tipo de instância e o grupo de segurança apropriados com base no destino Região da AWS e no tipo de ambiente (`Dev` ou `Prod`). Ele também usa um parâmetro do Systems Manager para recuperar dinamicamente a AMI mais recente do Amazon Linux 2.

#### JSON
<a name="mappings-section-structure-input-parameter-example.json"></a>

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Parameters" : {
    "EnvironmentType" : {
      "Description" : "The environment type (Dev or Prod)",
      "Type" : "String",
      "Default" : "Dev",
      "AllowedValues" : [ "Dev", "Prod" ]
    }
  },
  "Mappings" : {
    "RegionAndEnvironmentToInstanceType" : {
      "us-east-1"        : { "Dev" : "t3.micro", "Prod" : "c5.large" },
      "us-west-1"        : { "Dev" : "t2.micro", "Prod" : "m5.large" }
    },
    "RegionAndEnvironmentToSecurityGroup" : {
      "us-east-1"        : { "Dev" : "sg-12345678", "Prod" : "sg-abcdef01" },
      "us-west-1"        : { "Dev" : "sg-ghijkl23", "Prod" : "sg-45678abc" }
    }
  },
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "InstanceType" : { "Fn::FindInMap": [ "RegionAndEnvironmentToInstanceType", { "Ref": "AWS::Region" }, { "Ref": "EnvironmentType" } ]},
        "SecurityGroupIds" : [{ "Fn::FindInMap" : [ "RegionAndEnvironmentToSecurityGroup", { "Ref" : "AWS::Region" }, { "Ref" : "EnvironmentType" } ]}]
      }
    }
  }
}
```

#### YAML
<a name="mappings-section-structure-input-parameter-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvironmentType: 
    Description: The environment type (Dev or Prod)
    Type: String
    Default: Dev
    AllowedValues: 
      - Dev
      - Prod
Mappings:
  RegionAndEnvironmentToInstanceType:
    us-east-1: 
      Dev: t3.micro
      Prod: c5.large
    us-west-1: 
      Dev: t2.micro
      Prod: m5.large
  RegionAndEnvironmentToSecurityGroup: 
    us-east-1: 
      Dev: sg-12345678
      Prod: sg-abcdef01
    us-west-1: 
      Dev: sg-ghijkl23
      Prod: sg-45678abc
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      InstanceType: !FindInMap [RegionAndEnvironmentToInstanceType, !Ref 'AWS::Region', !Ref EnvironmentType]
      SecurityGroupIds:
        - !FindInMap [RegionAndEnvironmentToSecurityGroup, !Ref 'AWS::Region', !Ref EnvironmentType]
```

## Recursos relacionados
<a name="mappings-section-related-resources"></a>

Esses tópicos relacionados podem ser úteis à medida que você desenvolve modelos que usam a função `Fn::FindInMap`.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap.html)
+ [Fn::FindInMap Melhorias do](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap-enhancements.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html)

# Sintaxe de Metadata de modelo do CloudFormation
<a name="metadata-section-structure"></a>

`Metadata` armazena informações adicionais usando objetos JSON ou YAML. Os tipos de metadados em nível de modelo que você pode usar em seu modelo incluem:

Metadados personalizados  
Armazena pares de chave-valor definidos pelo usuário. Por exemplo, você pode fornecer informações adicionais que não afetam a criação de recursos, mas oferecem contexto adicional sobre as especificidades da infraestrutura, da equipe ou da implantação.

`AWS::CloudFormation::Interface`  
Define o agrupamento e a classificação de parâmetros de entrada quando eles são exibidos no console do CloudFormation. Por padrão, o console do CloudFormation classifica alfabeticamente os parâmetros por ID lógico. 

`AWS::CloudFormation::Designer`  
O CloudFormation Designer (Designer) atingiu o fim da vida útil em 5 de fevereiro de 2025.



**Importante**  
Durante a atualização de uma pilha, você não pode atualizar a seção `Metadata` por si só. Você pode atualizá-la apenas ao incluir alterações que adicionam, modificam ou excluem recursos.  
O CloudFormation não transforma, modifica nem edita nenhuma informação incluída na seção `Metadata`. Por isso, é altamente recomendável não usar essa seção para armazenar informações confidenciais, como senhas ou segredos.

## Sintaxe
<a name="metadata-section-structure-syntax"></a>

Para declarar metadados personalizados no modelo do CloudFormation, use a seguinte sintaxe:

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

```
"Metadata" : {
  "Instances" : {"Description" : "Information about the instances"},
  "Databases" : {"Description" : "Information about the databases"}
}
```

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

```
Metadata:
  Instances:
    Description: "Information about the instances"
  Databases: 
    Description: "Information about the databases"
```

Para obter a sintaxe do `AWS::CloudFormation::Interface`, consulte [Organizar parâmetros do CloudFormation com metadados `AWS::CloudFormation::Interface`](aws-cloudformation-interface.md).

# Organizar parâmetros do CloudFormation com metadados `AWS::CloudFormation::Interface`
<a name="aws-cloudformation-interface"></a>

`AWS::CloudFormation::Interface` é uma chave de metadados que define como os parâmetros são agrupados e classificados no console do CloudFormation. Por padrão, o console lista os parâmetros de entrada em ordem alfabética pelos IDs lógicos quando você cria ou atualiza pilhas no console. Usando essa chave, você pode definir seu próprio agrupamento e classificação de parâmetros de forma que os usuários possam especificar valores de parâmetros de forma eficiente. Por exemplo, você pode agrupar todos os parâmetros relacionados ao EC2 em um grupo e todos os parâmetros relacionados à VPC em outro grupo.

Na chave de metadados, você pode especificar os grupos a serem criados, os parâmetros a serem incluídos em cada grupo e a ordem na qual o console mostra cada parâmetro em seu grupo. 

Você também pode definir rótulos para parâmetros. Um rótulo é um nome amigável ou uma descrição que o console exibe em vez de um ID lógico do parâmetro. Os rótulos são úteis para ajudar os usuários a compreenderem os valores a serem especificados para cada parâmetro. Por exemplo, você pode rotular um parâmetro `KeyPair` `Select an EC2 key pair`.

Todos os parâmetros aos quais você faz referência na chave de metadados devem ser declarados na seção `Parameters` do modelo.

**nota**  
Somente o console do CloudFormation usa a chave de metadados `AWS::CloudFormation::Interface`. A AWS CLI e as chamadas da API não usam essa chave.

## Sintaxe
<a name="aws-resource-cloudformation-interface-syntax"></a>

Para declarar essa entidade no modelo do CloudFormation, use a seguinte sintaxe:

### JSON
<a name="aws-resource-cloudformation-interface-syntax.json"></a>

```
"Metadata" : {
  "AWS::CloudFormation::Interface" : {
    "ParameterGroups": [
      {
        "Label": {
          "default": "Group Label"
        },
        "Parameters": [
          "Parameter1",
          "Parameter2"
        ]
      }
    ],
    "ParameterLabels": {
      "Parameter1": {
        "default": "Friendly Name for Parameter1"
      }
    }
  }
}
```

### YAML
<a name="aws-resource-cloudformation-interface-syntax.yaml"></a>

```
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Group Label
        Parameters:
          - Parameter1
          - Parameter2
    ParameterLabels:
      Parameter1:
        default: Friendly Name for Parameter1
```

## Propriedades
<a name="w2aac11c23c29c17c17"></a>

`ParameterGroups`  
Uma lista de tipos de parameter group, em que você especifica nomes de grupo, os parâmetros em cada grupo e a ordem na qual os parâmetros são mostrados.  
*Obrigatório*: não    
`Label`  
Um nome do grupo de parâmetros.  
*Obrigatório*: não  
`default`  
O rótulo padrão usado pelo console do CloudFormation para nomear um grupo de parâmetros.  
*Obrigatório*: não  
*Tipo:* string  
`Parameters`  
Uma lista de IDs lógicas de parâmetro que diferenciam maiúsculas de minúsculas a serem incluídas no grupo. Os parâmetros já devem ser definidos na seção `Parameters` do modelo. Um parâmetro pode ser incluído apenas em um grupo de parâmetros.  
O console lista os parâmetros que você não associa a um grupo de parâmetros em ordem alfabética no grupo `Other parameters`.  
*Obrigatório*: não  
*Tipo*: lista de valores de strings

`ParameterLabels`  
Um mapeamento de parâmetros e os nomes amigáveis deles que o console do CloudFormation mostra quando uma pilha é criada ou atualizada.  
*Obrigatório*: não    
Rótulo do parâmetro  
Um rótulo de um parâmetro. O rótulo define um nome ou uma descrição amigável que o console do CloudFormation mostra na página **Especificar parâmetros** quando uma pilha é criada ou atualizada. O rótulo do parâmetro deve ser o ID lógico que diferencia maiúsculas de minúsculas de um parâmetro válido que foi declarado na seção `Parameters` do modelo.  
*Obrigatório*: não  
`default`  
O rótulo padrão usado pelo console do CloudFormation para nomear um parâmetro.  
*Obrigatório*: não  
*Tipo:* string

## Exemplo
<a name="w2aac11c23c29c17c19"></a>

O exemplo a seguir define dois parameter groups: `Network Configuration` e `Amazon EC2 Configuration`. O grupo `Network Configuration` inclui os parâmetros `VPCID`, `SubnetId`e `SecurityGroupID`, que são definidos na seção `Parameters` do modelo (não mostrado). A ordem na qual o console mostra esses parâmetros é definida pela ordem na qual os parâmetros são listados, começando com o parâmetro `VPCID`. O exemplo agrupa e classifica os parâmetros `Amazon EC2 Configuration` de forma semelhante.

O exemplo também define um rótulo para o parâmetro `VPCID`. O console mostrará a mensagem **Which VPC should this be deployed to?** (Em qual VPC isso deve ser implantado?) em vez de mostrar o ID lógico do parâmetro (`VPCID`).

### JSON
<a name="aws-cloudformation-interface-example.json"></a>

```
"Metadata" : {
  "AWS::CloudFormation::Interface" : {
    "ParameterGroups" : [
      {
        "Label" : { "default" : "Network Configuration" },
        "Parameters" : [ "VPCID", "SubnetId", "SecurityGroupID" ]
      },
      {
        "Label" : { "default":"Amazon EC2 Configuration" },
        "Parameters" : [ "InstanceType", "KeyName" ]
      }
    ],
    "ParameterLabels" : {
      "VPCID" : { "default" : "Which VPC should this be deployed to?" }
    }
  }
}
```

### YAML
<a name="aws-cloudformation-interface-example.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface: 
    ParameterGroups: 
      - Label: 
          default: "Network Configuration"
        Parameters: 
          - VPCID
          - SubnetId
          - SecurityGroupID
      - Label: 
          default: "Amazon EC2 Configuration"
        Parameters: 
          - InstanceType
          - KeyName
    ParameterLabels: 
      VPCID: 
        default: "Which VPC should this be deployed to?"
```

### Grupos de parâmetros no console
<a name="w2aac11c23c29c17c19c11"></a>

Usando a chave de metadados deste exemplo, a figura a seguir mostra como o console exibe os grupos de parâmetros quando uma pilha é criada ou atualizada: **Grupos de parâmetros no console** 

![\[Console mostrando os parameter groups deste exemplo.\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/console-create-stack-parameter-groups.png)


# Sintaxe de Rules de modelo do CloudFormation
<a name="rules-section-structure"></a>

A seção `Rules` é uma parte opcional de um modelo do CloudFormation que permite uma lógica de validação personalizada. Quando incluída, esta seção contém funções de regras que validam os valores dos parâmetros antes que o CloudFormation crie ou atualize quaisquer recursos.

As regras são úteis quando as restrições de parâmetros padrão são insuficientes. Por exemplo, quando o SSL estiver habilitado, um certificado e um nome de domínio deverão ser fornecidos. Uma regra pode garantir que essas dependências sejam atendidas.

## Sintaxe
<a name="template-constraint-rules-syntax"></a>

A seção `Rules` usa a seguinte sintaxe:

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

A seção `Rules` de um modelo consiste no nome da chave `Rules`, seguido por dois-pontos. Você deve usar chaves para delimitar todas as declarações de regras. Se você declarar várias regras, elas serão separadas por vírgulas. Para cada regra, você declara um nome lógico entre aspas seguido por uma vírgula e chaves que incluem a condição da regra e as declarações.

```
{
    "Rules": {
        "LogicalRuleName1": {
            "RuleCondition": {
                "rule-specific intrinsic function": "Value"
            },
            "Assertions": [
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                },
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                }
            ]
        },
        "LogicalRuleName2": {
            "Assertions": [
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                }
            ]
        }
    }
}
```

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

```
Rules:
  LogicalRuleName1:
    RuleCondition:
      rule-specific intrinsic function: Value
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
  LogicalRuleName2:
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
```

### Campos de regras
<a name="rules-section-fields"></a>

A seção `Rules` pode incluir os seguintes campos.

**ID lógico (também chamado de *nome lógico*)**  
Um identificador exclusivo para cada regra.

**`RuleCondition` (opcional)**  
Uma propriedade que determina quando uma regra entra em vigor. Se você não definir uma condição de regra, as declarações da regra sempre entram em vigor. Para cada regra, você pode definir apenas uma condição de regra. 

**`Assertions` (obrigatório)**  
Uma ou mais declarações que especificam os valores aceitáveis para um determinado parâmetro.

**`Assert`**  
Uma condição que deve ser avaliada como `true`.

**`AssertDescription`**  
Uma mensagem exibida quando uma asserção falha.

## Funções intrínsecas específicas de regras
<a name="rules-specific-intrinsic-section-structure"></a>

Para definir suas regras, é necessário usar *funções específicas à regra*, que são funções que podem ser usadas apenas na seção `Rules` de um modelo. Embora essas funções possam ser aninhadas, o resultado final de uma condição de regra ou asserção deve ser `true` ou `false`.

As seguintes funções de regras estão disponíveis:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-contains](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-contains)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberequals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberequals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberin)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-refall](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-refall)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueof](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueof)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueofall](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueofall)

Essas funções são usadas na condição ou nas asserções de uma regra. A propriedade da condição determina se o CloudFormation se aplica a asserções. Se a condição for avaliada como `true`, o CloudFormation avaliará as asserções para verificar se um valor de parâmetro é válido quando um produto provisionado for criado ou atualizado. Se o valor de um parâmetro for inválido, o CloudFormation não criará nem atualizará a pilha. Se a condição for avaliada como `false`, o CloudFormation não verificará o valor do parâmetro e prosseguirá com a operação de pilha.

## Exemplos
<a name="template-constraint-rules-example"></a>

**Topics**
+ [Verificar condicionalmente um valor de parâmetro](#template-constraint-rules-example-verify)
+ [Validação de parâmetros cruzados](#template-cross-parameter-rules-example)

### Verificar condicionalmente um valor de parâmetro
<a name="template-constraint-rules-example-verify"></a>

No exemplo a seguir, as duas regras verificam o valor do parâmetro `InstanceType`. Dependendo do valor do parâmetro de ambiente (`test` ou `prod`), o usuário deve especificar `t3.medium` ou `t3.large` para o parâmetro `InstanceType`. Os parâmetros `InstanceType` e `Environment` já devem estar declarados na seção `Parameters` do mesmo modelo.

#### JSON
<a name="rules-section-example-conditionally-verify.json"></a>

```
{
  "Rules": {
    "testInstanceType": {
      "RuleCondition": {
        "Fn::Equals": [
          {"Ref": "Environment"},
          "test"
        ]
      },
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              ["t3.medium"],
              {"Ref": "InstanceType"}
            ]
          },
          "AssertDescription": "For a test environment, the instance type must be t3.medium"
        }
      ]
    },
    "prodInstanceType": {
      "RuleCondition": {
        "Fn::Equals": [
          {"Ref": "Environment"},
          "prod"
        ]
      },
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              ["t3.large"],
              {"Ref": "InstanceType"}
            ]
          },
          "AssertDescription": "For a production environment, the instance type must be t3.large"
        }
      ]
    }
  }
}
```

#### YAML
<a name="rules-section-example-conditionally-verify.yaml"></a>

```
Rules:
  testInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - test
    Assertions:
      - Assert:
          'Fn::Contains':
            - - t3.medium
            - !Ref InstanceType
        AssertDescription: 'For a test environment, the instance type must be t3.medium'
  prodInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - prod
    Assertions:
      - Assert:
          'Fn::Contains':
            - - t3.large
            - !Ref InstanceType
        AssertDescription: 'For a production environment, the instance type must be t3.large'
```

### Validação de parâmetros cruzados
<a name="template-cross-parameter-rules-example"></a>

Os modelos de exemplo a seguir demonstram o uso de regras para validações entre parâmetros. Eles criam um site de exemplo executado em um grupo do Auto Scaling atrás de um balanceador de carga. O site está disponível na porta 80 ou 443, dependendo dos parâmetros de entrada. As instâncias no grupo do Auto Scaling podem ser configuradas para escutar em qualquer porta (com 8888 como padrão).

As regras neste modelo validam os parâmetros de entrada antes da criação da pilha. Elas verificam se todas as sub-redes pertencem à VPC especificada e garantem que, quando o parâmetro `UseSSL` for definido como `Yes`, um ARN de certificado SSL e um nome de zona hospedada sejam fornecidos.

**nota**  
Você será cobrado pelos recursos da AWS usados se criar uma pilha com base nesse modelo.

#### JSON
<a name="rules-section-example-cross-parameter-validation.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "VpcId": {
      "Type": "AWS::EC2::VPC::Id",
      "Description": "VpcId of your existing Virtual Private Cloud (VPC)",
      "ConstraintDescription": "must be the VPC Id of an existing Virtual Private Cloud."
    },
    "Subnets": {
      "Type": "List<AWS::EC2::Subnet::Id>",
      "Description": "The list of SubnetIds in your Virtual Private Cloud (VPC)",
      "ConstraintDescription": "must be a list of at least two existing subnets associated with at least two different availability zones."
    },
    "InstanceType": {
      "Description": "WebServer EC2 instance type",
      "Type": "String",
      "Default": "t2.micro",
      "AllowedValues": ["t2.micro", "t3.micro"],
      "ConstraintDescription": "must be a valid EC2 instance type."
    },
    "KeyName": {
      "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
      "Type": "AWS::EC2::KeyPair::KeyName",
      "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
    },
    "SSHLocation": {
      "Description": "The IP address range that can be used to SSH to the EC2 instances",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "0.0.0.0/0",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "UseSSL": {
      "AllowedValues": ["Yes", "No"],
      "Default": "No",
      "Description": "Select \"Yes\" to implement SSL, \"No\" to skip (default).",
      "Type": "String"
    },
    "ALBSSLCertificateARN": {
      "Default": "",
      "Description": "[Optional] The ARN of the SSL certificate to be used for the Application Load Balancer",
      "Type": "String"
    },
    "HostedZoneName": {
      "AllowedPattern": "^$|(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$",
      "Default": "",
      "Description": "[Optional] The domain name of a valid Hosted Zone on AWS.",
      "Type": "String"
    }
  },
  "Conditions": {
    "UseALBSSL": {"Fn::Equals": [{"Ref": "UseSSL"}, "Yes"]}
  },
  "Rules": {
    "SubnetsInVPC": {
      "Assertions": [
        {
          "Assert": {"Fn::EachMemberEquals": [{"Fn::ValueOf": ["Subnets", "VpcId"]}, {"Ref": "VpcId"}]},
          "AssertDescription": "All subnets must be in the VPC"
        }
      ]
    },
    "ValidateHostedZone": {
      "RuleCondition": {"Fn::Equals": [{"Ref": "UseSSL"}, "Yes"]},
      "Assertions": [
        {
          "Assert": {"Fn::Not": [{"Fn::Equals": [{"Ref": "ALBSSLCertificateARN"}, ""]}]},
          "AssertDescription": "ACM Certificate value cannot be empty if SSL is required"
        },
        {
          "Assert": {"Fn::Not": [{"Fn::Equals": [{"Ref": "HostedZoneName"}, ""]}]},
          "AssertDescription": "Route53 Hosted Zone Name is mandatory when SSL is required"
        }
      ]
    }
  },
  "Resources": {
    "WebServerGroup": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "Properties": {
        "VPCZoneIdentifier": {"Ref": "Subnets"},
        "LaunchTemplate": {
          "LaunchTemplateId": {"Ref": "LaunchTemplate"},
          "Version": {"Fn::GetAtt": ["LaunchTemplate","LatestVersionNumber"]}
        },
        "MinSize": "2",
        "MaxSize": "2",
        "TargetGroupARNs": [{"Ref": "ALBTargetGroup"}]
      },
      "CreationPolicy": {
        "ResourceSignal": {"Timeout": "PT15M"}
      },
      "UpdatePolicy": {
        "AutoScalingRollingUpdate": {
          "MinInstancesInService": "1",
          "MaxBatchSize": "1",
          "PauseTime": "PT15M",
          "WaitOnResourceSignals": true
        }
      }
    },
    "LaunchTemplate": {
      "Type": "AWS::EC2::LaunchTemplate",
      "Metadata": {
        "Comment": "Install a simple application",
        "AWS::CloudFormation::Init": {
          "config": {
            "packages": {"yum": {"httpd": []}},
            "files": {
              "/var/www/html/index.html": {
                "content": {"Fn::Join": ["\n", ["<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>"]]},
                "mode": "000644",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/cfn-hup.conf": {
                "content": {"Fn::Join": ["", [
                  "[main]\n",
                  "stack=", {"Ref": "AWS::StackId"}, "\n",
                  "region=", {"Ref": "AWS::Region"}, "\n"
                ]]},
                "mode": "000400",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                "content": {"Fn::Join": ["", [
                  "[cfn-auto-reloader-hook]\n",
                  "triggers=post.update\n",
                  "path=Resources.LaunchTemplate.Metadata.AWS::CloudFormation::Init\n",
                  "action=/opt/aws/bin/cfn-init -v ",
                  "         --stack ", {"Ref": "AWS::StackName"},
                  "         --resource LaunchTemplate ",
                  "         --region ", {"Ref": "AWS::Region"}, "\n",
                  "runas=root\n"
                ]]},
                "mode": "000400",
                "owner": "root",
                "group": "root"
              }
            },
            "services": {
              "sysvinit": {
                "httpd": {
                  "enabled": "true",
                  "ensureRunning": "true"
                },
                "cfn-hup": {
                  "enabled": "true",
                  "ensureRunning": "true",
                  "files": [
                    "/etc/cfn/cfn-hup.conf",
                    "/etc/cfn/hooks.d/cfn-auto-reloader.conf"
                  ]
                }
              }
            }
          }
        }
      },
      "Properties": {
        "LaunchTemplateName": {"Fn::Sub": "${AWS::StackName}-launch-template"},
        "LaunchTemplateData": {
          "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
          "SecurityGroupIds": [{"Ref": "InstanceSecurityGroup"}],
          "InstanceType": {"Ref": "InstanceType"},
          "KeyName": {"Ref": "KeyName"},
          "UserData": {
            "Fn::Base64": {"Fn::Join": ["", [
              "#!/bin/bash\n",
              "yum install -y aws-cfn-bootstrap\n",
              "/opt/aws/bin/cfn-init -v ",
              "         --stack ", {"Ref": "AWS::StackName"},
              "         --resource LaunchTemplate ",
              "         --region ", {"Ref": "AWS::Region"}, "\n",
              "/opt/aws/bin/cfn-signal -e $? ",
              "         --stack ", {"Ref": "AWS::StackName"},
              "         --resource WebServerGroup ",
              "         --region ", {"Ref": "AWS::Region"}, "\n"
            ]]}
          }
        }
      }
    },
    "ELBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Allow access to the ELB",
        "VpcId": {"Ref": "VpcId"},
        "SecurityGroupIngress": [{
          "Fn::If": [
            "UseALBSSL",
            {
              "IpProtocol": "tcp",
              "FromPort": 443,
              "ToPort": 443,
              "CidrIp": "0.0.0.0/0"
            },
            {
              "IpProtocol": "tcp",
              "FromPort": 80,
              "ToPort": 80,
              "CidrIp": "0.0.0.0/0"
            }
          ]
        }]
      }
    },
    "ApplicationLoadBalancer": {
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties": {
        "Subnets": {"Ref": "Subnets"},
        "SecurityGroups": [{"Ref": "ELBSecurityGroup"}]
      }
    },
    "ALBListener": {
      "Type": "AWS::ElasticLoadBalancingV2::Listener",
      "Properties": {
        "DefaultActions": [{
          "Type": "forward",
          "TargetGroupArn": {"Ref": "ALBTargetGroup"}
        }],
        "LoadBalancerArn": {"Ref": "ApplicationLoadBalancer"},
        "Port": {"Fn::If": ["UseALBSSL", 443, 80]},
        "Protocol": {"Fn::If": ["UseALBSSL", "HTTPS", "HTTP"]},
        "Certificates": [{
          "Fn::If": [
            "UseALBSSL",
            {"CertificateArn": {"Ref": "ALBSSLCertificateARN"}},
            {"Ref": "AWS::NoValue"}
          ]
        }]
      }
    },
    "ALBTargetGroup": {
      "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties": {
        "HealthCheckIntervalSeconds": 30,
        "HealthCheckTimeoutSeconds": 5,
        "HealthyThresholdCount": 3,
        "Port": 80,
        "Protocol": "HTTP",
        "UnhealthyThresholdCount": 5,
        "VpcId": {"Ref": "VpcId"}
      }
    },
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Enable SSH access and HTTP access on the inbound port",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "SourceSecurityGroupId": {"Fn::Select": [0, {"Fn::GetAtt": ["ApplicationLoadBalancer", "SecurityGroups"]}]}
          },
          {
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "CidrIp": {"Ref": "SSHLocation"}
          }
        ],
        "VpcId": {"Ref": "VpcId"}
      }
    },
    "RecordSet": {
      "Type": "AWS::Route53::RecordSetGroup",
      "Condition": "UseALBSSL",
      "Properties": {
        "HostedZoneName": {"Fn::Join": ["", [{"Ref": "HostedZoneName"}, "."]]},
        "RecordSets": [{
          "Name": {"Fn::Join": ["", [
            {"Fn::Select": ["0", {"Fn::Split": [".", {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}]}]},
            ".",
            {"Ref": "HostedZoneName"},
            "."
          ]]},
          "Type": "A",
          "AliasTarget": {
            "DNSName": {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]},
            "EvaluateTargetHealth": true,
            "HostedZoneId": {"Fn::GetAtt": ["ApplicationLoadBalancer", "CanonicalHostedZoneID"]}
          }
        }]
      }
    }
  },
  "Outputs": {
    "URL": {
      "Description": "URL of the website",
      "Value": {"Fn::Join": ["", [
        {"Fn::If": [
          "UseALBSSL",
          {"Fn::Join": ["", [
            "https://",
            {"Fn::Join": ["", [
              {"Fn::Select": ["0", {"Fn::Split": [".", {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}]}]},
              ".",
              {"Ref": "HostedZoneName"},
              "."
            ]]}
          ]]},
          {"Fn::Join": ["", [
            "http://",
            {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}
          ]]}
        ]}
      ]]}
    }
  }
}
```

#### YAML
<a name="rules-section-example-syntax.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VpcId of your existing Virtual Private Cloud (VPC)
    ConstraintDescription: must be the VPC Id of an existing Virtual Private Cloud.
  Subnets:
    Type: List<AWS::EC2::Subnet::Id>
    Description: The list of SubnetIds in your Virtual Private Cloud (VPC)
    ConstraintDescription: >-
      must be a list of at least two existing subnets associated with at least
      two different availability zones. They should be residing in the selected
      Virtual Private Cloud.
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t3.micro
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  UseSSL:
    AllowedValues:
      - 'Yes'
      - 'No'
    ConstraintDescription: Select Yes to create a HTTPS Listener
    Default: 'No'
    Description: 'Select "Yes" to implement SSL, "No" to skip (default).'
    Type: String
  ALBSSLCertificateARN:
    Default: ''
    Description: >-
      [Optional] The ARN of the SSL certificate to be used for the Application
      Load Balancer
    Type: String
  HostedZoneName:
    AllowedPattern: >-
      ^$|(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$
    Default: ''
    Description: '[Optional] The domain name of a valid Hosted Zone on AWS.'
    Type: String
Conditions:
  UseALBSSL: !Equals 
    - !Ref UseSSL
    - 'Yes'
Rules:
  SubnetsInVPC:
    Assertions:
      - Assert:
          'Fn::EachMemberEquals':
            - 'Fn::ValueOf':
                - Subnets
                - VpcId
            - Ref: VpcId
        AssertDescription: All subnets must be in the VPC
  ValidateHostedZone:
    RuleCondition: !Equals 
      - !Ref UseSSL
      - 'Yes'
    Assertions:
      - Assert: !Not 
          - !Equals 
            - !Ref ALBSSLCertificateARN
            - ''
        AssertDescription: ACM Certificate value cannot be empty if SSL is required
      - Assert: !Not 
          - !Equals 
            - !Ref HostedZoneName
            - ''
        AssertDescription: Route53 Hosted Zone Name is mandatory when SSL is required
Resources:
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier: !Ref Subnets
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MinSize: '2'
      MaxSize: '2'
      TargetGroupARNs:
        - !Ref ALBTargetGroup
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: '1'
        MaxBatchSize: '1'
        PauseTime: PT15M
        WaitOnResourceSignals: 'true'
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Metadata:
      Comment: Install a simple application
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: !Join 
                - |+
                - - >-
                    <h1>Congratulations, you have successfully launched the AWS
                    CloudFormation sample.</h1>
              mode: '000644'
              owner: root
              group: root
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |-
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.LaunchTemplate.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchTemplate --region ${AWS::Region}
                runas=root
              mode: '000400'
              owner: root
              group: root
          services:
            sysvinit:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              cfn-hup:
                enabled: 'true'
                ensureRunning: 'true'
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    Properties:
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
        SecurityGroupIds:
        - !Ref InstanceSecurityGroup
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        UserData: !Base64
          Fn::Sub: |
            #!/bin/bash
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchTemplate --region ${AWS::Region}
            /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow access to the ELB
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - !If 
          - UseALBSSL
          - IpProtocol: tcp
            FromPort: 443
            ToPort: 443
            CidrIp: 0.0.0.0/0
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: 0.0.0.0/0
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Subnets: !Ref Subnets
      SecurityGroups:
        - !Ref ELBSecurityGroup
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref ALBTargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: !If
        - UseALBSSL
        - 443
        - 80
      Protocol: !If 
        - UseALBSSL
        - HTTPS
        - HTTP
      Certificates:
        - !If 
          - UseALBSSL
          - CertificateArn: !Ref ALBSSLCertificateARN
          - !Ref 'AWS::NoValue'
  ALBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 3
      Port: 80
      Protocol: HTTP
      UnhealthyThresholdCount: 5
      VpcId: !Ref VpcId
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access and HTTP access on the inbound port
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId: !Select 
            - 0
            - !GetAtt 
              - ApplicationLoadBalancer
              - SecurityGroups
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
      VpcId: !Ref VpcId
  RecordSet:
    Type: AWS::Route53::RecordSetGroup
    Condition: UseALBSSL
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZoneName
          - .
      RecordSets:
        - Name: !Join 
            - ''
            - - !Select 
                - '0'
                - !Split 
                  - .
                  - !GetAtt 
                    - ApplicationLoadBalancer
                    - DNSName
              - .
              - !Ref HostedZoneName
              - .
          Type: A
          AliasTarget:
            DNSName: !GetAtt 
              - ApplicationLoadBalancer
              - DNSName
            EvaluateTargetHealth: true
            HostedZoneId: !GetAtt 
              - ApplicationLoadBalancer
              - CanonicalHostedZoneID
Outputs:
  URL:
    Description: URL of the website
    Value: !Join 
      - ''
      - - !If 
          - UseALBSSL
          - !Join 
            - ''
            - - 'https://'
              - !Join 
                - ''
                - - !Select 
                    - '0'
                    - !Split 
                      - .
                      - !GetAtt 
                        - ApplicationLoadBalancer
                        - DNSName
                  - .
                  - !Ref HostedZoneName
                  - .
          - !Join 
            - ''
            - - 'http://'
              - !GetAtt 
                - ApplicationLoadBalancer
                - DNSName
```

# Sintaxe de Conditions de modelo do CloudFormation
<a name="conditions-section-structure"></a>

A seção `Conditions` opcional contém instruções que definem as circunstâncias nas quais entidades são criadas ou configuradas. Por exemplo, é possível criar uma condição e associá-la a um recurso ou uma saída para que o CloudFormation crie o recurso ou a saída se a condição for true. Da mesma forma, é possível associar uma condição a uma propriedade para que o CloudFormation defina a propriedade como um valor específico se a condição for true. Se a condição for false, o CloudFormation definirá a propriedade para um valor alternativo que você especificar.

Você poderá usar as condições quando quiser reutilizar um modelo para criar recursos em contextos diferentes, como ambientes de teste versus de produção. Por exemplo, no modelo, você pode adicionar um parâmetro de entrada `EnvironmentType` que aceita `prod` ou `test` como entradas. Para o ambiente de `prod`, você pode incluir instâncias do EC2 com determinados recursos. No entanto, para o ambiente de `test`, você deve usar recursos reduzidos para economizar. Essa definição de condição permite que você defina quais recursos são criados e como eles são configurados para cada tipo de ambiente.

## Sintaxe
<a name="conditions-section-structure-syntax"></a>

A seção `Conditions` consiste no nome da chave `Conditions`. Cada declaração de condição inclui um ID lógico e uma ou mais funções intrínsecas. 

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

```
"Conditions": {
  "LogicalConditionName1": {
    "Intrinsic function": ...[
  },

  "LogicalConditionName2": {
    "Intrinsic function": ...
  }
}
```

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

```
Conditions:
  LogicalConditionName1:
    Intrinsic function:
      ...

  LogicalConditionName2:
    Intrinsic function:
      ...
```

## Como as condições funcionam
<a name="conditions-section-structure-overview"></a>

Para usar as condições, siga estas etapas:

1. **Adicionar uma definição de parâmetro**: defina as entradas que as condições avaliarão na seção `Parameters` do seu modelo. As condições são avaliadas como true ou false com base nos valores dos parâmetros de entrada. Observe que os pseudoparâmetros estão disponíveis automaticamente e não exigem definição explícita na seção `Parameters`. Para obter mais informações sobre pseudoparâmetros, consulte [Obter valores da AWS usando pseudoparâmetros](pseudo-parameter-reference.md).

1. **Adicionar uma definição de condição**: defina condições na seção `Conditions` usando funções intrínsecas como `Fn::If` ou `Fn::Equals`. Essas condições determinam quando o CloudFormation cria os recursos associados. As condições podem ser baseadas em:
   + Valores de parâmetros de entrada ou pseudoparâmetros
   + Outras condições
   + Valores de mapeamento

   No entanto, você não pode fazer referência a IDs lógicos de recursos ou seus atributos em condições.

1. **Associar condições a recursos ou saídas**: referencie condições em recursos ou saídas usando a chave `Condition` e o ID lógico de uma condição. Opcionalmente, use `Fn::If` em outras partes do modelo (como valores de propriedades) para definir valores com base em uma condição. Para obter mais informações, consulte [Usar a chave `Condition`](#using-conditions-in-templates).

O CloudFormation avalia as condições ao criar ou atualizar uma pilha. O CloudFormation cria entidades que são associadas a uma condição verdadeira e ignora entidades que são associadas a uma condição falsa. O CloudFormation também reavalia essas condições em cada atualização de pilha antes de modificar qualquer recurso. As entidades que permanecem associadas a uma condição true são atualizadas, enquanto as que se tornam associadas a uma condição false são excluídas.

**Importante**  
Durante uma atualização de pilha, você não pode atualizar as condições por si só. Você pode atualizar condições apenas ao incluir alterações que adicionam, modificam ou excluem recursos.

## Funções intrínsecas da condição
<a name="conditions-section-structure-functions"></a>

Você pode usar as seguintes funções intrínsecas para definir condições:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)

**nota**  
`Fn::If` só tem suporte no atributo de metadados, no atributo de atualização de política e em valores de propriedade nas seções `Resources` e `Outputs` de um modelo.

## Usar a chave `Condition`
<a name="using-conditions-in-templates"></a>

Depois que uma condição é definida, é possível aplicá-la em vários lugares no modelo, como `Resources` e `Outputs`, usando a chave `Condition`. A chave `Condition` faz referência ao nome lógico de uma condição e retorna o resultado avaliado da condição especificada.

**Topics**
+ [Associar condições a recursos](#associate-conditions-with-resources)
+ [Associar condições a saídas](#associate-conditions-with-outputs)
+ [Fazer referência a condições em outras condições](#reference-conditions-in-other-conditions)
+ [Retorne condicionalmente valores de propriedade usando `Fn::If`](#conditional-return-property-values-using-fn-if)

### Associar condições a recursos
<a name="associate-conditions-with-resources"></a>

Para criar recursos condicionalmente, adicione a chave `Condition` e o ID lógico da condição como um atributo ao recurso. O CloudFormation cria o recurso somente quando a condição é avaliada como verdadeira.

#### JSON
<a name="associate-conditions-with-resources.json"></a>

```
"NewVolume" : {
  "Type" : "AWS::EC2::Volume",
  "Condition" : "IsProduction",
  "Properties" : {
     "Size" : "100",
     "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
  }
}
```

#### YAML
<a name="associate-conditions-with-resources.yaml"></a>

```
NewVolume:
  Type: AWS::EC2::Volume
  Condition: IsProduction
  Properties:
    Size: 100
    AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
```

### Associar condições a saídas
<a name="associate-conditions-with-outputs"></a>

Também é possível associar condições a saídas. O CloudFormation cria a saída somente quando a condição associada é avaliada como verdadeira.

#### JSON
<a name="associate-conditions-with-outputs.json"></a>

```
"Outputs" : {
  "VolumeId" : {
    "Condition" : "IsProduction",
    "Value" : { "Ref" : "NewVolume" }
  }
}
```

#### YAML
<a name="associate-conditions-with-outputs.yaml"></a>

```
Outputs:
  VolumeId:
    Condition: IsProduction
    Value: !Ref NewVolume
```

### Fazer referência a condições em outras condições
<a name="reference-conditions-in-other-conditions"></a>

Ao definir condições na seção `Conditions`, você pode fazer referência a outras condições usando a chave `Condition`. Isso permite que você crie uma lógica condicional mais complexa combinando várias condições.

No exemplo a seguir, a condição `IsProdAndFeatureEnabled` será avaliada como verdadeira somente se as condições `IsProduction` e `IsFeatureEnabled` forem avaliadas como verdadeiras.

#### JSON
<a name="reference-conditions-in-other-conditions.json"></a>

```
"Conditions": {
  "IsProduction" : {"Fn::Equals" : [{"Ref" : "Environment"}, "prod"]},
  "IsFeatureEnabled" : { "Fn::Equals" : [{"Ref" : "FeatureFlag"}, "enabled"]},
  "IsProdAndFeatureEnabled" : {
    "Fn::And" : [
      {"Condition" : "IsProduction"},
      {"Condition" : "IsFeatureEnabled"}
    ]
  }
}
```

#### YAML
<a name="reference-conditions-in-other-conditions.yaml"></a>

```
Conditions:
  IsProduction:
    !Equals [!Ref Environment, "prod"]
  IsFeatureEnabled:
    !Equals [!Ref FeatureFlag, "enabled"]
  IsProdAndFeatureEnabled: !And
    - !Condition IsProduction
    - !Condition IsFeatureEnabled
```

### Retorne condicionalmente valores de propriedade usando `Fn::If`
<a name="conditional-return-property-values-using-fn-if"></a>

Para um controle mais granular, é possível usar a função intrínseca `Fn::If` para retornar condicionalmente um dos dois valores de propriedade em recursos ou saídas. Essa função avalia uma condição e retorna um valor se a condição é verdadeira e outro valor se a condição é falsa.

#### Valores condicionais da propriedade
<a name="using-fn-if-for-conditional-values"></a>

O exemplo a seguir demonstra a definição de um tipo de instância do EC2 com base em uma condição do ambiente. Se a condição `IsProduction` for verdadeira, o tipo de instância será definido como `c5.xlarge`. Caso contrário, ele será definido como `t3.small`.

##### JSON
<a name="using-fn-if-for-conditional-values.json"></a>

```
"Properties" : {
  "InstanceType" : {
    "Fn::If" : [
      "IsProduction",
      "c5.xlarge",
      "t3.small"
    ]
  }
}
```

##### YAML
<a name="using-fn-if-for-conditional-values.yaml"></a>

```
Properties:
  InstanceType: !If
    - IsProduction
    - c5.xlarge
    - t3.small
```

#### Remoção condicional de propriedades
<a name="using-fn-if-with-novalue"></a>

Também é possível usar o pseudoparâmetro `AWS::NoValue` como um valor de retorno para remover a propriedade correspondente quando uma condição é falsa.

##### JSON
<a name="using-fn-if-with-novalue.json"></a>

```
"DBSnapshotIdentifier" : {
  "Fn::If" : [
    "UseDBSnapshot",
    {"Ref" : "DBSnapshotName"},
    {"Ref" : "AWS::NoValue"}
  ]
}
```

##### YAML
<a name="using-fn-if-with-novalue.yaml"></a>

```
DBSnapshotIdentifier: !If
  - UseDBSnapshot
  - !Ref DBSnapshotName
  - !Ref "AWS::NoValue"
```

## Exemplos
<a name="conditions-section-structure-examples"></a>

**Topics**
+ [Criação de recursos com base no ambiente](#environment-based-resource-creation)
+ [Provisionamento de recursos com várias condições](#multi-condition-resource-provisioning)

### Criação de recursos com base no ambiente
<a name="environment-based-resource-creation"></a>

Os exemplos a seguir provisionam uma instância do EC2 e criam e anexam condicionalmente um novo volume do EBS somente se o tipo de ambiente for `prod`. Se o ambiente for `test`, eles simplesmente criam a instância do EC2 sem o volume adicional.

#### JSON
<a name="conditions-section-example-resource-creation.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "EnvType": {
            "Description": "Environment type",
            "Default": "test",
            "Type": "String",
            "AllowedValues": [
                "prod",
                "test"
            ],
            "ConstraintDescription": "must specify prod or test"
        }
    },
    "Conditions": {
        "IsProduction": {
            "Fn::Equals": [
                {
                    "Ref": "EnvType"
                },
                "prod"
            ]
        }
    },
    "Resources": {
        "EC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "ami-1234567890abcdef0",
                "InstanceType": "c5.xlarge"
            }
        },
        "MountPoint": {
            "Type": "AWS::EC2::VolumeAttachment",
            "Condition": "IsProduction",
            "Properties": {
                "InstanceId": {
                    "Ref": "EC2Instance"
                },
                "VolumeId": {
                    "Ref": "NewVolume"
                },
                "Device": "/dev/sdh"
            }
        },
        "NewVolume": {
            "Type": "AWS::EC2::Volume",
            "Condition": "IsProduction",
            "Properties": {
                "Size": 100,
                "AvailabilityZone": {
                    "Fn::GetAtt": [
                        "EC2Instance",
                        "AvailabilityZone"
                    ]
                }
            }
        }
    }
}
```

#### YAML
<a name="conditions-section-example-resource-creation.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Description: Environment type
    Default: test
    Type: String
    AllowedValues:
      - prod
      - test
    ConstraintDescription: must specify prod or test
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-1234567890abcdef0
      InstanceType: c5.xlarge
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: IsProduction
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: AWS::EC2::Volume
    Condition: IsProduction
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt
        - EC2Instance
        - AvailabilityZone
```

### Provisionamento de recursos com várias condições
<a name="multi-condition-resource-provisioning"></a>

Os exemplos a seguir criarão condicionalmente um bucket do S3 se um nome de bucket for fornecido, e anexarão uma política de bucket somente quando o ambiente estiver definido como `prod`. Se nenhum nome de bucket for fornecido ou se o ambiente for de `test`, nenhum recurso será criado.

#### JSON
<a name="conditions-section-example-multi-condition.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "EnvType": {
            "Type": "String",
            "AllowedValues": [
                "prod",
                "test"
            ]
        },
        "BucketName": {
            "Default": "",
            "Type": "String"
        }
    },
    "Conditions": {
        "IsProduction": {
            "Fn::Equals": [
                {
                    "Ref": "EnvType"
                },
                "prod"
            ]
        },
        "CreateBucket": {
            "Fn::Not": [
                {
                    "Fn::Equals": [
                        {
                            "Ref": "BucketName"
                        },
                        ""
                    ]
                }
            ]
        },
        "CreateBucketPolicy": {
            "Fn::And": [
                {
                    "Condition": "IsProduction"
                },
                {
                    "Condition": "CreateBucket"
                }
            ]
        }
    },
    "Resources": {
        "Bucket": {
            "Type": "AWS::S3::Bucket",
            "Condition": "CreateBucket",
            "Properties": {
                "BucketName": {
                    "Ref": "BucketName"
                }
            }
        },
        "Policy": {
            "Type": "AWS::S3::BucketPolicy",
            "Condition": "CreateBucketPolicy",
            "Properties": {
                "Bucket": {
                    "Ref": "Bucket"
                },
                "PolicyDocument": { ... }
            }
        }
    }
}
```

#### YAML
<a name="conditions-section-example-multi-condition.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Type: String
    AllowedValues:
      - prod
      - test
  BucketName:
    Default: ''
    Type: String
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
  CreateBucket: !Not
    - !Equals
      - !Ref BucketName
      - ''
  CreateBucketPolicy: !And
    - !Condition IsProduction
    - !Condition CreateBucket
Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Condition: CreateBucket
    Properties:
      BucketName: !Ref BucketName
  Policy:
    Type: AWS::S3::BucketPolicy
    Condition: CreateBucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument: ...
```

Neste exemplo, a condição `CreateBucketPolicy` demonstra como fazer referência a outras condições usando a chave `Condition`. A política é criada somente quando as condições `IsProduction` e `CreateBucket` são avaliadas como verdadeiras.

**nota**  
Para exemplos mais complexos do uso de condições, consulte o tópico [atributo Condition](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-condition.html) no *Guia de referência de modelos do CloudFormation*.

# Seção Transform do modelo do CloudFormation
<a name="transform-section-structure"></a>

A seção `Transform` opcional especifica uma ou mais macros que o CloudFormation usa para processar o modelo de alguma forma. 

As macros podem realizar tarefas simples, como localizar e substituir texto, ou podem fazer transformações mais extensas em todo o modelo. O CloudFormation executa as macros na ordem em que elas são especificadas. Quando você cria um conjunto de alterações, o CloudFormation gera um conjunto de alterações que inclui o conteúdo do modelo processado. Em seguida, você pode revisar as alterações e executar o conjunto de alterações. Consulte mais informações sobre como as macros funcionam em [Executar processamento personalizado em modelos do CloudFormation com macros de modelo](template-macros.md).

O CloudFormation também é compatível com *transformações*, que são macros hospedadas pelo CloudFormation. O CloudFormation trata essas transformações da mesma forma que qualquer macro que você cria em termos de ordem de execução e escopo. Para obter mais informações, consulte a [Referência de transformações](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-reference.html).

Para declarar várias macros, use um formato de lista e especifique uma ou mais macros.

Por exemplo, no modelo de exemplo abaixo, o CloudFormation avalia `MyMacro` e, depois, `AWS::Serverless`, e ambas podem processar o conteúdo do modelo inteiro devido à sua inclusão na seção `Transform`.

```
# Start of processable content for MyMacro and AWS::Serverless
Transform:
  - MyMacro
  - 'AWS::Serverless'
Resources:
  WaitCondition:
    Type: AWS::CloudFormation::WaitCondition
  MyBucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: amzn-s3-demo-bucket
      Tags: [{"key":"value"}]
      CorsConfiguration: []
  MyEc2Instance:
    Type: AWS::EC2::Instance 
    Properties:
      ImageId: ami-1234567890abcdef0
# End of processable content for MyMacro and AWS::Serverless
```

# Sintaxe de versão de formato de modelo do CloudFormation
<a name="format-version-structure"></a>

A seção `AWSTemplateFormatVersion` (opcional) identifica a versão do formato do modelo com a qual o modelo é compatível. A template format version mais recente é `2010-09-09` e é o único valor válido no momento.

A versão do formato de modelo não é a mesma versão da API. A versão do formato de modelo pode ser alterada independentemente das versões da API.

O valor da declaração da template format version deve ser uma sequência literal. Você não pode usar um parâmetro ou uma função para especificar a versão do formato do modelo. Se você não especificar um valor, o CloudFormation assumirá a versão de formato de modelo mais recente. O trecho a seguir é um exemplo de uma declaração de template format version:

## JSON
<a name="format-version-structure-example.json"></a>

```
"AWSTemplateFormatVersion" : "2010-09-09"
```

## YAML
<a name="format-version-structure-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
```

# Sintaxe de Description de modelo do CloudFormation
<a name="template-description-structure"></a>

A seção `Description` (opcional) permite que você inclua uma string de texto que descreva o modelo. Esta seção deve sempre seguir a seção template format version.

O valor da declaração da descrição deve ser uma sequência literal com 0 a 1024 bytes de comprimento. Você não pode usar um parâmetro ou uma função para especificar a descrição. O trecho a seguir é um exemplo de uma declaração da descrição:

**Importante**  
Durante a atualização de uma pilha, você não pode atualizar a seção `Description` por si só. Você pode atualizá-la apenas ao incluir alterações que adicionam, modificam ou excluem recursos.

## JSON
<a name="template-description-structure-example.json"></a>

```
"Description" : "Here are some details about the template."
```

## YAML
<a name="template-description-structure-example.yaml"></a>

```
Description: > Here are some details about the template.
```

# Crie modelos visualmente com o Infrastructure Composer
<a name="infrastructure-composer-for-cloudformation"></a>

O AWS Infrastructure Composer (anteriormente conhecido como **Application Composer**) ajuda você a compor e configurar visualmente aplicações modernas na AWS. Em vez de escrever código, você pode arrastar e soltar diferentes recursos para criar a aplicação visualmente. 

O *Infrastructure Composer no modo de console do CloudFormation* é a ferramenta recomendada para trabalhar visualmente com modelos do CloudFormation. Essa versão do Infrastructure Composer que você pode acessar no console do CloudFormation é um aprimoramento de uma ferramenta antiga denominada CloudFormation Designer. 

Com o Infrastructure Composer no modo de console do CloudFormation, é possível arrastar, soltar, configurar e conectar vários recursos, denominados *cartões*, em uma tela visual. Essa abordagem visual facilita o design e a edição da arquitetura das aplicações sem necessidade de trabalhar diretamente com os modelos. Para acessar esse modo no console do [CloudFormation](https://console.aws.amazon.com/cloudformation/), selecione **Infrastructure Composer** no menu de navegação do lado esquerdo.

Para obter mais informações, consulte [Como compor no AWS Infrastructure Composer](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/using-composer-basics.html), no *Guia do desenvolvedor do AWS Infrastructure Composer*.

## Por que usar o Infrastructure Composer no modo de console do CloudFormation?
<a name="app-composer-for-cloudformation-why-use"></a>

Visualizar os modelos no Infrastructure Composer ajuda a identificar lacunas e áreas a serem aprimoradas nos modelos e na arquitetura das aplicações do CloudFormation. O Infrastructure Composer melhora a experiência de desenvolvimento com a facilidade e a eficiência de criar e modificar pilhas do CloudFormation visualmente. Você pode começar com um rascunho inicial, criar código implantável e incorporar fluxos de trabalho de desenvolvimento ao designer visual no Infrastructure Composer.

## Em que esse modo difere do console padrão do Infrastructure Composer?
<a name="app-composer-for-cloudformation-differences"></a>

Embora a versão de console do CloudFormation do Infrastructure Composer tenha atributos semelhantes aos do console padrão do Infrastructure Composer, existem algumas diferenças. Os cartões relacionados ao Lambda (**função do Lambda** e **camada do Lambda**) exigem compilações de código e soluções de empacotamento que não estão disponíveis no Infrastructure Composer no modo de console do CloudFormation. A sincronização local também não está disponível nesse modo.

Porém, você pode usar esses cartões relacionados ao Lambda e o atributo de sincronização local no [console do Infrastructure Composer](https://console.aws.amazon.com/composer/home) ou no AWS Toolkit for Visual Studio Code. Para obter mais informações, consulte o [Guia do desenvolvedor do AWS Infrastructure Composer](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/what-is-composer.html) e [Infrastructure Composer](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/appcomposer.html) no *Guia do usuário do AWS Toolkit for Visual Studio Code*.

# AWS CloudFormation Language Server
<a name="ide-extension"></a>

O AWS CloudFormation Language Server fornece recursos para acelerar a criação de infraestrutura como código (IaC) e a implantação de recursos da AWS com segurança e confiança. Ele segue o [protocolo de servidor de linguagens](https://microsoft.github.io/language-server-protocol/) (LSP) para fornecer documentação contextual e sobre preenchimento automático, diagnóstico por meio de validação estática, acesso à definição e ações de código. Além desses recursos tradicionais de servidor de idiomas, o servidor adiciona recursos on-line para explorar e implantar recursos da AWS por meio do CloudFormation. Isso inclui a capacidade de validar e implantar modelos usando conjuntos de alterações, de visualizar diferenças de pilhas, eventos, recursos e saídas, de listar pilhas e procurar recursos por tipo e de inserir o estado ativo dos recursos diretamente nos modelos do CloudFormation.

**Topics**
+ [IDEs integrados ao AWS CloudFormation Language Server](#ide-extension-supported-ides)
+ [Introdução](#ide-extension-getting-started)
+ [Inicialização de um projeto do CloudFormation no IDE (apenas VS Code)](#ide-extension-initialize-project)
+ [Código aberto](#ide-extension-open-source)
+ [Precisa de ajuda?](#ide-extension-need-help)

## IDEs integrados ao AWS CloudFormation Language Server
<a name="ide-extension-supported-ides"></a>

O AWS oferece integração pronta para uso com o CloudFormation Language Server por meio do AWS Toolkit para os seguintes IDEs:
+ [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode)
+ [IDEs da JetBrains](https://plugins.jetbrains.com/plugin/11349-aws-toolkit) (versão 2025.3 ou posterior), incluindo IntelliJ IDEA, WebStorm e PyCharm

Os seguintes IDEs também oferecem suporte ao CloudFormation Language Server:
+ [Kiro](https://kiro.dev/downloads/)
+ [Cursor](https://cursor.com/)
+ A maioria dos forks e distribuições do VS Code

O CloudFormation Language Server segue o [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) e, portanto, outras integrações podem ser configuradas. Para obter instruções sobre como integrar o servidor de idiomas com outros editores, consulte o [guia de instalação](https://github.com/aws-cloudformation/cloudformation-languageserver/blob/main/INSTALLATION.md).

## Introdução
<a name="ide-extension-getting-started"></a>

**Topics**
+ [Pré-requisitos](#ide-extension-prerequisites)
+ [Etapa 1: instalar ou atualizar o kit de ferramentas da AWS](#ide-extension-install-toolkit)
+ [Etapa 2: acessar o CloudFormation no painel do AWS Toolkit](#ide-extension-access-toolkit-panel)
+ [Etapa 3: validar, testar e refinar seu modelo](#ide-extension-validate-test-refine)
+ [Etapa 4: navegar pelo modelo](#ide-extension-navigate-template)
+ [Etapa 5: validar e implantar](#ide-extension-validate-deploy)

### Pré-requisitos
<a name="ide-extension-prerequisites"></a>

Antes de começar, verifique se:
+ Você está usando um IDE compatível em um sistema operacional compatível (macOS, Windows ou Linux).
+ Você instalou ou atualizou para a versão mais recente do kit de ferramentas da AWS para seu IDE.

Alguns recursos no AWS CloudFormation Language Server exigem as credenciais configuradas e ativas da Conta da AWS. Você deve fazer login em sua Conta da AWS por meio do kit de ferramentas da AWS usando credenciais válidas.

### Etapa 1: instalar ou atualizar o kit de ferramentas da AWS
<a name="ide-extension-install-toolkit"></a>

Instale ou atualize para a versão mais recente do AWS Toolkit a partir do gerenciador de extensões ou plug-ins do seu IDE e, em seguida, reinicie o IDE.

Após a instalação, o kit de ferramentas da AWS habilita automaticamente o suporte ao IDE do CloudFormation. Ao instalar ou atualizar AWS o Toolkit com o AWS CloudFormation Language Server pela primeira vez, será solicitado que conceda permissão para o AWS para a coleta de dados de uso anônimos. Esses dados ajudam a AWS a melhorar o CloudFormation Language Server e aprimoram a experiência de criação de conteúdo. Nenhuma informação sensível é coletada, e AWS não registra nem armazena conteúdo de modelos, configurações de recursos ou quaisquer dados identificáveis do cliente. Você pode alterar suas preferências de telemetria a qualquer momento nas configurações do IDE. Reinicie o IDE para que as alterações tenham efeito. Os dados de uso coletados focam apenas as interações de recursos e as métricas de performance. Esses insights ajudam a identificar e priorizar melhorias da AWS, como validação mais rápida, preenchimento automático aprimorado e melhores diagnósticos de erros.

### Etapa 2: acessar o CloudFormation no painel do AWS Toolkit
<a name="ide-extension-access-toolkit-panel"></a>

Depois de instalar o AWS Toolkit, abra o painel CloudFormation no seu IDE. No VS Code, abra o painel do AWS Toolkit na barra de atividades e escolha **CLOUDFORMATION**. Nos IDEs da JetBrains, abra a janela de ferramentas **AWS Toolkit** na barra lateral e selecione a guia **CloudFormation**.

O painel do CloudFormation contém as seguintes seções:
+ **Região**: exibe a Região da AWS atual. No VS Code, você pode alterá-la selecionando o nome da região ou usando o comando **AWS CloudFormation: Select Region** na paleta de comandos. Nos IDEs da JetBrains, a Região é configurada por meio das configurações de conexão do AWS Toolkit.
+ **Pilhas**: exibe uma lista paginada das pilhas do CloudFormation em sua conta. Expanda uma pilha para visualizar o nó **Change Sets**, que lista os conjuntos de alterações associados a essa pilha. Utilize a ação Visualizar detalhes da pilha para abrir a visualização detalhada da pilha, que exibe a visão geral da pilha, os eventos, as saídas e os recursos.
+ **Recursos**: depois de adicionar um tipo de recurso, o painel exibe os recursos da AWS desse tipo em sua conta. Você pode visualizá-los, atualizá-los, copiá-los ou importá-los para o seu modelo.

Nos IDEs da JetBrains, a barra de ferramentas acima da árvore oferece acesso rápido a ações comuns, incluindo **Validate and Deploy**, **Rerun Validate and Deploy**, **Add Resource Type** e **Refresh**. As ações também estão disponíveis nos menus de contexto acessados ao clicar com o botão direito do mouse nos nós da árvore.

### Etapa 3: validar, testar e refinar seu modelo
<a name="ide-extension-validate-test-refine"></a>

À medida que você escreve seu modelo do CloudFormation, o IDE fornece assistência de criação inteligente para ajudar a criar uma infraestrutura precisa e compatível com mais rapidez. O CloudFormation Language Server é executado em segundo plano e oferece os seguintes recursos de criação:
+ Preenchimento de código: sugere tipos de recursos, parâmetros e propriedades com base nos esquemas do CloudFormation.
+ Adicionar recursos existentes da AWS: permite que você importe recursos existentes da sua Conta da AWS para o seu modelo. O IDE usa o [AWS API Cloud Control (CCAPI)](https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/what-is-cloudcontrolapi.html) para recuperar a configuração ativa e as propriedades do recurso, ajudando você a clonar ou a reutilizar a infraestrutura existente em seu modelo.
+ Extrair para parâmetro: quando o cursor estiver sobre um valor literal em um modelo (por exemplo, uma string como `t2.micro`), o IDE oferece uma ação de refatoração para extrair o valor para a seção `!Ref` e substituir o literal por uma `Parameters` ao novo parâmetro. Se o mesmo valor literal aparecer em vários lugares, você pode optar por extrair todas as ocorrências de uma só vez.

#### Para adicionar recursos a seu modelo
<a name="ide-extension-add-resources-to-template"></a>
+ **Adicionar um tipo de recurso**: no painel AWS Toolkit CloudFormation, em **Recursos**, adicione um tipo de recurso para navegar. No VS Code, clique no ícone **Adicionar \$1** ou use o comando **AWS CloudFormation: Add Resource Types** na paleta de comandos. Na JetBrains, clique no botão **Add Resource Type** na barra de ferramentas ou clique com o botão direito do mouse no nó **Recursos**.
+ **Pesquisar um tipo de recurso**: na caixa de diálogo de pesquisa, digite o tipo de recurso AWS que você deseja adicionar. Exemplo:
  + `AWS::S3::Bucket`
  + `AWS::Lambda::Function`
+ **Explorar recursos**: na seção **Resources**, é exibida uma lista paginada dos recursos da AWS detectados na sua conta. Se você tiver muitos recursos, somente a primeira página será exibida. Utilize os controles de navegação para percorrer as páginas adicionais e visualizar todos os recursos disponíveis.
+ Escolha o recurso que você deseja incluir em seu modelo.
+ Você pode inserir um recurso em seu modelo de duas formas, dependendo do seu objetivo:
  + **Clonar um recurso existente**: crie um novo recurso em seu modelo usando a configuração ativa e as propriedades de um recurso existente daAWS.
  + **Importar um recurso existente**: insira o recurso real em sua pilha adicionando-o ao seu modelo usando seu estado ativo.

**Dicas**
+ Você pode atualizar a seção **Recursos** a qualquer momento para ver a lista mais recente de recursos disponíveis em sua conta ou região.
+ Se você estiver importando recursos, não adicione um recurso que já pertença a uma pilha existente do CloudFormation na mesma conta.
+ Para confirmar se um recurso já é gerenciado pelo CloudFormation, utilize a ação “Informações” ao lado do recurso. No VS Code, clique no ícone **i**. Nos IDEs da JetBrains, clique com o botão direito do mouse no recurso e selecione **Get Stack Management Info**.

##### Adicionar recursos relacionados
<a name="ide-extension-add-related-resources"></a>

No VS Code, você pode adicionar recursos relacionados ao recurso selecionado usando o comando **AWS CloudFormation: Add Related Resources by Type**. Depois de selecionar um tipo de recurso dos já definidos em seu modelo, o IDE exibirá uma lista de recursos que normalmente estão associados ou dependem desse tipo. Por exemplo, se você selecionar o `AWS::EC2::Instance`, o IDE poderá sugerir a adição de recursos relacionados, como `AWS::EC2::SecurityGroup` ou `AWS::EC2::Subnet`. Esse recurso ajuda você a criar rapidamente componentes de infraestrutura conectados sem procurar manualmente por tipos de recursos compatíveis. Atualmente, esse recurso não é compatível com os IDEs da JetBrains.₢

#### Validação estática
<a name="ide-extension-static-validation"></a>

O CloudFormation Language Server fornece validação estática integrada baseada no [AWS CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint) e [AWS CloudFormation Guard](https://docs.aws.amazon.com/cfn-guard/latest/ug/what-is-guard.html). Essas validações são executadas em segundo plano à medida que você cria modelos, ajudando a identificar erros de sintaxe, lacunas de conformidade e problemas de práticas recomendadas antes da implantação.

**Visão geral da validação estática**

Você verá dois tipos de validações estáticas em tempo real no IDE:
+ CloudFormation Linter (`cfn-lint`): valida seu modelo em relação às especificações de recursos e regras de esquema do CloudFormation.
+ Guard (`cfn-guard`): valida seu modelo em relação às regras de conformidade e aos pacotes de políticas organizacionais.

##### CloudFormation Linter (cfn-lint)
<a name="ide-extension-cfn-linter-details"></a>

O CloudFormation Linter é integrado ao IDE para verificar automaticamente a sintaxe e a estrutura do modelo à medida que você digita.
+ **Validação do esquema**: detecta erros de sintaxe e esquema para garantir que seus modelos estejam em conformidade com o esquema de recursos do CloudFormation.
+ **Realce de erros**: exibe marcadores embutidos nas questões, indicando bloqueadores de implantação ou avisos.
+ **Ajuda ao passar o mouse**: quando você passa o mouse sobre um erro, o IDE mostra a mensagem de diagnóstico associada a esse problema. Se uma solução rápida estiver disponível, ela também será oferecida.

##### Integração do Guard
<a name="ide-extension-cfn-guard-integration"></a>

O Guard valida seus modelos em relação aos conjuntos de regras que definem as políticas de conformidade e segurança. O IDE executa validações do Guard em tempo real por meio do CloudFormation Language Server, fornecendo feedback imediato enquanto você cria modelos.
+ **Pacotes de regras padrão**: o IDE inclui um conjunto pré-registrado de regras do Guard focado nas práticas recomendadas básicas de segurança de recursos e limpeza da configuração. Para saber mais, consulte [o registro de regras de proteção](https://github.com/aws-cloudformation/aws-guard-rules-registry).
+ **Adicionando pacotes de regras**: para adicionar ou modificar conjuntos de regras, abra as configurações do seu IDE e acesse a seção de configuração do Guard para selecionar ou carregar pacotes de regras adicionais do Guard.

**Dicas**: entendendo os indicadores de diagnóstico
+ Indicadores azuis: sugestões de melhores práticas ou recomendações de otimização.
+ Indicadores amarelos: avisos sobre problemas de não bloqueio (por exemplo, tags ou parâmetros ausentes).
+ Indicadores vermelhos: bloqueadores de implantação, como nomes de propriedades inválidos, campos obrigatórios ausentes ou incompatibilidades de esquema.

### Etapa 4: navegar pelo modelo
<a name="ide-extension-navigate-template"></a>

O IDE oferece uma visualização estruturada e hierárquica do seu modelo do CloudFormation, organizado em seções como `Parameters`, `Resources`, `Outputs`, e `Mappings`, mostrando cada tipo de recurso e ID lógico. Isso facilita a localização e a navegação rápida para recursos ou parâmetros específicos em grandes modelos. No VS Code, o painel **Outline** na barra lateral do **Explorer** exibe essa estrutura. Nos IDEs da JetBrains, abra a janela de ferramentas **Structure** para visualizar a estrutura do modelo para o arquivo aberto no momento.

Você pode usar **Ir para a definição** para funções intrínsecas, como `GetAtt` e`Ref`, permitindo que você vá diretamente para o recurso ou parâmetro referenciado em seu modelo. Isso ajuda você a rastrear dependências, a entender as relações de recursos e a fazer edições com mais eficiência.

### Etapa 5: validar e implantar
<a name="ide-extension-validate-deploy"></a>

Quando estiver pronto para implementar seu modelo do CloudFormation, utilize o recurso “Validate and Deploy” para criar um conjunto de alterações. O IDE valida o seu modelo e, caso não sejam encontrados erros que impeçam a continuação, prossegue com a criação de um [conjunto de alterações sensível a desvios progressivos](drift-aware-change-sets.md). O IDE exibe então uma visualização de diferenças para que você possa revisar todas as alterações propostas antes de executar o conjunto de alterações.

No VS Code, abra a paleta de comandos e execute **AWS CloudFormation: validar e realizar a implantação**. A paleta de comandos orienta-o passo a passo na seleção de um modelo, nome da pilha, parâmetros, recursos e outras opções de implantação. Nos IDEs da JetBrains, utilize o botão na barra de ferramentas **Validate and Deploy**, clique com o botão direito do mouse em um arquivo de modelo no editor ou clique com o botão direito do mouse em uma pilha na árvore. A JetBrains apresenta uma caixa de diálogo do assistente onde é possível configurar todas as opções de implantação, incluindo a seleção do modelo, o nome da pilha, os parâmetros, os recursos, as etiquetas e as opções avançadas.

#### Como a validação funciona
<a name="ide-extension-how-validation-works"></a>

O IDE executa automaticamente uma [verificação de validação antes da implantação](validate-stack-deployments.md) e valida seu modelo quanto a causas comuns de falha, incluindo:
+ Sintaxe inválida de propriedades ou incompatibilidades de esquema: esses problemas geralmente são detectados por `cfn-lint` durante a criação, mas se você prosseguir com a implantação sem corrigi-los, a validação do CloudFormation no momento da implantação exibirá os mesmos erros antes que a pilha seja criada ou atualizada.
+ O nome do recurso está em conflito com os recursos existentes na sua conta.
+ Restrições específicas do serviço, como conflitos de nomes de buckets do S3 ou falta de criptografia.

Se a validação detectar erros, o IDE destaca os problemas diretamente no seu modelo e lista os erros no painel de diagnóstico. Cada problema inclui a propriedade ou o recurso específico que causou a falha, junto com uma sugestão de correção. Se não houver erros de bloqueio, você poderá prosseguir para a fase de implantação.

Se forem encontrados avisos (problemas de não bloqueio), uma caixa de diálogo será exibida permitindo que você continue com a implantação ou cancele e faça correções.

O IDE abre um [conjunto de alterações sensível a desvios](drift-aware-change-sets.md) que exibe todas as diferenças entre seu modelo atual e a configuração da pilha implantada. Isso permite que você revise, confirme ou cancele o conjunto de alterações antes da execução. O cancelamento da implantação exclui o conjunto de alterações.

Conjuntos de alterações sensíveis a desvios aprimoram o processo de implantação do CloudFormation, permitindo que você gerencie o desvio de pilha com segurança. O desvio de pilha ocorre quando o estado real dos seus recursos é diferente do que está definido no seu modelo do CloudFormation, geralmente devido a alterações manuais feitas por meio do Console de gerenciamento da AWS, da CLI ou do SDK. Os [conjuntos de alterações sensível a desvios](drift-aware-change-sets.md) do CloudFormation comparam sua configuração de pilha processada com o estado ativo do recurso, e o IDE mostra essas diferenças para que você possa trazer os recursos de volta à conformidade antes da implantação.

#### Visualizar eventos de pilha
<a name="ide-extension-view-stack-events"></a>

Quando a implantação começar, poderá acompanhar o andamento em tempo real no painel do CloudFormation. Em **Eventos de pilha**, você verá uma lista das operações realizadas durante a implantação. Cada evento inclui detalhes como:
+ **Carimbo de data e hora**: a hora em que o evento ocorreu
+ **Recurso**: o recurso específico da AWS que está sendo criado, atualizado ou excluído
+ **Status**: o estado atual da operação (por exemplo, `CREATE_IN_PROGRESS`, `UPDATE_COMPLETE` ou `ROLLBACK_IN_PROGRESS`)
+ **Motivo**: contexto adicional ou mensagens de erro, se aplicável

Você também pode ver os **recursos** e as **saídas** da pilha nesse painel. A visualização **Eventos de pilha** ajuda você a acompanhar o progresso da implantação, a identificar possíveis problemas e a confirmar quando sua pilha foi concluída com êxito.

## Inicialização de um projeto do CloudFormation no IDE (apenas VS Code)
<a name="ide-extension-initialize-project"></a>

Inicializar um projeto do CloudFormation no IDE ajuda você a configurar um espaço de trabalho estruturado com as pastas, a configuração do ambiente e as credenciais da AWS corretas para que você possa validar e implantar seus modelos de forma confiável. Você pode inicializar um novo projeto do CloudFormation diretamente do IDE para criar essa configuração recomendada. Atualmente, esse recurso está disponível apenas no VS Code e não é compatível com os IDEs da JetBrains.

**Para inicializar um projeto CloudFormation:**
+ **Abrir a paleta de comandos**
  + No VS Code, abra a paleta de comandos (`Ctrl+Shift+P` ou `Cmd+Shift+P` em macOS).
  + Escolha **AWS CloudFormation: CFN Init: Initialize Project**.
+ **Escolher um diretório de projeto**
  + Por padrão, o IDE usará seu diretório de trabalho atual.
  + Você pode alterar esse caminho para qualquer pasta em que deseja armazenar seus modelos do CloudFormation.
+ **Selecione seu perfil de credencial da AWS**
  + Você receberá um prompt para escolher um perfil de credencial da AWS. O perfil selecionado será usado para detecção, validações e implantações do ambiente.
+ **Configure o ambiente**
  + Você receberá um prompt para criar ou selecionar um ambiente.
  + Os ambientes definem onde e como seus modelos serão implantados ou validados (por exemplo, desenvolvimento, versão beta ou produção). Você pode usar **AWS CloudFormation: CFN Init: Add Environment** para selecionar ou alterar seu ambiente.
  + Você pode usar **AWS CloudFormation: CFN Init: Remove Environment** para remover o ambiente selecionado.
+ **(Opcional) Importar arquivos de parâmetros**
  + Se você já tiver arquivos de parâmetros existentes, o IDE permitirá importá-los durante a inicialização.
  + O IDE detecta automaticamente arquivos compatíveis e os vincula ao seu projeto para uso na validação e implantação de modelos.
+ **Nomear e finalizar o projeto**
  + Forneça um nome de projeto, como ambiente beta, e conclua a configuração.
  + O IDE cria a estrutura inicial do projeto e o arquivo de configuração para você.

Você pode executar validações, visualizar implantações ou alternar entre ambientes diretamente do IDE.

## Código aberto
<a name="ide-extension-open-source"></a>

O AWS CloudFormation Language Server é de código aberto de acordo com a Licença do Apache-2.0, oferecendo aos clientes total transparência sobre como o diagnóstico de modelos, a validação do esquema e a análise estática são realizados. Isso reduz o atrito de segurança e conformidade para clientes que precisam de visibilidade no nível da origem antes de adotar ferramentas.

A base de código está disponível publicamente no GitHub: [https://github.com/aws-cloudformation/cloudformation-languageserver/](https://github.com/aws-cloudformation/cloudformation-languageserver/).

## Precisa de ajuda?
<a name="ide-extension-need-help"></a>

Experimente a [comunidade do CloudFormation](https://repost.aws/tags/TAm3R3LNU3RfSX9L23YIpo3w) no AWS re:Post.

# Gerar modelos a partir de recursos existentes com o gerador de IaC
<a name="generate-IaC"></a>

Com a infraestrutura do CloudFormation como gerador de código (gerador de IaC), você pode gerar um modelo usando recursos da AWS provisionados na sua conta que ainda não são gerenciados pelo CloudFormation. 

Estes são os benefícios do gerador de IaC:
+ Coloque aplicações inteiras sob o gerenciamento do CloudFormation ou migre-as para uma aplicação do AWS CDK.
+ Gere modelos sem que seja necessário descrever uma propriedade de recurso por propriedade e, depois, traduza-os na sintaxe JSON ou YAML.
+ Use o modelo para replicar recursos em uma nova conta ou região.

O processo de geração de IaC consiste nas seguintes etapas:

1. **Varredura de recursos**: o primeiro passo é iniciar uma verificação dos recursos. Essa varredura abrange toda a região e expira 30 dias. Durante esse período, é possível criar vários modelos com base na mesma verificação.

1. **Criação do modelo**: para criar o modelo, você tem duas opções:
   + Criar um modelo do zero e adicionar os recursos verificados os e recursos relacionados a ele.
   + Usar uma pilha existente do CloudFormation como ponto de partida e adicionar os recursos verificados pela varredura e os recursos relacionados ao modelo.

1. **Importação de recursos**: use o modelo para importar os recursos como uma pilha do CloudFormation ou migrá-los para uma aplicação do AWS CDK.

O recurso de gerador de IaC está disponível em todas as regiões comerciais e oferece suporte a muitos tipos de recursos comuns da AWS. Para obter uma lista completa de recursos suportados, consulte [Suporte a tipos de recursos](resource-import-supported-resources.md).

**Topics**
+ [Considerações](#iac-generator-considerations)
+ [Permissões do IAM necessárias para varrer recursos](#iac-generator-permissions)
+ [Comandos comumente usados para geração, exclusão e gerenciamento de modelos](#iac-generator-commonly-used-commands)
+ [Migrar um modelo para o AWS CDK](#iac-generator-cdk-migrate)
+ [Iniciar uma verificação de recursos com o gerador de IaC do CloudFormation](iac-generator-start-resource-scan.md)
+ [Visualize o resumo da verificação no console do CloudFormation](generate-IaC-view-scan-summary.md)
+ [Criar um modelo do CloudFormation a partir de recursos verificados com o gerador de IaC](iac-generator-create-template-from-scanned-resources.md)
+ [Criar uma pilha do CloudFormation com base nos recursos verificados](iac-generator-create-stack-from-scanned-resources.md)
+ [Resolver propriedades somente gravação](generate-IaC-write-only-properties.md)

## Considerações
<a name="iac-generator-considerations"></a>

É possível gerar modelos JSON ou YAML para recursos da AWS aos quais você tem acesso de leitura. Os modelos do recurso de gerador de IaC preparam recursos de nuvem de forma confiável e rápida, sem que seja necessário descrever um recurso propriedade por propriedade.

A tabela a seguir lista as cotas disponíveis para o recurso de geração de IaC.


| Nome | Varredura completa | Varredura parcial | 
| --- | --- | --- | 
|  Número máximo de usuários que podem ser processados em uma verificação  |  100.000  |  100.000  | 
|  Número de verificações por dia (para verificações com menos de 10.000 recursos)  |  10  |  10  | 
|  Número de verificações por dia (para verificações com mais de 10.000 recursos)  |  1  |  1  | 
|  Número simultâneo de modelos gerados por conta  |  5  |  5  | 
|  Número simultâneo de recursos modelados para uma geração de modelo  |  5  |  5  | 
|  Número total de recursos que podem ser modelados em um modelo  |  500  |  500  | 
|  Número máximo por conta de modelos gerados  |  1.000  |  1.000  | 

**Importante**  
O gerador de IaC só é compatível com recursos da AWS compatíveis com a API do Cloud Control na sua região. Para obter mais informações, consulte [Suporte a tipos de recursos](resource-import-supported-resources.md).

## Permissões do IAM necessárias para varrer recursos
<a name="iac-generator-permissions"></a>

Para varrer recursos com o gerador de IaC, a entidade principal do IAM (usuário, perfil ou grupo) deve ter:
+ Permissões de varredura do CloudFormation
+ Permissões de leitura nos serviços da AWS de destino

O escopo da varredura se limita aos recursos aos quais você tem acesso de leitura. Permissões ausentes não causarão falha na verificação, mas excluirão esses recursos.

Para obter um exemplo de política do IAM que concede permissões para varrer e gerenciar modelos, consulte [Permitir todas as operações do gerador de IaC](security_iam_id-based-policy-examples.md#iam-policy-example-for-iac-generator).

## Comandos comumente usados para geração, exclusão e gerenciamento de modelos
<a name="iac-generator-commonly-used-commands"></a>

Os comandos comumente usados para trabalhar com o gerador de IaC incluem: 
+ [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html) para iniciar uma verificação dos recursos na conta em uma Região da AWS. 
+ [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html) para monitorar o andamento de uma verificação de recursos. 
+ [list-resource-scans](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scans.html) para listar os escaneamentos de recursos em um Região da AWS.
+ [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html) para listar os recursos encontrados durante a verificação de recursos.
+  [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html) para listar os recursos relacionados aos recursos verificados.
+ [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html) para gerar um modelo do CloudFormation de um conjunto de recursos verificados.
+ [update-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-generated-template.html) para atualizar o modelo gerado.
+ [describe-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-generated-template.html) para retornar informações sobre um modelo gerado.
+ [list-generated-templates](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-generated-templates.html) para listar todos os modelos gerados em sua conta e região atual.
+ [delete-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/delete-generated-template.html) para excluir um modelo gerado.

## Migrar um modelo para o AWS CDK
<a name="iac-generator-cdk-migrate"></a>

O AWS Cloud Development Kit (AWS CDK) é um framework de desenvolvimento de software de código aberto que você pode usar para desenvolver, gerenciar e implantar recursos do CloudFormation usando linguagens de programação conhecidas.

A CLI do AWS CDK fornece uma integração com o gerador de IaC. Use o comando `cdk migrate` da CLI do AWS CDK para gerar um modelo do CloudFormation e criar uma aplicação do CDK que contenha os recursos. Depois, é possível usar o AWS CDK para gerenciar os recursos e implantar no CloudFormation.

Para obter mais informações, consulte [Migrar para o AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/migrate.html) no *Guia do desenvolvedor do AWS Cloud Development Kit (AWS CDK)*.

# Iniciar uma verificação de recursos com o gerador de IaC do CloudFormation
<a name="iac-generator-start-resource-scan"></a>

Antes de criar um modelo a partir dos recursos existentes, você deve iniciar uma verificação de recursos para descobrir os recursos atuais e seus relacionamentos.

Você pode iniciar uma verificação de recursos usando uma das seguintes opções. Para usuários iniciantes do gerador de IaC, recomendamos a primeira opção.
+ **Verificar todos os recursos (verificação completa)**: verifica todos os recursos existentes na conta e região atuais. Esse processo de verificação pode levar até 10 minutos para 1.000 recursos.
+ **Verificar recursos específicos (verificação parcial)**: selecione manualmente quais tipos de recursos serão verificados na conta e região atuais. Essa opção fornece um processo de verificação mais rápido e focado, tornando-a ideal para o desenvolvimento iterativo de modelos.

Concluída a verificação, você pode escolher quais recursos e os recursos relacionados devem ser incluídos ao gerar o modelo. Ao usar a verificação parcial, os recursos relacionados apenas estarão disponíveis durante a geração do modelo se:
+ Você os tiver selecionado especificamente antes de iniciar a verificação, ou
+ Tiverem sido necessários para descobrir os tipos de recursos selecionados. 

Por exemplo, se você selecionar `AWS::EKS::Nodegroup` sem selecionar `AWS::EKS::Cluster`, o gerador de IaC incluirá automaticamente os recursos `AWS::EKS::Cluster` na verificação, pois a descoberta do grupo de nós requer a descoberta inicial do cluster. Em todos os outros casos, a verificação incluirá apenas os recursos que você selecionar especificamente.

**nota**  
Antes de continuar, confirme que você tem as permissões necessárias para trabalhar com o gerador de IaC. Para obter mais informações, consulte [Permissões do IAM necessárias para varrer recursos](generate-IaC.md#iac-generator-permissions).

**Topics**
+ [Iniciar uma verificação de recursos (console)](#start-resource-scan-console)
+ [Iniciar uma verificação de recursos (AWS CLI)](#start-resource-scan-cli)

## Iniciar uma verificação de recursos (console)
<a name="start-resource-scan-console"></a>

**Para iniciar uma verificação de todos os tipos de recursos (verificação completa)**

1. Abra a [página do gerador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) do console do CloudFormation.

1. Na barra de navegação na parte superior da tela, escolha a Região da AWS que contém os recursos que devem ser verificados.

1. No painel **Verificações**, escolha **Iniciar nova verificação** e, em seguida, escolha **Verificar todos os recursos**. 

**Para iniciar uma verificação de recursos de tipos de recursos específicos (verificação parcial)**

1. Abra a [página do gerador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) do console do CloudFormation.

1. Na barra de navegação na parte superior da tela, escolha a Região da AWS que contém os recursos que devem ser verificados.

1. No painel **Verificações**, escolha **Iniciar nova verificação** e escolha **Verificar recursos específicos**. 

1. Na caixa de diálogo **Iniciar verificação parcial**, selecione até 100 tipos de recursos e escolha **Iniciar verificação**. 

## Iniciar uma verificação de recursos (AWS CLI)
<a name="start-resource-scan-cli"></a>

**Para iniciar uma verificação de todos os tipos de recursos (verificação completa)**  
Use o seguinte comando [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html). Substitua *us-east-1* pela Região da AWS que contém os recursos a serem verificados.

```
aws cloudformation start-resource-scan --region us-east-1
```

Em caso de êxito, esse comando retornará o ARN da verificação. Anote o ARN na propriedade `ResourceScanId`. Ele será necessário para criar o modelo.

```
{
    "ResourceScanId":
      "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60"
}
```

**Para iniciar uma verificação de recursos de tipos de recursos específicos (verificação parcial)**

1. Use o seguinte comando [cat](https://en.wikipedia.org/wiki/Cat_(Unix)) para armazenar os tipos de recursos que deseja verificar em um arquivo JSON nomeado `config.json` no seu diretório pessoal. A seguir, um exemplo de configuração de verificação que examina instâncias do Amazon EC2, grupos de segurança e todos os recursos do Amazon S3.

   ```
   $ cat > config.json
   [
     {
       "Types":[
         "AWS::EC2::Instance",
         "AWS::EC2::SecurityGroup",
         "AWS::S3::*"
       ]
     }
   ]
   ```

1. Use o comando [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html) com a opção `--scan-filters`, junto com o arquivo `config.json` criado, para iniciar a verificação parcial. Substitua *us-east-1* pela Região da AWS que contém os recursos a serem verificados.

   ```
   aws cloudformation start-resource-scan --scan-filters file://config.json --region us-east-1
   ```

   Em caso de êxito, esse comando retornará o ARN da verificação. Anote o ARN na propriedade `ResourceScanId`. Ele será necessário para criar o modelo.

   ```
   {
       "ResourceScanId":
         "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60"
   }
   ```

**Para monitorar o andamento da verificação de um recurso**  
Use o comando [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html). Na opção `--resource-scan-id`, substitua o ARN de amostra pelo ARN real.

```
aws cloudformation describe-resource-scan --region us-east-1 \
  --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60
```

Se houver êxito, o comando gerará uma saída semelhante à seguinte: 

```
{
    "ResourceScanId": "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60",
    "Status": "COMPLETE",
    "StartTime": "2023-08-21T03:10:38.485000+00:00",
    "EndTime": "2023-08-21T03:20:28.485000+00:00",
    "PercentageCompleted": 100.0,
    "ResourceTypes": [
        "AWS::CloudFront::CachePolicy",
        "AWS::CloudFront::OriginRequestPolicy",
        "AWS::EC2::DHCPOptions",
        "AWS::EC2::InternetGateway",
        "AWS::EC2::KeyPair",
        "AWS::EC2::NetworkAcl",
        "AWS::EC2::NetworkInsightsPath",
        "AWS::EC2::NetworkInterface",
        "AWS::EC2::PlacementGroup",
        "AWS::EC2::Route",
        "AWS::EC2::RouteTable",
        "AWS::EC2::SecurityGroup",
        "AWS::EC2::Subnet",
        "AWS::EC2::SubnetCidrBlock",
        "AWS::EC2::SubnetNetworkAclAssociation",
        "AWS::EC2::SubnetRouteTableAssociation",
        ...
    ],
    "ResourcesRead": 676
}
```

Para uma verificação parcial, a saída será semelhante à seguinte: 

```
{
    "ResourceScanId": "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60",
    "Status": "COMPLETE",
    "StartTime": "2025-03-06T18:24:19.542000+00:00",
    "EndTime": "2025-03-06T18:25:23.142000+00:00",
    "PercentageCompleted": 100.0,
    "ResourceTypes": [
        "AWS::EC2::Instance",
        "AWS::EC2::SecurityGroup",
        "AWS::S3::Bucket",
        "AWS::S3::BucketPolicy"
    ],
    "ResourcesRead": 65,
    "ScanFilters": [
        {
            "Types": [
                "AWS::EC2::Instance",
                "AWS::EC2::SecurityGroup",
                "AWS::S3::*"
            ]
        }
    ]
}
```

Consulte uma descrição dos campos na saída em [DescribeResourceScan](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeResourceScan.html) na *Referência da API do AWS CloudFormation*.

# Visualize o resumo da verificação no console do CloudFormation
<a name="generate-IaC-view-scan-summary"></a>

Depois que a verificação for concluída, você poderá visualizar os recursos encontrados durante a verificação para ajudar a identificar a concentração de recursos em diferentes tipos de produtos.

**Para visualizar informações sobre recursos encontrados durante a verificação**

1. Abra a [página do gerador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) do console do CloudFormation.

1. Na barra de navegação, na parte superior da tela, selecione a Região da AWS que contém a varredura de recursos a ser visualizada.

1. Na página de navegação, escolha **Gerador de IaC**.

1. Em **Detalhamento dos recursos verificados**, você encontrará um detalhamento visual dos recursos verificados por tipo de produto, por exemplo, **Computação** e **Armazenamento**. 

1. Para personalizar o número de tipos de produtos exibidos, escolha **Filtrar dados exibidos**. Isso ajuda você a personalizar a visualização para se concentrar nos tipos de produtos nos quais tem mais interesse.

1. No lado direito da página está o painel **Detalhes resumo da verificação**. Para abrir o painel, selecione o ícone de **painel aberto**.

![\[O console do gerador de IaC fornece uma análise visual dos recursos verificados.\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/IaC-generator-scan-summary.png)


# Criar um modelo do CloudFormation a partir de recursos verificados com o gerador de IaC
<a name="iac-generator-create-template-from-scanned-resources"></a>

Este tópico explica como criar um modelo a partir de recursos que foram verificados pelo recurso de gerador de IaC. 

## Criar um modelo com base nos recursos verificados (console)
<a name="create-template-from-scanned-resources-console"></a>

**Para criar um modelo de pilha com recursos verificados**

1. Abra a [página do gerador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) do console do CloudFormation.

1. Na barra de navegação na parte superior da tela, escolha a Região da AWS que contém os recursos verificados.

1. No painel **Modelos**, escolha **Criar modelo**. 

1. Selecione **Iniciar de um novo modelo**.

   1. Em **Nome do modelo**, forneça um nome para o modelo.

   1. (Opcional) Configure sua **Política de exclusão** e a **Política de substituição de atualização**.

   1. Escolha **Próximo** para adicionar recursos encontrados pela varredura ao modelo.

1. Em **Adicionar recursos verificados**, navegue pela lista de recursos verificados e selecione os recursos que deseja adicionar ao modelo. É possível filtrar os recursos por identificador, tipo de recurso ou tags. Os filtros são mutuamente inclusivos.

1. Após adicionar todos os recursos necessários para o modelo, escolha **Próximo** para sair da página **Adicionar recursos verificados** e prossiga para a página **Adicionar recursos relacionados**.

1. Revise uma lista recomendada de recursos relacionados. Recursos relacionados, como instâncias do Amazon EC2 e grupos de segurança, são interdependentes e normalmente pertencem à mesma workload. Selecione os usuários relacionados que deseja incluir no modelo gerado.
**nota**  
Sugerimos adicionar todos os recursos relacionados a esse modelo.

1. Revise os detalhes do modelo, recursos encontrados pela varredura e recursos relacionados. 

1. Escolha **Criar modelo** para sair da página **Revisar e criar** e criar o modelo.

## Criar um modelo com base nos recursos verificados (AWS CLI)
<a name="create-template-from-scanned-resources-cli"></a>

**Para criar um modelo de pilha com recursos verificados**

1. Use o comando [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html) para listar os recursos encontrados pela verificação, especificando a opção `--resource-identifier` para limitar a saída, se assim desejar. Na opção `--resource-scan-id`, substitua o ARN de amostra pelo ARN real.

   ```
   aws cloudformation list-resource-scan-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resource-identifier MyApp
   ```

   Este é um exemplo de resposta, onde `ManagedByStack` indica se o CloudFormation já está gerenciando o recurso. Copie a saída. Você precisa dele para a próxima etapa.

   ```
   {
       "Resources": [
           {
               "ResourceType": "AWS::EKS::Cluster",
               "ResourceIdentifier": {
                   "ClusterName": "MyAppClusterName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
               "ResourceIdentifier": {
                   "AutoScalingGroupName": "MyAppASGName"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   Consulte uma descrição dos campos na saída em [ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html) na *Referência de API do AWS CloudFormation*.

1. Use o comando `cat` para armazenar os tipos e identificadores de recursos em um arquivo JSON chamado `resources.json` em seu diretório inicial. O exemplo a seguir é um JSON baseado na saída do exemplo da etapa anterior.

   ```
   $ cat > resources.json
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       }
   ]
   ```

1. Use o comando [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html), juntamente com o arquivo `resources.json` que você criou, para listar os recursos relacionados aos recursos verificados.

   ```
   aws cloudformation list-resource-scan-related-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resources file://resources.json
   ```

   Este é um exemplo de resposta, onde `ManagedByStack` indica se o CloudFormation já está gerenciando o recurso. Adicione esses recursos ao arquivo JSON criado na etapa anterior. Ele será necessário para criar o modelo.

   ```
   {
       "RelatedResources": [
           {
               "ResourceType": "AWS::EKS::Nodegroup",
               "ResourceIdentifier": {
                   "NodegroupName": "MyAppNodegroupName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::IAM::Role",
               "ResourceIdentifier": {
                   "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   Consulte uma descrição dos campos na saída em [ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html) na *Referência de API do AWS CloudFormation*.
**nota**  
A lista de entrada de recursos não pode exceder um tamanho de 100. Para listar recursos relacionados para mais de 100 recursos, execute o comando **list-resource-scan-related-resources** em lotes de 100 e consolide os resultados.  
Tenha em mente que a saída pode conter recursos duplicados na lista.

1. Use o comando [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html) para criar um novo modelo de pilha da seguinte forma, com as seguintes modificações:
   + Substitua `us-east-1` pelo Região da AWS que contém os recursos verificados.
   + Substitua `MyTemplate` pelo nome do modelo a ser criado.

   ```
   aws cloudformation create-generated-template --region us-east-1 \
    --generated-template-name MyTemplate \
     --resources file://resources.json
   ```

   Veja a seguir um exemplo de arquivo `resources.json`.

   ```
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "LogicalResourceId":"MyCluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "LogicalResourceId":"MyASG",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       },
       {
           "ResourceType": "AWS::EKS::Nodegroup",
           "LogicalResourceId":"MyNodegroup",
           "ResourceIdentifier": {
               "NodegroupName": "MyAppNodegroupName"
           }
       },
       {
           "ResourceType": "AWS::IAM::Role",
           "LogicalResourceId":"MyRole",
           "ResourceIdentifier": {
               "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
           }
       }
   ]
   ```

   Em caso de êxito, o comando retornará a resposta a seguir.

   ```
   {
     "Arn":
       "arn:aws:cloudformation:region:account-id:generatedtemplate/7fc8512c-d8cb-4e02-b266-d39c48344e48",
     "Name": "MyTemplate"
   }
   ```

# Criar uma pilha do CloudFormation com base nos recursos verificados
<a name="iac-generator-create-stack-from-scanned-resources"></a>

Após criar o modelo, você poderá visualizar o modelo gerado com o Infrastructure Composer antes de criar a pilha e importar os recursos verificados. Isso ajuda você a visualizar a arquitetura completa da aplicação com os recursos e seus relacionamentos. Para obter mais informações sobre o Infrastructure Composer, consulte [Crie modelos visualmente com o Infrastructure Composer](infrastructure-composer-for-cloudformation.md)

**Para criar a pilha e importar os recursos verificados**

1. Abra a [página do gerador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) do console do CloudFormation.

1. Na barra de navegação, na parte superior da tela, escolha a Região da AWS do modelo.

1. Escolha a guia **Modelos** e depois escolha o nome do modelo para ver mais informações.

1. Na guia **Definição do modelo**, na parte superior da seção **Modelo**, você pode alternar o modelo da sintaxe YAML para a JSON com base na sua preferência. 

1. Revise os detalhes do modelo para garantir que tudo esteja configurado corretamente. Para facilitar a análise e a compreensão do modelo, você pode alternar da visualização de código padrão para uma visualização gráfica da infraestrutura descrita no modelo usando o Infrastructure Composer. Para fazer isso, em **Modelo**, escolha **Tela** em vez de **Modelo**.

    **Ações de tela** 
   + Para focar nos detalhes de um recurso específico no seu modelo, clique duas vezes em um cartão para abrir o painel **Propriedades do recurso**.
   + Para organizar e dispor visualmente os cartões na tela, escolha **Organizar** no canto superior esquerdo da tela. 
   + Para ampliar e reduzir a tela, use os controles de zoom no canto inferior direito da tela. 

1. Para visualizar um recurso específico no console, escolha a guia **Recursos do modelo** e, em seguida, escolha a ID física do recurso que você deseja examinar. Isso leva você ao console desse recurso específico. Você também pode adicionar, remover e ressincronizar recursos na definição do modelo na guia **Recursos do modelo**. 

1. Na guia **Definição do modelo**, o gerador de IaC pode emitir avisos sobre recursos que contêm propriedades somente gravação. Depois de revisar os avisos, é possível baixar o modelo gerado e fazer as alterações necessárias. Para obter mais informações, consulte [Resolver propriedades somente gravação](generate-IaC-write-only-properties.md).

1. Quando estiver satisfeito com a definição do modelo, na guia **Definição do modelo**, selecione **Importar para pilha** e, em seguida, selecione **Avançar**.

1. No painel **Especificar pilha** da página **Especificar detalhes da pilha**, insira o nome da pilha e escolha **Próximo**.

1. Revise e insira os parâmetros da pilha. Escolha **Próximo**.

1. Revise suas opções na página **Revisar alterações** e escolha **Próximo**.

1. Revise seus detalhes na página **Revisar e importar** e escolha **Importar recursos**. 

# Resolver propriedades somente gravação
<a name="generate-IaC-write-only-properties"></a>

Com o gerador de IaC do CloudFormation, é possível gerar um modelo usando recursos provisionados em sua conta que ainda não são gerenciados pelo CloudFormation. No entanto, certas propriedades de recursos são designadas como *somente gravação*, o que significa que elas podem ser gravadas, mas não podem ser lidas pelo CloudFormation, por exemplo, uma senha de banco de dados. 

Ao gerar modelos do CloudFormation com base em recursos existentes, as propriedades somente gravação representam um desafio. Na maioria dos casos, o CloudFormation converte essas propriedades em parâmetros no modelo gerado. Isso permite a você inserir as propriedades como valores de parâmetros durante as operações de importação. No entanto, há cenários em que essa conversão não é possível, e o CloudFormation trata esses casos de forma diferente.

## Propriedades mutuamente excludentes
<a name="write-only-mutually-exclusive-properties"></a>

Alguns recursos têm vários conjuntos de propriedades mutuamente excludentes, e pelo menos alguns deles são somente gravação. Nesses casos, o gerador de IaC não pode determinar qual conjunto de propriedades excludentes foi aplicado ao recurso durante a criação. Por exemplo, você pode fornecer o código para um [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) usando um desses conjuntos de propriedades. 
+ `Code/S3Bucket`, `Code/S3Key` e, opcionalmente, `Code/S3ObjectVersion`
+ `Code/ImageUri`
+ `Code/ZipFile`

Todas essas propriedades são somente gravação. O gerador de IaC seleciona um dos conjuntos de propriedades exclusivos e os adiciona ao modelo gerado. Parâmetros são adicionados para cada uma das propriedades somente gravação. Os nomes dos parâmetros incluem `OneOf` e as descrições dos parâmetros indicam que a propriedade correspondente pode ser substituída por outras propriedades exclusivas. O gerador de IaC define um tipo de aviso de `MUTUALLY_EXCLUSIVE_PROPERTIES` para as propriedades incluídas.

## Tipos mutuamente excludentes
<a name="write-only-mutually-exclusive-types"></a>

Em alguns casos, uma propriedade somente gravação pode ser de vários tipos de dados. Por exemplo, a propriedade `Body` de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html) pode ser um `object` ou um `string`. Quando esse é o caso, o gerador de IaC inclui a propriedade no modelo gerado usando o tipo de `string` e define um tipo de alerta de `MUTUALLY_EXCLUSIVE_TYPES`.

## Propriedades do Array
<a name="write-only-array-properties"></a>

Se uma propriedade somente gravação tiver um tipo de `array`, o gerador de IaC não poderá incluí-la no modelo gerado porque os parâmetros só podem ser valores escalares. Nesse caso, a propriedade é omitida do modelo e um tipo de aviso de `UNSUPPORTED_PROPERTIES` é definido.

## Propriedades opcionais
<a name="write-only-optional-properties"></a>

Para propriedades somente gravação opcionais, o gerador de IaC não consegue detectar se a propriedade foi usada ao configurar o recurso. Nesse caso, a propriedade é omitida do modelo gerado e um tipo de aviso de `UNSUPPORTED_PROPERTIES` é definido.

## Avisos e próximas etapas
<a name="write-only-properties-warnings-and-next-steps"></a>

Para determinar quais propriedades são somente de gravação, é preciso observar os avisos retornados pelo console do gerador de IaC. A [Referência de propriedades e recursos da AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html) não indica se uma propriedade é somente gravação ou se é compatível com vários tipos.

Como alternativa, você pode ver quais propriedades são somente para gravação nos esquemas do provedor de recursos. Para baixar os esquemas do provedor de recursos, consulte os [Esquemas do provedor de recursos do CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html). 

**Para resolver problemas com propriedades somente para gravação**

1. Abra a [página do gerador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) do console do CloudFormation.

1. Na barra de navegação, na parte superior da tela, escolha a Região da AWS do modelo.

1. Escolha a guia **Modelos** e, em seguida, escolha o nome do modelo que você criou.

1. Na guia **Definição do modelo**, quando o modelo gerado inclui recursos com propriedades somente de gravação, o console do gerador de IaC exibe um aviso com um resumo dos tipos de problemas. Por exemplo:  
![\[Aviso do console do gerador de IaC sobre propriedades somente gravação no modelo gerado\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-warning.png)

1. Selecione **Exibir detalhes do aviso** para obter mais detalhes. Os recursos com propriedades somente gravação são identificados pelo ID lógico usado no modelo gerado e no tipo de recurso.

   Use a lista de avisos para identificar recursos com propriedades somente gravação e examine cada recurso para determinar quais alterações (se houver) precisam ser feitas no modelo gerado.  
![\[Aviso detalhados do console do gerador de IaC sobre propriedades somente gravação no modelo gerado\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-resource-warning.png)

1. Caso o modelo precise ser atualizado para resolver problemas com propriedades somente de gravação, faça o seguinte: 

   1. Selecione **Download** para baixar uma cópia do modelo.

   1. Edite o modelo.

   1. Depois que as alterações forem concluídas, você poderá escolher o botão **Importar modelo editado** para continuar o processo de importação.

# Como resolver problemas com propriedades somente gravação em recursos AWS::ApiGateway::RestAPI
<a name="generate-IaC-apigateway-restapi"></a>

Este tópico explica como resolver problemas com propriedades somente gravação em recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html) ao usar o gerador de IaC.

## Problema
<a name="apigateway-restapi-write-only-properties-issue"></a>

Quando um modelo gerado contém recursos `AWS::ApiGateway::RestApi`, avisos são gerados para informar que as propriedades `Body`, `BodyS3Location` e `CloneFrom` são identificadas como `UNSUPPORTED_PROPERTIES`. Isso ocorre porque essas são propriedades opcionais somente gravação. O gerador de IaC não sabe se essas propriedades já foram aplicadas ao recurso. Portanto, ele omite essas propriedades no modelo gerado.

## Resolução
<a name="apigateway-restapi-write-only-properties-resolution"></a>

Para definir a propriedade `Body` da API REST, atualize o modelo gerado.

1. Use a ação de API [https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html](https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html) do Amazon API Gateway para baixar a API. Por exemplo, usando o comando [https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html) da AWS CLI. Para obter mais informações, consulte [Exportar uma API REST do API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html) no *Guia do desenvolvedor do API Gateway*.

1. Recupere a `Body` propriedade da resposta da ação da API `GetExport`. Carregue-a para um bucket do Amazon S3.

1. Baixe o modelo gerado.

1. Adicione as propriedades `BodyS3Location/Bucket` e `BodyS3Location/Key` ao modelo, especificando o nome do bucket e a chave em que `Body` está armazenado.

1. Abra o modelo gerado no console do gerador de IaC e escolha **Importar modelo editado**.

# Como resolver problemas com propriedades somente gravação em recursos AWS::Lambda::Function
<a name="generate-IaC-lambda-function"></a>

Este tópico explica como resolver problemas com propriedades somente gravação em recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) ao usar o gerador de IaC.

## Problema
<a name="lambda-function-mutually-exclusive-properties-issue"></a>

O recurso `AWS::Lambda::Function` tem três conjuntos de propriedades mutuamente excludentes para especificar o código Lambda:
+ As propriedades `Code/S3Bucket` e `Code/S3Key`, e opcionalmente, a propriedade `Code/S3ObjectVersion`
+ `Code/ImageUri`a propriedade 
+ `Code/ZipFile`a propriedade 

Somente um desses conjuntos pode ser usado para um determinado recurso `AWS::Lambda::Function`.

O gerador de IaC não pode determinar qual conjunto de propriedades somente gravação exclusivas foi usado para criar ou atualizar o recurso. Como resultado, ele inclui somente o primeiro conjunto de propriedades no modelo gerado. As propriedades `Code/ImageUri` e `Code/ZipFile` são omitidas. 

Além disso, o gerador de IaC emite os seguintes avisos:
+ **`MUTUALLY_EXCLUSIVE_PROPERTIES`**: avisa que `Code/S3Bucket` e `Code/S3Key` são identificadas como propriedades mutuamente excludentes.
+ **`UNSUPPORTED_PROPERTIES`**: avisa que não há suporte à propriedade `Code/S3ObjectVersion`.

Para incluir recursos `AWS::Lambda::Function` em um modelo gerado, você deve baixar e atualizar o modelo com as propriedades de código corretas.

## Resolução
<a name="lambda-function-mutually-exclusive-properties-resolution"></a>

**Se você armazenar seu código do Lambda em um bucket do Amazon S3 e não usar a propriedade `S3ObjectVersion`**, poderá importar o modelo gerado sem nenhuma modificação. O gerador de IaC solicitará o bucket e a chave do Amazon S3 como parâmetros de modelo durante a operação de importação.

****Se você armazenar seu código do Lambda como um repositório do Amazon ECR**, poderá atualizar seu modelo usando as seguintes instruções:**

1. Baixe o modelo gerado.

1. Remova as propriedades e os parâmetros correspondentes das propriedades `Code/S3Bucket` e `Code/S3Key` do modelo gerado.

1. Substitua as propriedades removidas no modelo gerado pela propriedade `Code/ImageUri`, especificando o URL do repositório do Amazon ECR.

1. Abra o modelo gerado no console do gerador de IaC e escolha o botão **Importar modelo editado**.

****Se você armazenar seu código do Lambda em um arquivo ZIP**, poderá atualizar seu modelo usando as seguintes instruções:**

1. Baixe o modelo gerado.

1. Remova as propriedades e os parâmetros correspondentes das propriedades `Code/S3Bucket` e `Code/S3Key` do modelo gerado.

1. Substitua as propriedades removidas no modelo gerado pela propriedade `Code/ZipFile`.

1. Abra o modelo gerado no console do gerador de IaC e escolha o botão **Importar modelo editado**.

****Se você não tiver uma cópia do seu código do Lambda**, poderá atualizar seu modelo usando as seguintes instruções:**

1. Use a ação da API [https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) do AWS Lambda (por exemplo, usando o comando [https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html) da AWS CLI).

1. Na resposta, o parâmetro `RepositoryType` será `S3` se o código estiver em um bucket do Amazon S3 ou `ECR` se o código estiver em um repositório do Amazon ECR.

1. Na resposta, o parâmetro `Location` contém um URL pré-assinado que pode ser usado para baixar o pacote de implantação por 10 minutos. Baixe o código.

1. Carregue o código para um bucket do Amazon S3.

1. Execute uma operação de importação com o modelo gerado e forneça o nome do bucket e a chave como valores de parâmetros.

# Obter valores armazenados em outros serviços usando referências dinâmicas
<a name="dynamic-references"></a>

As referências dinâmicas fornecem uma maneira conveniente de especificar valores externos armazenados e gerenciados em outros serviços e dissociar informações confidenciais de seus modelos de infraestrutura como código. O CloudFormation recupera o valor da referência especificada quando necessário durante operações de pilha e conjunto de alterações.

Com as referências dinâmicas, é possível:
+ **Usar strings seguras**: para dados confidenciais, sempre use parâmetros de strings seguros no AWS Systems Manager Parameter Store ou segredos no AWS Secrets Manager para garantir que seus dados sejam criptografados em repouso.
+ **Limitar o acesso**: restrinja o acesso aos parâmetros do Parameter Store ou aos segredos do Secrets Manager somente a entidades principais e perfis autorizados.
+ **Faça a rotação das credenciais**: faça regularmente a rotação dos seus dados confidenciais armazenados no Parameter Store ou no Secrets Manager para manter um alto nível de segurança.
+ **Automatize a rotação**: use os recursos de rotação automática do Secrets Manager para atualizar e distribuir periodicamente seus dados confidenciais em seus ambientes e aplicações.

## Considerações gerais
<a name="dynamic-references-considerations"></a>

Antes de especificar referências dinâmicas em seus modelos do CloudFormation, leve em conta as seguintes considerações gerais:
+ Evite referências dinâmicas, ou dados confidenciais, nas propriedades do recurso que fazem parte do identificador primário de um recurso. O CloudFormation pode usar o valor em texto simples real no identificador do recurso primário, o que pode ser um risco à segurança. Esse ID de recurso pode aparecer em quaisquer saídas ou destinos derivados.

  Para determinar quais propriedades de recursos compreendem o identificador primário de um tipo de recurso, consulte a documentação de referência de recursos desse recurso na [Referência de tipos de propriedades e recursos da AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html). Na seção **Return values** (Valores de retorno), o valor de retorno da função `Ref` representa as propriedades do recurso que compõem o identificador primário do tipo de recurso.
+ Você pode incluir até 60 referências dinâmicas em um modelo de pilha.
+ Se você estiver usando transformações (como `AWS::Include` ou `AWS::Serverless`), o CloudFormation não resolverá referências dinâmicas antes de aplicar a transformação. Em vez disso, ele passa a string literal da referência dinâmica para a transformação e resolve as referências quando você executa o conjunto de alterações usando esse modelo.
+ Referências dinâmicas não podem ser usadas para valores seguros (como os armazenados no Parameter Store ou no Secrets Manager) em recursos personalizados. 
+ Também não há suporte para referências dinâmicas em metadados `AWS::CloudFormation::Init` e propriedades `UserData` do Amazon EC2.
+ Não crie uma referência dinâmica que termine com uma barra invertida (\$1). O CloudFormation não consegue resolver essas referências, o que fará com que as operações de pilha falhem.

Os tópicos a seguir fornecem informações e outras considerações sobre o uso de referências dinâmicas.

**Topics**
+ [Considerações gerais](#dynamic-references-considerations)
+ [Obter um valor em texto simples do Systems Manager Parameter Store](dynamic-references-ssm.md)
+ [Obter um valor de string segura do Systems Manager Parameter Store](dynamic-references-ssm-secure-strings.md)
+ [Obtenha um segredo ou valor secreto do Secrets Manager](dynamic-references-secretsmanager.md)

# Obter um valor em texto simples do Systems Manager Parameter Store
<a name="dynamic-references-ssm"></a>

Ao criar um modelo do CloudFormation, talvez você queira usar valores de texto simples armazenados no Parameter Store. O Parameter Store é um recurso do AWS Systems Manager. Para ver uma introdução ao Parameter Store, consulte [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) no *Guia do usuário do AWS Systems Manager*. 

Para usar um valor de texto simples do Parameter Store em seu modelo, você usa uma referência dinâmica `ssm`. Essa referência permite acessar valores de parâmetros do tipo `String` ou `StringList` no Parameter Store. 

Para verificar qual versão de uma referência dinâmica `ssm` será usada em uma operação de pilha, crie um conjunto de alterações para a operação de pilha. Em seguida, revise o modelo processado na guia **Modelo**. Para obter mais informações, consulte [Criar um conjunto de alterações para uma pilha do CloudFormation](using-cfn-updating-stacks-changesets-create.md).

Ao usar referências dinâmicas do `ssm`, há algumas considerações importantes que você deve ter em mente:
+ O CloudFormation não oferece suporte à detecção de desvio em referências dinâmicas. Para referências dinâmicas `ssm` em que você não especificou a versão do parâmetro, recomendamos que, se você atualizar a versão do parâmetro no Systems Manager, também execute uma operação de atualização de pilha em todas as pilhas que incluam a referência dinâmica `ssm` a fim de obter a versão mais recente do parâmetro.
+ Para usar uma referência dinâmica `ssm` na seção `Parameters` do modelo do CloudFormation, é necessário incluir um número de versão. O CloudFormation não permite que você faça referência a um valor do Parameter Store sem um número de versão nessa seção. Como alternativa, é possível definir seu parâmetro como um tipo de parâmetro do Systems Manager em seu modelo. Ao fazer isso, você pode especificar uma chave de parâmetros do Systems Manager como o valor padrão para seu parâmetro. Em seguida, o CloudFormation recuperará a versão mais recente do valor do parâmetro no Parameter Store sem que você precise especificar um número de versão. Isso pode tornar seus modelos mais simples e fáceis de manter. Para obter mais informações, consulte [Especificar recursos existentes no runtime com tipos de parâmetros fornecidos pelo CloudFormation](cloudformation-supplied-parameter-types.md).
+ Para recursos personalizados, o CloudFormation resolve referências dinâmicas `ssm` antes de enviar a solicitação ao recurso personalizado.
+ O CloudFormation não oferece suporte ao uso de referências dinâmicas para fazer referência a um parâmetro compartilhado de outra Conta da AWS.
+ O CloudFormation não oferece suporte ao uso de rótulos de parâmetros do Systems Manager em referências dinâmicas.

## Permissões
<a name="dynamic-references-ssm-permissions"></a>

Para especificar um parâmetro armazenado no Systems Manager Parameter Store, é necessário ter permissão para chamar [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html) para o parâmetro especificado. Para saber como criar políticas do IAM que fornecem acesso a parâmetros específicos do Systems Manager, consulte [Restringir o acesso a parâmetros do Systems Manager usando políticas do IAM](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html) no *Guia do usuário do AWS Systems Manager*.

## Padrão de referência
<a name="dynamic-references-ssm-pattern"></a>

Para fazer referência a um valor de texto simples armazenado no Parameter Store do Systems Manager em seu modelo do CloudFormation, use este padrão de referência `ssm`.

```
{{resolve:ssm:parameter-name:version}}
```

Sua referência deve aderir ao seguinte padrão de expressão regular para parameter-name e version:

```
{{resolve:ssm:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
O nome do parâmetro no Parameter Store. O nome do parâmetro faz distinção entre maiúsculas e minúsculas.  
Obrigatório.

`version`  
Um número inteiro que especifica a versão do parâmetro a ser usada. Se você não especificar a versão exata, o CloudFormation usará a versão mais recente do parâmetro sempre que você criar ou atualizar a pilha. Para obter mais informações, consulte [Trabalhar com versões de parâmetros](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html) no *Guia do usuário do AWS Systems Manager*  
Opcional.

## Exemplos
<a name="dynamic-references-ssm-examples"></a>

**Topics**
+ [Parâmetro do ID da AMI pública](#dynamic-references-ssm-public-ami-example)
+ [Parâmetro do ID da AMI personalizado](#dynamic-references-ssm-custom-ami-example)

### Parâmetro do ID da AMI pública
<a name="dynamic-references-ssm-public-ami-example"></a>

O exemplo a seguir cria uma instância do EC2 que faz referência a um parâmetro da AMI pública. A referência dinâmica recupera o ID da AMI do Amazon Linux 2023 mais recente do parâmetro público. Para obter mais informações sobre parâmetros públicos, consulte [Descobrir parâmetros públicos no Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) no *Guia do usuário do AWS Systems Manager*.

#### JSON
<a name="dynamic-references-ssm-public-ami-example.json"></a>

```
{
    "Resources": {
        "MyInstance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
                "InstanceType": "t2.micro"
            }
        }
    }
}
```

#### YAML
<a name="dynamic-references-ssm-public-ami-example.yaml"></a>

```
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      InstanceType: t2.micro
```

### Parâmetro do ID da AMI personalizado
<a name="dynamic-references-ssm-custom-ami-example"></a>

O exemplo a seguir cria um modelo de execução do EC2 que faz referência a um ID de AMI personalizada armazenada no Parameter Store. A referência dinâmica recupera o ID da AMI para a versão *`2`* do parâmetro `golden-ami` no momento em que uma instância é executada a partir do modelo de execução.

#### JSON
<a name="dynamic-references-ssm-custom-ami-example.json"></a>

```
{
    "Resources": {
        "MyLaunchTemplate": {
            "Type": "AWS::EC2::LaunchTemplate",
            "Properties": {
                "LaunchTemplateName": {
                    "Fn::Sub": "${AWS::StackName}-launch-template"
                },
                "LaunchTemplateData": {
                    "ImageId": "{{resolve:ssm:golden-ami:2}}",
                    "InstanceType": "t2.micro"
                }
            }
        }
    }
}
```

#### YAML
<a name="dynamic-references-ssm-custom-ami-example.yaml"></a>

```
Resources:
  MyLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: '{{resolve:ssm:golden-ami:2}}'
        InstanceType: t2.micro
```

# Obter um valor de string segura do Systems Manager Parameter Store
<a name="dynamic-references-ssm-secure-strings"></a>

No CloudFormation, é possível usar dados confidenciais, como senhas ou chaves de licença, sem expô-los diretamente em seus modelos, armazenando os dados confidenciais como uma "string segura" no AWS Systems Manager Parameter Store. Para ver uma introdução ao Parameter Store, consulte [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) no *Guia do usuário do AWS Systems Manager*.

Para usar uma string segura do Parameter Store em seu modelo, use uma referência dinâmico `ssm-secure`. O CloudFormation nunca armazena o valor real do parâmetro. Em vez disso, ele armazena apenas a referência dinâmica literal, que contém o nome do parâmetro de texto simples da string segura. 

Durante a criação ou as atualizações da pilha, o CloudFormation acessa o valor da string segura conforme necessário, sem expor o valor real. As strings seguras só podem ser usadas para propriedades de recursos que oferecem suporte ao padrão de referência dinâmica `ssm-secure`. Para obter mais informações, consulte [Recursos que oferecem suporte a padrões de parâmetros dinâmicos para strings seguras](#template-parameters-dynamic-patterns-resources).

O CloudFormation não retorna o valor real do parâmetro para strings seguras em nenhuma chamada de API. Ele retorna apenas a referência dinâmica literal. Ao comparar alterações usando conjuntos de alterações, o CloudFormation compara somente a string de referência dinâmica literal. Ele não resolve nem compara os valores reais das strings seguras.

Ao usar referências dinâmicas do `ssm-secure`, há algumas considerações importantes que você deve ter em mente:
+ O CloudFormation não pode acessar valores do Parameter Store de outras Contas da AWS.
+ O CloudFormation não oferece suporte ao uso de rótulos de parâmetros do Systems Manager ou de parâmetros públicos em referências dinâmicas.
+ O Systems Manager não oferece suporte a strings seguras nas regiões `cn-north-1` e `cn-northwest-1`.
+ No momento, as referências dinâmicas para valores seguros, como `ssm-secure`, não são compatíveis com recursos personalizados.
+ Se o CloudFormation precisar reverter uma atualização de pilha e a versão anteriormente especificada de um parâmetro de string segura não estiver mais disponível, essa operação de reversão falhará. Nesses casos, você tem duas opções:
  + Use `CONTINUE_UPDATE_ROLLBACK` para ignorar o recurso.
  + Recrie o parâmetro de string segura no Repositório de parâmetros do Systems Manager e atualize-o até que a versão do parâmetro atinja a versão usada no modelo. Em seguida, use `CONTINUE_UPDATE_ROLLBACK` sem ignorar o recurso.

## Recursos que oferecem suporte a padrões de parâmetros dinâmicos para strings seguras
<a name="template-parameters-dynamic-patterns-resources"></a>

Os recursos que oferecem suporte ao padrão de referência dinâmica `ssm-secure` incluem:


| Recurso | Tipo de propriedade | Propriedades | 
| --- | --- | --- | 
| [AWS::DirectoryService::MicrosoftAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html) |  | `Password` | 
| [AWS::DirectoryService::SimpleAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-simplead.html) |  | `Password` | 
| [AWS::ElastiCache::ReplicationGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticache-replicationgroup.html) |  | `AuthToken` | 
| [AWS::IAM::User](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) | [LoginProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) | `Password` | 
| [AWS::KinesisFirehose::DeliveryStream](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-kinesisfirehose-deliverystream.html) | [RedshiftDestinationConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html) | `Password` | 
| [AWS::OpsWorks::App](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-app.html) | [Fonte](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-app-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [CustomCookbooksSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [RdsDbInstances](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-rdsdbinstance.html) | `DbPassword` | 
| [AWS::RDS::DBCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html) |  | `MasterUserPassword` | 
| [AWS::RDS::DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) |  | `MasterUserPassword`  | 
| [AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html) |  | `MasterUserPassword` | 

## Padrão de referência
<a name="dynamic-references-ssm-secure-pattern"></a>

Para fazer referência a um valor string segura do Parameter Store do Systems Manager em seu modelo do CloudFormation, use este padrão de referência `ssm-secure`.

```
{{resolve:ssm-secure:parameter-name:version}}
```

Sua referência deve aderir ao seguinte padrão de expressão regular para parameter-name e version:

```
{{resolve:ssm-secure:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
O nome do parâmetro no Parameter Store. O nome do parâmetro faz distinção entre maiúsculas e minúsculas.  
Obrigatório.

`version`  
Um número inteiro que especifica a versão do parâmetro a ser usada. Se você não especificar a versão exata, o CloudFormation usará a versão mais recente do parâmetro sempre que você criar ou atualizar a pilha. Para obter mais informações, consulte [Trabalhar com versões de parâmetros](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html) no *Guia do usuário do AWS Systems Manager*  
Opcional.

## Exemplo
<a name="dynamic-references-ssm-secure-example"></a>

O exemplo a seguir usa uma referência dinâmica `ssm-secure` para definir a senha de um usuário do IAM como uma string segura armazenada no Parameter Store. Conforme especificado, CloudFormation usará a versão *`10`* do parâmetro `IAMUserPassword` para operações de pilha e conjunto de alterações.

### JSON
<a name="dynamic-references-ssm-secure-example.json"></a>

```
  "MyIAMUser": {
    "Type": "AWS::IAM::User",
    "Properties": {
      "UserName": "MyUserName",
      "LoginProfile": {
        "Password": "{{resolve:ssm-secure:IAMUserPassword:10}}"
      }
    }
  }
```

### YAML
<a name="dynamic-references-ssm-secure-example.yaml"></a>

```
  MyIAMUser:
    Type: AWS::IAM::User
    Properties:
      UserName: 'MyUserName'
      LoginProfile:
        Password: '{{resolve:ssm-secure:IAMUserPassword:10}}'
```

# Obtenha um segredo ou valor secreto do Secrets Manager
<a name="dynamic-references-secretsmanager"></a>

O Secrets Manager é um serviço que permite armazenar e gerenciar segredos com segurança, como credenciais de banco de dados, senhas e chaves de API de terceiros. Usando o Secrets Manager, você pode armazenar e controlar o acesso a esses segredos centralmente, para que você possa substituir credenciais codificadas no seu código (incluindo senhas) por uma chamada de API para o Secrets Manager recuperar o segredo de forma programática. Para obter mais informações, consulte [O que é o AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) no * Guia do usuário do AWS Secrets Manager*.

Use referências dinâmicas `secretsmanager` para usar todos os segredos ou valores secretos armazenados no Secrets Manager em seus modelos do CloudFormation.

## Práticas recomendadas
<a name="dynamic-references-secretsmanager-best-practices"></a>

Siga estas práticas recomendadas ao usar as referências dinâmicas do Secrets Manager em seus modelos do CloudFormation:
+ **Use referências sem versão para seus modelos do CloudFormation**: armazene credenciais no Secrets Manager e use referências dinâmicas sem especificar parâmetros `version-stage` ou `version-id` para suportar fluxos de trabalho adequados de rodízio de segredos.
+ **Aproveite o rodízio automático**: use o atributo de rodízio automático do Secrets Manager com referências dinâmicas sem versão para gerenciamento de credenciais. Isso garante que suas credenciais sejam atualizadas regularmente sem exigir alterações no modelo. Para ter mais informações, consulte [Alternar segredos do AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html).
+ **Use referências versionadas com moderação**: especifique somente parâmetros explícitos `version-stage` ou `version-id` para cenários específicos, como situações de teste ou reversão.

## Considerações
<a name="dynamic-references-secretsmanager-considerations"></a>

Ao usar referências dinâmicas do `secretsmanager`, existem considerações importantes que devem ser consideradas:
+ O CloudFormation não rastreia qual versão de um segredo foi usada em implantações anteriores. Planeje cuidadosamente sua estratégia de gerenciamento de segredo antes de implementar referências dinâmicas. Use referências sem versão quando possível para aproveitar o rodízio automático de segredos. Monitore e valide as atualizações de recursos ao fazer alterações nas configurações de referência dinâmica, como ao fazer a transição de referências dinâmicas não versionadas para referências dinâmicas versionadas e vice-versa.
+ Atualizar somente o valor do segredo no Secrets Manager não faz com que o CloudFormation recupere automaticamente o novo valor. O CloudFormation recupera o valor do segredo somente durante a criação de recursos ou atualizações que modificam o recurso que contém a referência dinâmica. 

  Por exemplo, suponha que seu modelo inclua um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) em que a propriedade `MasterPassword` esteja definida como uma referência dinâmica do Secrets Manager. Depois de criar uma pilha a partir desse modelo, você atualiza o valor do segredo no Secrets Manager. No entanto, a propriedade `MasterPassword` mantém o valor da senha antiga. 

  Para aplicar o novo valor de segredo, você precisará modificar o recurso `AWS::RDS::DBInstance` em seu modelo do CloudFormation e realizar uma atualização da pilha. 

  Para evitar esse processo manual no futuro, considere usar o Secrets Manager para fazer o rodízio automático do segredo. 
+ No momento, as referências dinâmicas para valores seguros, como `secretsmanager`, não são compatíveis com recursos personalizados.
+ A referência dinâmica `secretsmanager` pode ser usada em todas as propriedades de recursos. Usar a referência dinâmica `secretsmanager` indica que nem o Secrets Manager, nem o CloudFormation deve registrar ou persistir qualquer valor secreto resolvido. No entanto, o valor secreto pode aparecer no serviço cujo recurso está sendo usado. Revise seu uso para evitar o vazamento de dados secretos.

## Permissões
<a name="dynamic-references-secretsmanager-permissions"></a>

Para especificar um segredo armazenado no Secrets Manager, você deve ter permissão para chamar [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) para o segredo.

## Padrão de referência
<a name="dynamic-references-secretsmanager-pattern"></a>

Para fazer referência a segredos do Secrets Manager em seu modelo do CloudFormation, use este padrão de referência `secretsmanager`.

```
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
```

`secret-id`  
O nome ou ARN completo do segredo.  
Para acessar um segredo na sua Conta da AWS, é necessário especificar apenas o nome do segredo. Para acessar um segredo em uma Conta da AWS diferente, especifique o ARN completo do segredo.  
Obrigatório.

`secret-string`  
O único valor aceito é `SecretString`. O padrão é `SecretString`.

`json-key`  
O nome da chave do par de chave-valor cujo valor você deseja recuperar. Se você não especificar um `json-key`, o CloudFormation recuperará todo o texto do segredo.  
Esse segmento não pode incluir o caractere de dois pontos ( `:`).

`version-stage`  
O rótulo de preparação da versão do segredo a ser utilizada. O Secrets Manager usa rótulos de preparação para acompanhar diferentes versões durante o processo de alternância. Se você usar `version-stage`, não especifique `version-id`. Se você não especificar `version-stage` ou `version-id`, o padrão é a versão `AWSCURRENT`.  
Esse segmento não pode incluir o caractere de dois pontos ( `:`).

`version-id`  
O identificador exclusivo da versão do segredo a usar. Se você especificar `version-id`, não especifique `version-stage`. Se você não especificar `version-stage` ou `version-id`, o padrão é a versão `AWSCURRENT`.  
Esse segmento não pode incluir o caractere de dois pontos ( `:`).

## Exemplos
<a name="dynamic-references-secretsmanager-examples"></a>

**Topics**
+ [Recuperar valores de nome de usuário e senha de um segredo](#dynamic-references-secretsmanager-examples-user-name-and-password)
+ [Recuperar todo o SecretString](#dynamic-references-secretsmanager-examples-entire-secretstring)
+ [Recuperar um valor de uma versão específica de um segredo](#dynamic-references-secretsmanager-examples-specific-version)
+ [Recuperar segredos de outro Conta da AWS](#dynamic-references-secretsmanager-examples-secrets-from-another-account)

### Recuperar valores de nome de usuário e senha de um segredo
<a name="dynamic-references-secretsmanager-examples-user-name-and-password"></a>

O exemplo a seguir [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) recupera os valores de nome de usuário e senha armazenados no segredo `MySecret`. Este exemplo mostra o padrão recomendado para referências dinâmicas sem versão, que usa automaticamente a versão `AWSCURRENT` e dá suporte aos fluxos de trabalho de rodízio do Secrets Manager sem exigir alterações no modelo.

#### JSON
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.json"></a>

```
{
    "MyRDSInstance": {
        "Type": "AWS::RDS::DBInstance",
        "Properties": {
            "DBName": "MyRDSInstance",
            "AllocatedStorage": "20",
            "DBInstanceClass": "db.t2.micro",
            "Engine": "mysql",
            "MasterUsername": "{{resolve:secretsmanager:MySecret:SecretString:username}}",
            "MasterUserPassword": "{{resolve:secretsmanager:MySecret:SecretString:password}}"
        }
    }
}
```

#### YAML
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.yaml"></a>

```
  MyRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyRDSInstance
      AllocatedStorage: '20'
      DBInstanceClass: db.t2.micro
      Engine: mysql
      MasterUsername: '{{resolve:secretsmanager:MySecret:SecretString:username}}'
      MasterUserPassword: '{{resolve:secretsmanager:MySecret:SecretString:password}}'
```

### Recuperar todo o SecretString
<a name="dynamic-references-secretsmanager-examples-entire-secretstring"></a>

A referência dinâmica a seguir recupera o `SecretString` para `MySecret`.

```
{{resolve:secretsmanager:MySecret}}
```

Alternativa:

```
{{resolve:secretsmanager:MySecret::::}}
```

### Recuperar um valor de uma versão específica de um segredo
<a name="dynamic-references-secretsmanager-examples-specific-version"></a>

A referência dinâmica a seguir recupera o valor `password` para a versão `AWSPREVIOUS` do `MySecret`.

```
{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}
```

### Recuperar segredos de outro Conta da AWS
<a name="dynamic-references-secretsmanager-examples-secrets-from-another-account"></a>

A referência dinâmica a seguir recupera o `SecretString` para `MySecret` que esteja em outra Conta da AWS. Você deve especificar o ARN do segredo completo para acessar segredos em outra Conta da AWS.

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}
```

A referência dinâmica a seguir recupera o valor `password` para `MySecret` que esteja em outra Conta da AWS. Você deve especificar o ARN do segredo completo para acessar segredos em outra Conta da AWS.

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}
```

# Obter valores da AWS usando pseudoparâmetros
<a name="pseudo-parameter-reference"></a>

Os pseudoparâmetros são variáveis integradas que fornecem acesso a informações importantes do ambiente da AWS, como IDs de contas, nomes de regiões e detalhes da pilha, que podem mudar entre implantações ou ambientes.

Você pode usar pseudoparâmetros em vez de valores com codificação rígida para tornar seus modelos mais portáteis e fáceis de serem reutilizados em diferentes regiões e Contas da AWS.

## Sintaxe
<a name="pseudo-parameter-syntax"></a>

Você pode referenciar pseudoparâmetros usando a função intrínseca `Ref` ou a `Fn::Sub`. 

### Ref.
<a name="pseudo-parameter-ref-syntax"></a>

A função intrínseca `Ref` usa a sintaxe geral a seguir. Para obter mais informações, consulte [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html).

#### JSON
<a name="pseudo-parameter-ref-syntax.json"></a>

```
{ "Ref" : "AWS::PseudoParameter" }
```

#### YAML
<a name="pseudo-parameter-ref-syntax.yaml"></a>

```
!Ref AWS::PseudoParameter
```

### Fn::Sub
<a name="pseudo-parameter-sub-syntax"></a>

A função intrínseca `Fn::Sub` usa um formato diferente que inclui a sintaxe `${}` em torno do pseudoparâmetro. Para obter mais informações, consulte [Fn::Sub](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html).

#### JSON
<a name="pseudo-parameter-sub-syntax.json"></a>

```
{ "Fn::Sub" : "${AWS::PseudoParameter}" }
```

#### YAML
<a name="pseudo-parameter-sub-syntax.yaml"></a>

```
!Sub '${AWS::PseudoParameter}'
```

## Pseudoparâmetros disponíveis
<a name="available-pseudo-parameters"></a>

### `AWS::AccountId`
<a name="cfn-pseudo-param-accountid"></a>

Devolve o ID da Conta da AWS da conta na qual a pilha está sendo criada, como `123456789012`.

Esse pseudoparâmetro é comumente usado ao definir perfis, políticas e outras políticas de recursos do IAM que envolvem ARNs específicos da conta.

### `AWS::NotificationARNs`
<a name="cfn-pseudo-param-notificationarns"></a>

Retorna a lista de nomes de recursos da Amazon (ARNs) dos tópicos do Amazon SNS que recebem as notificações de eventos da pilha. Você pode especificar esses ARNs usando a opção `--notification-arns` na AWS CLI ou usando o console enquanto cria ou atualiza sua pilha.

Ao contrário de outros pseudoparâmetros que retornam um valor único, `AWS::NotificationARNs` retorna uma lista de ARNs. Para acessar um ARN específico na lista, use a função intrínseca `Fn::Select`. Para obter mais informações, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-select.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-select.html).

### `AWS::NoValue`
<a name="cfn-pseudo-param-novalue"></a>

Remove a propriedade do recurso correspondente quando especificada como um valor de retorno na função intrínseca `Fn::If`. Para obter mais informações, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if).

Esse pseudoparâmetro é particularmente útil para criar propriedades de recursos condicionais que só devem ser incluídas em determinadas condições.

### `AWS::Partition`
<a name="cfn-pseudo-param-partition"></a>

Retorna a partição onde o recurso se encontra. Para Regiões da AWS padrão, a partição é `aws`. Para recursos em outras partições, a partição é `aws-`*nomedapartição*. Por exemplo, a partição dos recursos na região da China (Pequim e Ningxia) é `aws-cn`, e a partição para recursos na região AWS GovCloud (EUA-Oeste) é `aws-us-gov`.

A partição faz parte do ARN dos recursos. Usar `AWS::Partition` garante que seus modelos funcionem corretamente em diferentes partições da AWS.

### `AWS::Region`
<a name="cfn-pseudo-param-region"></a>

Retorna uma sequência que representa a região na qual o recurso abrangente está sendo criado, como `us-west-2`.

Este é um dos pseudoparâmetros mais usados, pois permite que os modelos se adaptem a diferentes Regiões da AWS sem modificação.

### `AWS::StackId`
<a name="cfn-pseudo-param-stackid"></a>

Retorna o ID (ARN) da pilha, como `arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123`.

### `AWS::StackName`
<a name="cfn-pseudo-param-stackname"></a>

Retorna o nome da pilha, como `teststack`.

O nome da pilha é normalmente usado para criar nomes de recursos exclusivos que são facilmente identificáveis como pertencentes a uma pilha específica.

### `AWS::URLSuffix`
<a name="cfn-pseudo-param-urlsuffix"></a>

Retorna o sufixo para o domínio da AWS na Região da AWS onde a pilha está implantada. O sufixo é normalmente `amazonaws.com`, mas para a região China (Pequim), o sufixo é `amazonaws.com.cn`.

Esse parâmetro é particularmente útil ao criar URLs para endpoints de serviços da AWS.

## Exemplos
<a name="pseudo-parameter-examples"></a>

**Topics**
+ [Uso básico](#pseudo-parameter-basic-example)
+ [Usar o AWS::NotificationARNs](#pseudo-parameter-notification-example)
+ [Propriedades condicionais com AWS::NoValue](#pseudo-parameter-novalue-example)

### Uso básico
<a name="pseudo-parameter-basic-example"></a>

Os exemplos a seguir criam dois recursos: um tópico do Amazon SNS e um alarme do CloudWatch que envia notificações para esse tópico. Eles usam `AWS::StackName`, `AWS::Region` e `AWS::AccountId` para inserir dinamicamente o nome da pilha, a Região da AWS atual e o ID da conta nos ARNs, nas descrições e nos nomes dos recursos.

#### JSON
<a name="pseudo-parameter-basic-example.json"></a>

```
{
    "Resources": {
        "MyNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "DisplayName": { "Fn::Sub": "Notifications for ${AWS::StackName}" }
            }
        },
        "CPUAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": { "Fn::Sub": "Alarm for high CPU in ${AWS::Region}" },
                "AlarmName": { "Fn::Sub": "${AWS::StackName}-HighCPUAlarm" },
                "MetricName": "CPUUtilization",
                "Namespace": "AWS/EC2",
                "Statistic": "Average",
                "Period": 300,
                "EvaluationPeriods": 1,
                "Threshold": 80,
                "ComparisonOperator": "GreaterThanThreshold",
                "AlarmActions": [{ "Fn::Sub": "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}" }]
            }
        }
    }
}
```

#### YAML
<a name="pseudo-parameter-basic-example.yaml"></a>

```
Resources:
  MyNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: !Sub Notifications for ${AWS::StackName}
  CPUAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: !Sub Alarm for high CPU in ${AWS::Region}
      AlarmName: !Sub ${AWS::StackName}-HighCPUAlarm
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Statistic: Average
      Period: 300
      EvaluationPeriods: 1
      Threshold: 80
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}
```

### Usar o AWS::NotificationARNs
<a name="pseudo-parameter-notification-example"></a>

Os exemplos a seguir configuram um grupo do Auto Scaling para enviar notificações de eventos de inicialização de instâncias e erros de inicialização. A configuração usa o pseudoparâmetro `AWS::NotificationARNs`, que fornece uma lista de ARNs de tópicos do Amazon SNS que foram especificados durante a criação da pilha. A função `Fn::Select` escolhe o primeiro ARN dessa lista.

#### JSON
<a name="pseudo-parameter-notification-example.json"></a>

```
"myASG": {
   "Type": "AWS::AutoScaling::AutoScalingGroup",
   "Properties": {
      "LaunchTemplate": {
         "LaunchTemplateId": { "Ref": "myLaunchTemplate" },
         "Version": { "Fn::GetAtt": [ "myLaunchTemplate", "LatestVersionNumber" ] }
       },
       "MaxSize": "1",
       "MinSize": "1",
       "VPCZoneIdentifier": [
          "subnetIdAz1",
          "subnetIdAz2",
          "subnetIdAz3"
      ],
      "NotificationConfigurations" : [{
         "TopicARN" : { "Fn::Select" : [ "0", { "Ref" : "AWS::NotificationARNs" } ] },
         "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR" ]
      }]
   }
}
```

#### YAML
<a name="pseudo-parameter-notification-example.yaml"></a>

```
myASG:
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    LaunchTemplate:
      LaunchTemplateId: !Ref myLaunchTemplate
      Version: !GetAtt myLaunchTemplate.LatestVersionNumber
    MinSize: '1'
    MaxSize: '1'
    VPCZoneIdentifier:
      - subnetIdAz1
      - subnetIdAz2
      - subnetIdAz3
    NotificationConfigurations:
      - TopicARN:
          Fn::Select:
          - '0'
          - Ref: AWS::NotificationARNs
        NotificationTypes:
        - autoscaling:EC2_INSTANCE_LAUNCH
        - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
```

### Propriedades condicionais com AWS::NoValue
<a name="pseudo-parameter-novalue-example"></a>

Os exemplos a seguir criam uma instância de banco de dados do Amazon RDS que usará um snapshot apenas se o ID do snapshot for fornecido. Se a condição `UseDBSnapshot` for avaliada como verdadeira, o CloudFormation usará o valor do parâmetro `DBSnapshotName` para a propriedade `DBSnapshotIdentifier`. Se a condição for avaliada como falsa, o CloudFormation removerá a propriedade `DBSnapshotIdentifier`. 

#### JSON
<a name="pseudo-parameter-novalue-example.json"></a>

```
"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"}
      ]
    }
  }
}
```

#### YAML
<a name="pseudo-parameter-novalue-example.yaml"></a>

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

# Obter resultados exportados de uma pilha do CloudFormation implantada
<a name="using-cfn-stack-exports"></a>

Quando você tem várias pilhas na mesma região e Conta da AWS, talvez queira compartilhar informações entre elas. Útil quando uma pilha precisa usar recursos criados por outra pilha.

Por exemplo, você pode ter uma pilha que cria recursos de rede, como sub-redes e grupos de segurança, para servidores Web. Outras pilhas que criam os servidores Web reais podem então usar os recursos de rede criados pela primeira pilha. Você não precisa codificar IDs de recurso no modelo da pilha ou passar IDs como parâmetros de entrada.

Para compartilhar informações entre pilhas, *exporte* valores de saída de uma pilha e *importe*-os para outra pilha. Como isso funciona:

1. No modelo da primeira pilha (por exemplo, a pilha de rede), você define determinados valores para exportação usando o campo `Export` na seção `Outputs`. Para obter mais informações, consulte [Sintaxe de Outputs de modelo do CloudFormation](outputs-section-structure.md).

1. Quando você criar ou atualizar essa pilha, o CloudFormation exportará os valores de saída, disponibilizando-os para outras pilhas na mesma região e Conta da AWS.

1. No modelo da outra pilha, você usa a função [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html) para importar os valores exportados da primeira pilha.

1. Quando você criar ou atualizar a segunda pilha (por exemplo, a pilha do servidor web), o CloudFormation recuperará automaticamente os valores exportados da primeira pilha e os usará.

Para um passo a passo e modelos de amostra, consulte [Consultar saídas de recurso em outra pilha do CloudFormation](walkthrough-crossstackref.md).

## Exportar valores de saída da pilha vs usar pilhas aninhadas
<a name="output-vs-nested"></a>

Pilha aninhada é uma pilha que você cria dentro de outra pilha usando o recurso `AWS::CloudFormation::Stack`. Com pilhas aninhadas, você implanta e gerencia todos os recursos em uma única pilha. É possível usar saídas de uma pilha no grupo de pilhas aninhadas como entradas para outra pilha no grupo. Isso é diferente de exportar valores.

Caso você queira isolar o compartilhamento de informações dentro de um grupo de pilhas aninhadas, sugerimos usar pilhas aninhadas. Para compartilhar informações com outras pilhas (e não apenas dentro do grupo de pilhas aninhadas), exporte os valores. Por exemplo, você pode criar uma única pilha com uma sub-rede e exportar o ID. Outras pilhas podem usar essa sub-rede importando o ID. Não é necessário que cada pilha crie a própria sub-rede. Como as pilhas estão importando o ID de sub-rede, não é possível alterar nem excluí-lo.

Para saber mais sobre pilhas aninhadas, consulte [Dividir um modelo em partes reutilizáveis usando pilhas aninhadas](using-cfn-nested-stacks.md).

## Considerações
<a name="using-cfn-stack-exports-considerations"></a>

As restrições a seguir se aplicam a referências de pilha cruzada.
+ Para cada Conta da AWS, os nomes de `Export` devem ser exclusivos em uma região.
+ Não é possível criar referências entre pilhas nas diversas regiões. Você pode usar a função intrínseca `Fn::ImportValue` para importar somente valores que foram exportados na mesma região.
+ Para saídas, o valor da propriedade `Name` de uma `Export` não pode utilizar funções `Ref` ou `GetAtt` que dependem de um recurso.

  Da mesma forma, a função `ImportValue` não pode incluir funções `Ref` ou `GetAtt` que dependem de um recurso.
+ Depois que outra pilha importar um valor de saída, não será possível excluir a pilha que está exportando o valor de saída ou modificar o valor de saída exportado. Todas as importações deverão ser removidas para que você possa excluir a pilha de exportação ou modificar o valor de saída.

## Listar valores de saída exportados
<a name="using-cfn-stack-exports-listing"></a>

Se você precisar consultar os valores de saída exportados de suas pilhas, use um dos seguintes métodos:

**Para listar valores de saída exportados (console)**

1. Abra o console do CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Na barra de navegação na parte superior da tela, escolha sua Região da AWS.

1. No painel de navegação esquerdo, escolha **Exportações**.

**Para listar valores de saída exportados (AWS CLI)**  
Use o seguinte comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html): Substitua *us-east-1* por sua Região da AWS.

```
aws cloudformation list-exports --region us-east-1
```

O seguinte é um exemplo de saída.

```
{
    "Exports": [
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-a",
            "Value": "subnet-07b410xmplddcfa03"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-b",
            "Value": "subnet-075ed3xmplebd2fb1"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-vpcid",
            "Value": "vpc-011d7xmpl100e9841"
        }
    ]
}
```

O CloudFormation mostra os nomes e os valores das saídas exportadas da região atual e a pilha da qual elas foram exportadas. Para usar um valor de saída exportado em outro modelo de pilha, você pode fazer referência a ele usando o nome de exportação e a função `Fn::ImportValue`.

## Listar pilhas que importam um valor de saída exportado
<a name="using-cfn-stack-imports"></a>

Para excluir ou alterar os valores de saída exportados, primeiro é necessário descobrir quais pilhas os estão importando.

Para ver as pilhas que importam um valor de saída exportado, use um dos seguintes métodos:

**Para listar pilhas que importam um valor de saída exportado (console)**

1. Abra o console do CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. No painel de navegação esquerdo, escolha **Exportações**.

1. Para verificar quais pilhas importam um determinado valor de exportação, escolha **Export Name** (Nome da exportação) para esse valor de exportação. O CloudFormation mostra a página de detalhes da exportação, que lista todas as pilhas que estão importando esse valor.

**Para listar pilhas que importam um valor de saída exportado (AWS CLI)**  
Use o comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html). Substitua *us-east-1* por sua Região da AWS e `private-vpc-vpcid` pelo nome do valor de saída exportado.

```
aws cloudformation list-imports --region us-east-1 \
    --export-name private-vpc-vpcid
```

O CloudFormation retorna uma lista de pilhas que estão importando o valor.

```
{
    "Imports": [
        "my-app-stack"
    ]
}
```

Assim que souber quais pilhas estão importando um valor exportado específico, você precisará modificar essas pilhas para remover as funções `Fn::ImportValue` que fazem referência aos valores de saída. Você deve remover todas as importações que fazem referência a valores de saída exportados para poder excluir ou modificar os valores de saída exportados. 

# Especificar recursos existentes no runtime com tipos de parâmetros fornecidos pelo CloudFormation
<a name="cloudformation-supplied-parameter-types"></a>

Ao criar seu modelo, você pode criar parâmetros que exijam que os usuários insiram identificadores de recursos da AWS existentes ou parâmetros do Systems Manager usando tipos de parâmetros especializados fornecidos pelo CloudFormation. 

**Topics**
+ [Visão geral](#cloudformation-supplied-parameter-types-overview)
+ [Exemplo](#cloudformation-supplied-parameter-types-example)
+ [Considerações](#cloudformation-supplied-parameter-types-considerations)
+ [Tipos de parâmetros específicos da AWS compatíveis](#aws-specific-parameter-types-supported)
+ [Tipos de parâmetros compatíveis do Systems Manager](#systems-manager-parameter-types-supported)
+ [Tipos de parâmetros incompatíveis do Systems Manager](#systems-manager-parameter-types-unsupported)

## Visão geral
<a name="cloudformation-supplied-parameter-types-overview"></a>

No CloudFormation, é possível usar parâmetros para personalizar suas pilhas ao fornecer valores de entrada durante a criação ou atualização da pilha. Esse recurso torna seus modelos reutilizáveis e flexíveis em diferentes cenários. 

Os parâmetros são definidos na seção `Parameters` de um modelo do CloudFormation. Cada parâmetro tem um nome e um tipo e pode ser configurado com atributos adicionais, como um valor padrão e valores permitidos. Para obter mais informações, consulte [Sintaxe de Parameters de modelo do CloudFormation](parameters-section-structure.md). 

O tipo de parâmetro determina o tipo de valor de entrada que o parâmetro pode aceitar. Por exemplo, `Number` aceita somente valores numéricos, enquanto `String` aceita entrada de texto. 

O CloudFormation oferece vários tipos de parâmetros adicionais que você pode usar em seus modelos para referenciar recursos da AWS existentes e parâmetros do Systems Manager. 

Esses tipos de parâmetro se encaixam em duas categorias:
+ **Tipos de parâmetros específicos da AWS**: o CloudFormation fornece um conjunto de tipos de parâmetros que ajudam a capturar valores inválidos ao criar ou atualizar uma pilha. Ao usar esses tipos de parâmetros, qualquer pessoa que usar seu modelo deverá especificar valores válidos da região e da Conta da AWS em que está criando a pilha.

  Se eles usarem o Console de gerenciamento da AWS, o CloudFormation fornecerá uma lista pré-preenchida dos valores existentes de sua conta e região. Dessa forma, o usuário não precisa se lembrar e digitar corretamente um nome ou ID específico. Em vez disso, ele apenas seleciona valores em uma lista suspensa. Em alguns casos, é possível até mesmo pesquisar valores por ID, nome ou valor da tag `Name`.
+ **Tipos de parâmetros do Systems Manager**: o CloudFormation também oferece tipos de parâmetros que correspondem a parâmetros existentes no Systems Manager Parameter Store. Quando você usa esses tipos de parâmetros, qualquer pessoa que usar seu modelo deverá especificar uma chave do repositório de parâmetros como o valor do tipo de parâmetro do Systems Manager. Em seguida, o CloudFormation recupera o valor mais recente no Parameter Store a ser usado em sua pilha. Isso pode ser útil quando você precisa atualizar com frequência os recursos da aplicação com novos valores de propriedades, por exemplo, IDs de imagem de máquina da Amazon (AMI). Consulte informações sobre o Parameter Store em [Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html).

Após os parâmetros serem definidos na seção `Parameters`, você poderá referenciar os valores dos parâmetros em todo o seu modelo do CloudFormation usando a função `Ref`.

## Exemplo
<a name="cloudformation-supplied-parameter-types-example"></a>

O exemplo mostra um modelo que usa os tipos de parâmetro a seguir. 
+ `AWS::EC2::VPC::Id`
+ `AWS::EC2::Subnet::Id`
+ `AWS::EC2::KeyPair::KeyName`
+ `AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>`

Para criar uma pilha com base nesse modelo, você deve especificar um ID de VPC, um ID de sub-rede e um nome de par de chaves da sua conta. Você também pode especificar uma chave existente do Parameter Store que faça referência ao ID de AMI desejado ou manter o valor padrão de `/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2`. Esse parâmetro público é um alias para o ID de AMI regional para a AMI mais recente do Amazon Linux 2. Para obter mais informações sobre parâmetros públicos, consulte [Descobrir parâmetros públicos no Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) no *Guia do usuário do AWS Systems Manager*.

### JSON
<a name="cloudformation-supplied-parameter-types-example.json"></a>

```
{
    "Parameters": {
        "VpcId": {
            "Description": "ID of an existing Virtual Private Cloud (VPC).",
            "Type": "AWS::EC2::VPC::Id"
        },
        "PublicSubnetId": {
            "Description": "ID of an existing public subnet within the specified VPC.",
            "Type": "AWS::EC2::Subnet::Id"
        },
        "KeyName": {
            "Description": "Name of an existing EC2 key pair to enable SSH access to the instance.",
            "Type": "AWS::EC2::KeyPair::KeyName"
        },
        "AMIId": {
            "Description": "Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).",
            "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
            "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
        }
    },
    "Resources": {
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "VpcId": { "Ref": "VpcId" },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "KeyName": { "Ref": "KeyName" },
                "ImageId": { "Ref": "AMIId" },
                "NetworkInterfaces": [
                    {
                        "AssociatePublicIpAddress": "true",
                        "DeviceIndex": "0",
                        "SubnetId": { "Ref": "PublicSubnetId" },
                        "GroupSet": [{ "Ref": "InstanceSecurityGroup" }]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Value": { "Ref": "Ec2Instance" }
        }
    }
}
```

### YAML
<a name="cloudformation-supplied-parameter-types-example.yaml"></a>

```
Parameters:
  VpcId:
    Description: ID of an existing Virtual Private Cloud (VPC).
    Type: AWS::EC2::VPC::Id
  PublicSubnetId:
    Description: ID of an existing public subnet within the specified VPC.
    Type: AWS::EC2::Subnet::Id
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance.
    Type: AWS::EC2::KeyPair::KeyName
  AMIId:
    Description: Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: !Ref KeyName
      ImageId: !Ref AMIId
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnetId
          GroupSet:
            - !Ref InstanceSecurityGroup
Outputs:
  InstanceId:
    Value: !Ref Ec2Instance
```

### Comando AWS CLI para criar a pilha
<a name="cloudformation-supplied-parameter-types-cli-command"></a>

O comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) a seguir cria uma pilha com base no modelo de exemplo. 

```
aws cloudformation create-stack --stack-name MyStack \
  --template-body file://sampletemplate.json \
  --parameters \
ParameterKey="VpcId",ParameterValue="vpc-a123baa3" \
ParameterKey="PublicSubnetId",ParameterValue="subnet-123a351e" \
ParameterKey="KeyName",ParameterValue="MyKeyName" \
ParameterKey="AMIId",ParameterValue="MyParameterKey"
```

Para usar um tipo de parâmetro que aceite uma lista de strings, como `List<AWS::EC2::Subnet::Id>`, é necessário escapar as vírgulas dentro de `ParameterValue` com uma barra invertida dupla, conforme mostrado no exemplo a seguir.

```
--parameters ParameterKey="SubnetIDs",ParameterValue="subnet-5ea0c127\\,subnet-6194ea3b\\,subnet-c87f2be0"
```

## Considerações
<a name="cloudformation-supplied-parameter-types-considerations"></a>

É altamente recomendável usar referências dinâmicas para restringir o acesso a definições de configuração confidenciais, como credenciais de terceiros. Para obter mais informações, consulte [Obter valores armazenados em outros serviços usando referências dinâmicas](dynamic-references.md).

Se desejar permitir que os usuários do modelo especifiquem valores de Contas da AWS diferentes, não use tipos de parâmetros específicos da AWS. Em vez disso, defina parâmetros do tipo `String` ou `CommaDelimitedList`. 

Há algumas coisas que você deve ter em mente com os tipos de parâmetros do Systems Manager:
+ É possível ver os valores de parâmetros resolvidos na guia **Parâmetros** da pilha no console ou executando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html) ou [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html). Lembre-se: esses valores são definidos quando a pilha é criada ou atualizada e, portanto, podem ser diferentes dos últimos valores no Parameter Store.
+ Para atualizações de pilha, ao usar a opção **Usar valor existente** (ou define `UsePreviousValue` como verdadeiro), isso significa que você deseja continuar usando a mesma chave do Parameter Store, não seu valor. O CloudFormation sempre recupera o valor mais recente.
+ Se você especificar quaisquer valores permitidos ou outras restrições, o CloudFormation os validará com base nas chaves de parâmetros que você especificar, mas não em seus valores. Você deve validar os valores no próprio Parameter Store.
+ Quando você cria ou atualiza pilhas e cria conjuntos de alterações, o CloudFormation usa quaisquer valores existentes no Parameter Store no momento em que a operação é realizada. Se não houver um parâmetro especificado no Parameter Store, sob a Conta da AWS do chamador, o CloudFormation retornará um erro de validação.
+ Quando você executa um conjunto de alterações, o CloudFormation usa os valores especificados no conjunto de alterações. Você deve analisar esses valores antes de executar o conjunto de alterações, pois eles podem ser alterados no Armazenamento de parâmetros entre o momento em que você cria o conjunto de alterações e momento em que o executa.
+ Para parâmetros do Parameter Store armazenados na mesma Conta da AWS, você deverá fornecer o nome do parâmetro. Para parâmetros do Parameter Store compartilhados por outra Conta da AWS, será necessário fornecer o ARN completo do parâmetro.

## Tipos de parâmetros específicos da AWS compatíveis
<a name="aws-specific-parameter-types-supported"></a>

O CloudFormation é compatível com os seguintes tipos específicos da AWS:

`AWS::EC2::AvailabilityZone::Name`  
Uma Zona de disponibilidade, como `us-west-2a`.

`AWS::EC2::Image::Id`  
Um ID de imagem do Amazon EC2, como `ami-0ff8a91507f77f867`. Observe que o console do CloudFormation não mostra uma lista suspensa de valores para esse tipo de parâmetro.

`AWS::EC2::Instance::Id`  
Um ID de instância do Amazon EC2, como `i-1e731a32`.

`AWS::EC2::KeyPair::KeyName`  
Um nome do par de chaves do Amazon EC2.

`AWS::EC2::SecurityGroup::GroupName`  
Um nome de grupo de segurança da VPC padrão, como `my-sg-abc`.

`AWS::EC2::SecurityGroup::Id`  
Um ID de security group, como `sg-a123fd85`.

`AWS::EC2::Subnet::Id`  
Um ID de sub-rede, como `subnet-123a351e`.

`AWS::EC2::Volume::Id`  
Um ID de volume do Amazon EBS, como `vol-3cdd3f56`.

`AWS::EC2::VPC::Id`  
Um ID de VPC, como `vpc-a123baa3`.

`AWS::Route53::HostedZone::Id`  
Um ID de zona hospedada do Amazon Route 53, como `Z23YXV4OVPL04A`.

`List<AWS::EC2::AvailabilityZone::Name>`  
Uma matriz de Zonas de disponibilidade de uma região, como `us-west-2a, us-west-2b`.

`List<AWS::EC2::Image::Id>`  
Uma matriz de IDs de imagens do Amazon EC2, como `ami-0ff8a91507f77f867, ami-0a584ac55a7631c0c`. Observe que o console do CloudFormation não mostra uma lista suspensa de valores para esse tipo de parâmetro.

`List<AWS::EC2::Instance::Id>`  
Uma matriz de IDs de instâncias do Amazon EC2, como `i-1e731a32, i-1e731a34`.

`List<AWS::EC2::SecurityGroup::GroupName>`  
Uma matriz de nomes de grupos de segurança padrão da VPC, como `my-sg-abc, my-sg-def`.

`List<AWS::EC2::SecurityGroup::Id>`  
Uma matriz de IDs de security groups, como `sg-a123fd85, sg-b456fd85`.

`List<AWS::EC2::Subnet::Id>`  
Uma matriz de IDs de sub-rede, como `subnet-123a351e, subnet-456b351e`.

`List<AWS::EC2::Volume::Id>`  
Uma matriz de IDs de volumes do Amazon EBS, como `vol-3cdd3f56, vol-4cdd3f56`.

`List<AWS::EC2::VPC::Id>`  
Uma matriz de IDs de VPC, como `vpc-a123baa3, vpc-b456baa3`.

`List<AWS::Route53::HostedZone::Id>`  
Uma matriz de IDs de zonas hospedadas do Amazon Route 53, como `Z23YXV4OVPL04A, Z23YXV4OVPL04B`.

## Tipos de parâmetros compatíveis do Systems Manager
<a name="systems-manager-parameter-types-supported"></a>

O CloudFormation é compatível com os seguintes tipos de parâmetros do Systems Manager:

`AWS::SSM::Parameter::Name`  
O nome de uma chave de parâmetro do Systems Manager. Use esse tipo de parâmetro somente para verificar se um parâmetro necessário existe. O CloudFormation não recupera o valor real associado ao parâmetro. 

`AWS::SSM::Parameter::Value<String>`  
Um parâmetro do Systems Manager cujo valor é uma sequência. Corresponde ao tipo de parâmetro `String` no Armazenamento de parâmetros.

`AWS::SSM::Parameter::Value<List<String>>` ou `AWS::SSM::Parameter::Value<CommaDelimitedList>`  
Um parâmetro do Systems Manager cujo valor é uma lista de sequências. Corresponde ao tipo de parâmetro `StringList` no Armazenamento de parâmetros.

`AWS::SSM::Parameter::Value<AWS-specific parameter type>`  
Um parâmetro do Systems Manager cujo valor é um tipo de parâmetro específico da AWS.   
Por exemplo, o seguinte especifica o tipo `AWS::EC2::KeyPair::KeyName`:  
+ `AWS::SSM::Parameter::Value<AWS::EC2::KeyPair::KeyName>`

`AWS::SSM::Parameter::Value<List<AWS-specific parameter type>>`  
Um parâmetro do Systems Manager cujo valor é uma lista de tipos de parâmetros específicos da AWS.   
Por exemplo, o seguinte especifica uma lista de tipos `AWS::EC2::KeyPair::KeyName`:  
+ `AWS::SSM::Parameter::Value<List<AWS::EC2::KeyPair::KeyName>>`

## Tipos de parâmetros incompatíveis do Systems Manager
<a name="systems-manager-parameter-types-unsupported"></a>

O CloudFormation não é compatível com o seguinte tipo de parâmetro do Systems Manager:
+ Listas de tipos de parâmetros do Systems Manager. Por exemplo: `List<AWS::SSM::Parameter::Value<String>>`

Além disso, o CloudFormation não é compatível com a definição de parâmetros de modelo como tipos de parâmetros `SecureString` do Systems Manager. No entanto, você pode especificar strings seguras como *valores* de parâmetros para determinados recursos. Para obter mais informações, consulte [Obter valores armazenados em outros serviços usando referências dinâmicas](dynamic-references.md).

# Orientações passo a passo do CloudFormation
<a name="walkthroughs"></a>

Este documento fornece uma coleção de orientações detalhadas desenvolvidas para oferecer a você experiência prática em implantações de pilhas.
+ [Consultar saídas de recurso em outra pilha do CloudFormation](walkthrough-crossstackref.md): essa demonstração mostra como referenciar as saídas de uma pilha do CloudFormation em outra pilha. Em vez de incluir todos os recursos em uma única pilha, você pode criar recursos da AWS relacionados em pilhas separadas para criar modelos mais modulares e reutilizáveis.
+ [Implantar aplicações no Amazon EC2](deploying.applications.md): saiba como usar o CloudFormation para instalar, configurar e iniciar aplicações automaticamente em instâncias do Amazon EC2. Dessa forma, você pode duplicar facilmente implantações e atualizar instalações existentes sem se conectar diretamente às instâncias.
+ [Atualizar uma pilha do CloudFormation](updating.stacks.walkthrough.md): percorra uma progressão simples de atualizações de uma pilha em execução com o CloudFormation.
+ [Criar uma aplicação dimensionada e com balanceamento de carga](walkthrough-autoscaling.md): descubra como usar o CloudFormation para criar uma aplicação escalável e com balanceamento de carga. Essa demonstração aborda a criação de um grupo do Auto Scaling, um balanceador de carga e outros recursos relacionados para garantir que sua aplicação possa lidar com cargas de tráfego variáveis e manter a alta disponibilidade.
+ [Emparelhar com uma VPC em outra Conta da AWS](peer-with-vpc-in-another-account.md): essa demonstração orienta você pelo processo de criação de uma conexão de emparelhamento de Nuvem Privada Virtual (VPC) entre duas VPCs em diferentes Contas da AWS. O emparelhamento de VPC ajuda você a rotear o tráfego entre as VPCs e acessar os recursos como se eles fizessem parte da mesma rede.
+ [Executar implantações azuis/verdes do ECS por meio do CodeDeploy usando o CloudFormation](blue-green.md): descubra como usar o CloudFormation para realizar implantações azuis/verdes do AWS CodeDeploy no Amazon ECS. Implantações azuis/verdes são uma forma de atualizar aplicações ou serviços com o mínimo de tempo de inatividade.

# Consultar saídas de recurso em outra pilha do CloudFormation
<a name="walkthrough-crossstackref"></a>

Essa demonstração mostra como referenciar as saídas de uma pilha do CloudFormation em outra pilha para criar modelos mais modulares e reutilizáveis. 

Em vez de incluir todos os recursos em uma única pilha, você cria recursos da AWS relacionados em pilhas separadas. Depois, você pode consultar as saídas de recursos necessárias de outras pilhas. Restringindo referências de pilha cruzada a saídas, você controla as partes de uma pilha referenciadas por outras pilhas.

Por exemplo, você pode ter uma pilha de rede com uma VPC, um grupo de segurança e uma sub-rede para aplicações web públicas e uma pilha de aplicações web públicas separadas. Para garantir que as aplicações Web usem o grupo de segurança e a sub-rede da pilha de rede, você cria uma referência de pilha cruzada que permite que a pilha de aplicações web referenciem saídas da pilha de rede. Com uma referência de pilha cruzada, os proprietários das pilhas de aplicações web não precisam criar nem manter regras ou ativos de rede.

Para criar uma referência de pilha cruzada, use o campo de saída `Export` a fim de sinalizar o valor de uma saída de recurso para exportação. Em seguida, use a função intrínseca `Fn::ImportValue` para importar o valor. Para obter mais informações, consulte [Obter resultados exportados de uma pilha do CloudFormation implantada](using-cfn-stack-exports.md).

**nota**  
O CloudFormation é um serviço gratuito. No entanto, você é cobrado pelos recursos da AWS incluídos nas pilhas segundo a taxa atual de cada um. Para obter mais informações sobre a definição de preço da AWS, consulte a [página de detalhes de cada produto](https://aws.amazon.com/).

**Topics**
+ [Usar um modelo de exemplo para criar uma pilha de rede](#walkthrough-crossstackref-create-vpc-stack)
+ [Usar um modelo de exemplo para criar uma pilha de aplicações Web](#walkthrough-crossstackref-create-ec2-stack)
+ [Verificar se a pilha funciona conforme o previsto](#walkthrough-crossstackref-verify)
+ [Solucionar problemas de mapeamento de AMIs](#walkthrough-crossstackref-troubleshooting-ami)
+ [Limpe os seus recursos](#walkthrough-crossstackref-clean-up)

## Usar um modelo de exemplo para criar uma pilha de rede
<a name="walkthrough-crossstackref-create-vpc-stack"></a>

Antes de iniciar este passo a passo, verifique se você tem permissões do IAM para usar todos os seguintes serviços: Amazon VPC, Amazon EC2 e CloudFormation.

A pilha de rede contém a VPC, o grupo de segurança e a sub-rede que você usará na pilha de aplicações web. Além desses recursos, a pilha de rede cria um gateway de Internet e tabelas de roteamento para permitir o acesso público.

Você deverá criar essa pilha antes de criar a pilha de aplicações web. Se você criar a pilha de aplicações web primeiro, ela não terá um grupo de segurança ou sub-rede.

O modelo da pilha está disponível no seguinte URL: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template). Para ver os recursos que a pilha criará, escolha o link, que abre o modelo. Na seção `Outputs`, você pode ver os recursos de rede exportados pelo modelo de amostra. Os nomes dos recursos exportados são prefixados com o nome da pilha caso você exporte recursos de rede de outras pilhas. Quando importam recursos de rede, os usuários podem especificar de qual pilha os recursos são importados.

**Para criar a pilha de rede**

1. Faça login no Console de gerenciamento da AWS e abra o console CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Na página **Pilhas**, escolha **Criar pilha** no canto superior direito e selecione **Com novos recursos (padrão)**.

1. Escolha **O modelo está pronto** e, na seção **Especificar modelo**, escolha **URL do Amazon S3**.

1. Em **URL do Amazon S3**, cole o seguinte URL: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template**.

1. Escolha **Próximo**.

1. Para **Stack name (Nome da pilha)**, digite **SampleNetworkCrossStack** e selecione **Next (Próximo)**.
**nota**  
Registre o nome dessa pilha. Você precisará do nome da pilha quando ativar a pilha de aplicações web.

1. Escolha **Próximo**. Para esta descrição, você não precisa adicionar tags nem especificar configurações avançadas.

1. Verifique se o nome da pilha e o URL do modelo estão corretos e escolha **Create stack (Criar pilha)**.

   Pode levar alguns minutos para que o CloudFormation crie a pilha. Aguarde até que todos os recursos tenham sido criados com êxito antes de continuar criando a pilha de aplicações web.

1. Para monitorar o progresso, visualize os eventos da pilha. Para obter mais informações, consulte [Monitorar o progresso da pilha](monitor-stack-progress.md).

## Usar um modelo de exemplo para criar uma pilha de aplicações Web
<a name="walkthrough-crossstackref-create-ec2-stack"></a>

A pilha de aplicações web cria uma instância EC2 que usa o grupo de segurança e a sub-rede da pilha de rede. 

Você deve criar essa pilha na mesma Região da AWS que a pilha de rede.

O modelo da pilha está disponível no seguinte URL: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template). Para ver os recursos que a pilha criará, escolha o link, que abrirá o modelo. Na seção `Resources`, visualize as propriedades da instância do EC2. Você pode ver como os recursos de rede são importados de outra pilha usando a função `Fn::ImportValue`.

**Para criar a pilha de aplicações web**

1. Na página **Pilhas**, escolha **Criar pilha** no canto superior direito e depois **Com novos recursos (padrão)**.

1. Escolha **O modelo está pronto** e, na seção **Especificar modelo**, escolha **URL do Amazon S3**.

1. Em **URL do Amazon S3**, cole o seguinte URL: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template**.

1. Escolha **Próximo**.

1. Para **Nome da pilha**, digite **SampleWebAppCrossStack**. Na seção **Parâmetros**, use o valor padrão do parâmetro **NetworkStackName** e escolha **Próximo**.

   O modelo de amostra usa o valor do parâmetro para especificar de qual pilha importar valores.

1. Escolha **Próximo**. Para esta descrição, você não precisa adicionar tags nem especificar configurações avançadas.

1. Verifique se o nome da pilha e o URL do modelo estão corretos e escolha **Create stack (Criar pilha)**.

   Pode levar alguns minutos para que o CloudFormation crie a pilha.

## Verificar se a pilha funciona conforme o previsto
<a name="walkthrough-crossstackref-verify"></a>

Após a criação da pilha, visualize os recursos e observe o ID da instância. Para obter mais informações sobre como visualizar recursos de pilha, consulte [Visualizar informações da pilha no console do CloudFormation](cfn-console-view-stack-data-resources.md).

Para verificar o grupo de segurança da instância e a sub-rede, visualize as propriedades da instância no [console do Amazon EC2](https://console.aws.amazon.com/ec2/). Caso a instância use o grupo de segurança e a sub-rede da pilha `SampleNetworkCrossStack`, você criou com êxito uma referência de pilha cruzada.

Use o console para visualizar as saídas da pilha e o URL do site de exemplo para verificar se a aplicação web está em execução. Para obter mais informações, consulte [Visualizar informações da pilha no console do CloudFormation](cfn-console-view-stack-data-resources.md).

## Solucionar problemas de mapeamento de AMIs
<a name="walkthrough-crossstackref-troubleshooting-ami"></a>

Se você receber o erro `Template error: Unable to get mapping for AWSRegionArch2AMI::[region]::HVM64`, o modelo não inclui um mapeamento de AMIs para sua Região da AWS. Em vez de atualizar o mapeamento, recomendamos usar os parâmetros públicos do Systems Manager para referenciar dinamicamente as AMIs mais recentes:

1. Baixe o modelo `SampleWebAppCrossStack` para sua máquina local em: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template).

1. Exclua toda a seção de mapeamento `AWSRegionArch2AMI`.

1. Adicione o seguinte parâmetro do Systems Manager:

   ```
   "LatestAmiId": {
     "Description": "The latest Amazon Linux 2 AMI from the Parameter Store",
       "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
       "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
     }
   ```

1. Substitua a referência de `ImageId` existente:

   ```
   "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" } , "HVM64" ] }, 
   ```

   Por:

   ```
   "ImageId": { "Ref": "LatestAmiId" },
   ```

   Esse parâmetro é automaticamente resolvido para a AMI mais recente do Amazon Linux 2 para a região em que você implanta a pilha. 

   Para outras distribuições Linux, use o caminho de parâmetro apropriado. Para obter mais informações, consulte [Descobrir parâmetros públicos no Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) no *Guia do usuário do AWS Systems Manager*.

1. Carregue o modelo modificado em um bucket do S3 em sua conta:

   ```
   aws s3 cp SampleWebAppCrossStack.template s3://amzn-s3-demo-bucket/
   ```

1. Ao criar a pilha, especifique o URL do seu modelo no S3 em vez do URL de exemplo.

## Limpe os seus recursos
<a name="walkthrough-crossstackref-clean-up"></a>

Para se certificar de que você não seja cobrado por serviços indesejados, exclua as pilhas.

**Para excluir as pilhas**

1. No console do CloudFormation, selecione a pilha `SampleWebAppCrossStack`.

1. Escolha **Actions (Ações)** e selecione **Delete stack (Excluir pilha)**.

1. Na mensagem de confirmação, selecione **Delete (Excluir)**.

1. Depois que a pilha tiver sido excluída, repita as mesmas etapas para a pilha `SampleNetworkCrossStack`.
**nota**  
Aguarde até o CloudFormation excluir por completo a pilha `SampleWebAppCrossStack`. Se a instância do EC2 ainda estiver em execução na VPC, o CloudFormation não excluirá a VPC na pilha `SampleNetworkCrossStack`.

# Implantar aplicações no Amazon EC2
<a name="deploying.applications"></a>

É possível usar o CloudFormation para instalar, configurar e iniciar aplicações automaticamente em instâncias do Amazon EC2. Isso permite que você duplique implantações e atualize instalações existentes facilmente sem se conectar diretamente à instância, o que pode economizar muito tempo e esforço.

O CloudFormation inclui um conjunto de scripts auxiliares (`cfn-init`, `cfn-signal`, `cfn-get-metadata` e `cfn-hup`) baseados em `cloud-init`. Você chama esses scripts auxiliares de seus modelos do CloudFormation para instalar, configurar e atualizar os aplicativos em instâncias do Amazon EC2 que estão no mesmo modelo. Para obter mais informações, consulte [Referência de scripts auxiliares do CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) no *Guia de referência de modelos do CloudFormation*.

No [tutorial de conceitos básicos](gettingstarted.walkthrough.md), você criou um servidor Web simples usando `UserData` com um script bash básico. Embora isso tenha funcionado para uma página simples “Hello World”, as aplicações reais geralmente precisam de uma configuração mais sofisticada, incluindo:
+ Vários pacotes de software instalados na ordem correta.
+ Arquivos de configuração complexos criados com conteúdo específico.
+ Serviços iniciados e configurados para serem executados automaticamente.
+ Tratamento de erros e validação do processo de configuração.

Os scripts auxiliares do CloudFormation fornecem uma maneira mais robusta e sustentável de configurar instâncias do EC2 em comparação com os scripts bash básicos em `UserData`. O script auxiliar `cfn-init` lê os dados de configuração dos metadados do seu modelo e os aplica sistematicamente à sua instância.

Neste tutorial, você vai aprender como usar o script auxiliar `cfn-init` e como monitorar o processo de bootstrap.

**nota**  
O CloudFormation é gratuito, mas os recursos do Amazon EC2 que você criar serão cobrados. Porém, se você for novo na AWS, poderá aproveitar o [nível gratuito](https://aws.amazon.com/free/) para minimizar ou eliminar os custos durante este processo de aprendizagem.

**Topics**
+ [Pré-requisitos](#bootstrapping-tutorial-prerequisites)
+ [Como entender os conceitos de bootstrap](#bootstrapping-tutorial-understand-concepts)
+ [Começar com um exemplo simples de bootstrap](#bootstrapping-tutorial-simple-example)
+ [Como adicionar arquivos e comandos](#bootstrapping-tutorial-add-complexity)
+ [Como adicionar segurança](#bootstrapping-tutorial-security-group)
+ [O modelo completo de bootstrap](#bootstrapping-tutorial-complete-template)
+ [Criar uma pilha usando o console](#bootstrapping-tutorial-create-stack)
+ [Monitorar o processo de bootstrap](#bootstrapping-tutorial-validate-bootstrap)
+ [Testar o servidor Web bootstrapped](#bootstrapping-tutorial-test-web-server)
+ [Solucionar problemas de bootstrap](#bootstrapping-tutorial-troubleshooting)
+ [Limpar os recursos](#bootstrapping-tutorial-clean-up)
+ [Próximas etapas](#bootstrapping-tutorial-next-steps)

## Pré-requisitos
<a name="bootstrapping-tutorial-prerequisites"></a>
+ Você deve ter concluído o tutorial [Criar sua primeira pilha](gettingstarted.walkthrough.md) ou ter uma experiência equivalente com os conceitos básicos do CloudFormation.
+ Você deve ter acesso a uma Conta da AWS com um usuário ou perfil do IAM que tenha permissões para usar o Amazon EC2 e o CloudFormation ou ter acesso de usuário administrativo.
+ Você deve ter uma nuvem privada virtual (VPC) que tenha acesso à internet. Este modelo de tutorial requer uma VPC padrão, que vem automaticamente com as Contas da AWS mais recentes. Se você não tiver uma VPC padrão, ou se ela tiver sido excluída, consulte a seção de solução de problemas no tutorial [Criar sua primeira pilha](gettingstarted.walkthrough.md) para obter soluções alternativas.

## Como entender os conceitos de bootstrap
<a name="bootstrapping-tutorial-understand-concepts"></a>

Vamos entender os principais conceitos que fazem o bootstrapping funcionar antes de criar o modelo.

### O script de ajuda `cfn-init`
<a name="bootstrapping-tutorial-cfn-init-overview"></a>

O CloudFormation fornece os scripts auxiliares do Python que podem ser usados para instalar software e iniciar serviços em uma instância do Amazon EC2. O script `cfn-init` lê os metadados dos recursos do seu modelo e aplica a configuração à sua instância.

O processo funciona da seguinte maneira:

1. Você define a configuração na seção `Metadata` do seu recurso do EC2.

1. Você chama `cfn-init` no script `UserData`.

1. O script `cfn-init` lê os metadados e aplica a configuração.

1. A instância é configurada de acordo com suas especificações.

### Estrutura de metadados
<a name="bootstrapping-tutorial-metadata-structure"></a>

A configuração é definida em uma estrutura específica dentro da instância do EC2.

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:                       # Metadata section for the resource
      AWS::CloudFormation::Init:    # Required key that cfn-init looks for
        config:                     # Configuration name (you can have multiple)
          packages:                 # Install packages
          files:                    # Create files
          commands:                 # Run commands
          services:                 # Start/stop services
```

O script `cfn-init` processa essas seções na seguinte ordem: pacotes, grupos, usuários, origens, arquivos, comandos e serviços.

## Começar com um exemplo simples de bootstrap
<a name="bootstrapping-tutorial-simple-example"></a>

Vamos começar com um exemplo mínimo de bootstrap que apenas instala e inicia o Apache.

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:                 # Install Apache web server
            yum:
              httpd: []
          services:                 # Start Apache and enable it to start on boot
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      UserData: !Base64             # Script that runs when instance starts
        Fn::Sub: |
          #!/bin/bash
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}
```

Este exemplo simples demonstra os principais conceitos:
+ A seção `packages` instala o pacote `httpd` usando yum. Isso funciona no Amazon Linux e em outras distribuições Linux que usamyum.
+ A seção `services` garante que o `httpd` inicie e seja executado automaticamente.
+ O `UserData` instala as ferramentas de bootstrap mais recentes e chama o `cfn-init`.

## Como adicionar arquivos e comandos
<a name="bootstrapping-tutorial-add-complexity"></a>

Agora, vamos aprimorar nosso exemplo adicionando uma página da Web personalizada e um arquivo de log no diretório `/var/log` na instância do EC2.

### Criar arquivos
<a name="bootstrapping-tutorial-files-section"></a>

A seção `files` permite que você crie arquivos na instância com conteúdo específico. A barra vertical (`|`) permite que você passe um bloco literal de texto (código HTML) como conteúdo do arquivo (`/var/www/html/index.html`).

```
files:
  /var/www/html/index.html:
    content: |
      <body>
        <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>
      </body>
```

### Executar comandos
<a name="bootstrapping-tutorial-commands-section"></a>

A seção `commands` permite que você execute comandos shell durante o processo de bootstrap. Esse comando cria um arquivo de log em `/var/log/welcome.txt` na instância do EC2. Para visualizá-lo, você precisa de um par de chaves do Amazon EC2 para usar no acesso por SSH e um intervalo de endereços IP que possa ser usado para o SSH na instância (não abordados aqui).

```
commands:
  createWelcomeLog:
    command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
```

## Como adicionar segurança
<a name="bootstrapping-tutorial-security-group"></a>

Como estamos configurando um servidor Web, precisamos permitir que o tráfego da Web (HTTP) chegue à nossa instância do EC2. Para isso, criaremos um grupo de segurança que permita tráfego de entrada na porta 80 do seu endereço IP. As instâncias do EC2 também precisam enviar tráfego para a internet, por exemplo, para instalar atualizações de pacotes. Por padrão, os grupos de segurança permitem todo o tráfego de saída. Vamos então associar esse grupo de segurança à nossa instância do EC2 usando a propriedade `SecurityGroupIds`.

```
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Allow HTTP access from my IP address
    SecurityGroupIngress:
      - IpProtocol: tcp
        Description: HTTP
        FromPort: 80
        ToPort: 80
        CidrIp: !Ref MyIP
```

## O modelo completo de bootstrap
<a name="bootstrapping-tutorial-complete-template"></a>

Agora, vamos juntar todas as peças. Confira o modelo completo que combina todos os conceitos que discutimos.

```
AWSTemplateFormatVersion: 2010-09-09
Description: Bootstrap an EC2 instance with Apache web server using cfn-init

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t3.micro
      - t2.micro
    ConstraintDescription: must be a valid EC2 instance type.

  MyIP:
    Description: Your IP address in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.

Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP access from my IP address
      SecurityGroupIngress:
        - IpProtocol: tcp
          Description: HTTP
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref MyIP

  WebServer:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: |
                <body>
                  <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>
                </body>
          commands:
            createWelcomeLog:
              command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region}
      Tags:
        - Key: Name
          Value: Bootstrap Tutorial Web Server

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServer.PublicDnsName}'
    Description: EC2 instance public DNS name
```

## Criar uma pilha usando o console
<a name="bootstrapping-tutorial-create-stack"></a>

O procedimento a seguir envolve o upload do modelo de pilha de amostra a partir de um arquivo. Abra um editor de texto na sua máquina local e adicione o modelo. Salve o arquivo com o nome `samplelinux2stack.template`.

**Para executar o modelo de pilha**

1. Faça login no Console de gerenciamento da AWS e abra o console CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Escolha **Create stack (Criar pilha)**, **With new resources (Com novos recursos (padrão))**.

1. Em **Especificar modelo**, escolha **Carregar um arquivo de modelo**, **Escolher arquivo** para carregar o arquivo `samplelinux2stack.template`. 

1. Escolha **Próximo**.

1. Na página **Especificar detalhes da pilha**, digite **BootstrapTutorialStack** como o nome da pilha.

1. Em **Parâmetros**, faça o seguinte:
   + **LatestAmiId**: deixe o valor padrão.
   + **InstanceType**: escolha **t2.micro** ou **t3.micro** como o tipo de instância do EC2.
   + **MyIP**: insira seu endereço IP público com um sufixo `/32`.

1. Escolha **Avançar** duas vezes e, em seguida, **Enviar** para criar a pilha.

## Monitorar o processo de bootstrap
<a name="bootstrapping-tutorial-validate-bootstrap"></a>

Os processos de bootstrap demoram mais do que simples execuções do EC2 porque software adicional está sendo instalado e configurado.

**Para monitorar o progresso do bootstrap**

1. No console do CloudFormation, selecione sua pilha e abra a guia **Eventos**.

1. Fique atento ao evento `WebServer CREATE_IN_PROGRESS`. O processo de bootstrap começa após a inicialização da instância.

1. Normalmente, o processo de bootstrap leva alguns minutos. Você verá `WebServer CREATE_COMPLETE` quando tiver terminado.

Caso queira ver o que está acontecendo durante o processo de bootstrap, você pode verificar os logs da instância.

**Para visualizar os logs de bootstrap (opcional)**

1. Abra o [console do EC2](https://console.aws.amazon.com/ec2/) e encontre sua instância.

1. Selecione a instância e escolha **Ações**, **Monitorar e solucionar problemas** e **Obter log do sistema** para ver o progresso do bootstrap.

1. Se você não visualizar os logs de imediato, aguarde e atualize a página. 

## Testar o servidor Web bootstrapped
<a name="bootstrapping-tutorial-test-web-server"></a>

Quando sua pilha mostrar `CREATE_COMPLETE`, teste seu servidor Web.

**Para testar o servidor Web**

1. No console do CloudFormation, acesse a guia **Saídas** da sua pilha.

1. Clique no valor **WebsiteURL** para abrir o servidor Web em uma nova guia.

1. Você verá sua página da Web personalizada com a mensagem `Congratulations, you have successfully launched the AWS CloudFormation sample`.

**nota**  
Se a página não for carregada de imediato, aguarde um minuto e tente novamente. O processo de bootstrap ainda pode estar sendo concluído mesmo após a pilha mostrar `CREATE_COMPLETE`.

## Solucionar problemas de bootstrap
<a name="bootstrapping-tutorial-troubleshooting"></a>

Se o processo de bootstrap falhar ou se o servidor Web não estiver funcionando, confira abaixo os problemas e soluções comuns.

### Problemas comuns
<a name="bootstrapping-tutorial-common-issues"></a>
+ **Falha na criação da pilha**: verifique a guia **Eventos** para ver mensagens de erro específicas.
+ **Servidor Web não acessível**: verifique se o endereço IP está correto no parâmetro `MyIP`. Lembre-se de incluir `/32` no final.
+ **Falha no processo de bootstrap**: a instância pode ser inicializada, mas o `cfn-init` falha. Verifique os logs do sistema conforme descrito na seção de monitoramento.

## Limpar os recursos
<a name="bootstrapping-tutorial-clean-up"></a>

Para evitar cobranças contínuas, você pode fazer a limpeza excluindo a pilha e seus recursos. 

**Para excluir a pilha e seus recursos**

1. Abra o [console do CloudFormation](https://console.aws.amazon.com/cloudformation/).

1. Na página **Pilhas**, selecione a opção ao lado do nome da pilha que você criou (**BootstrapTutorialStack**) e escolha **Excluir.**

1. Quando a confirmação for solicitada, escolha **Excluir**.

1. Monitore o andamento do processo de exclusão da pilha na guia **Evento**. O status de **BootstrapTutorialStack** é alterado para `DELETE_IN_PROGRESS`. Quando o CloudFormation conclui a exclusão da pilha, ela é removida da lista.

## Próximas etapas
<a name="bootstrapping-tutorial-next-steps"></a>

Parabéns\$1 Você aprendeu com êxito como fazer bootstrap de instâncias do EC2 com o CloudFormation. Agora você já sabe:
+ Como usar scripts `cfn-init` auxiliares
+ Como estruturar metadados para bootstrapping
+ Como instalar pacotes, criar arquivos, executar comandos e gerenciar serviços
+ Como monitorar problemas de bootstrap

Para continuar aprendendo:
+ Saiba como atualizar uma pilha em execução e usar o script auxiliar `cfn-hup`. Para obter mais informações, consulte [Atualizar uma pilha do CloudFormation](updating.stacks.walkthrough.md).
+ Aprenda a fazer bootstrap de uma pilha do Windows. Para obter mais informações, consulte [Fazer o bootstrap de pilhas do CloudFormation baseadas em Windows](cfn-windows-stacks-bootstrapping.md).
+ Conheça cenários de bootstrap mais complexos com vários conjuntos de configurações. Para obter mais informações, consulte [cfn-init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-init.html) e [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html) no *Guia de referência de modelos do CloudFormation*.
+ Saiba mais sobre o script `cfn-signal` para relatar o status de conclusão do bootstrap. Para obter mais informações, consulte [cfn-signal](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-signal.html) no *Guia de referência de modelos do CloudFormation*.

# Atualizar uma pilha do CloudFormation
<a name="updating.stacks.walkthrough"></a>

**nota**  
Este tutorial se baseia nos conceitos apresentados no tutorial [Implantar aplicações no Amazon EC2](deploying.applications.md). Se você ainda não concluiu esse tutorial, recomendamos que o faça primeiro para entender a inicialização do EC2 com o CloudFormation.

Este tópico demonstra uma progressão simples de atualizações para uma pilha em execução. Demonstraremos as seguintes etapas:

1. **Criar a pilha inicial**: crie uma pilha usando uma AMI básica do Amazon Linux 2, instalando o Apache Web Server e uma aplicação PHP simples usando os scripts auxiliares do CloudFormation.

1. **Atualizar a aplicação**: atualize um dos arquivos na aplicação e implante o software usando o CloudFormation.

1. **Adicionar um par de chaves**: adicione um par de chaves do Amazon EC2 à instância e, em seguida, atualize o grupo de segurança para permitir acesso SSH à instância.

1. **Atualizar o tipo de instância**: altere o tipo de instância da instância subjacente do Amazon EC2.

1. **Atualizar a AMI**: altere a imagem de máquina da Amazon (AMI) para a instância do Amazon EC2 na sua pilha.

**nota**  
O CloudFormation é gratuito, mas os recursos do Amazon EC2 que você criar serão cobrados. Porém, se você for novo na AWS, poderá aproveitar o [nível gratuito](https://aws.amazon.com/free/) para minimizar ou eliminar os custos durante este processo de aprendizagem.

**Topics**
+ [Etapa 1: criar a pilha inicial](#update-stack-initial-stack)
+ [Etapa 2: atualizar a aplicação](#update-stack-update-application)
+ [Etapa 3: adicionar o acesso por SSH com um par de chaves](#update-stack-add-key-pair)
+ [Etapa 4: atualizar o tipo de instância](#update-stack-update-instance-type)
+ [Etapa 5: atualizar a AMI](#update-stack-update-ami)
+ [Considerações sobre disponibilidade e impacto](#update.walkthrough.impact)
+ [Recursos relacionados](#update.walkthrough.related)

## Etapa 1: criar a pilha inicial
<a name="update-stack-initial-stack"></a>

Vamos começar com a criação de uma pilha que possamos usar em todo o restante desta seção. Fornecemos um modelo simples que executa uma única aplicação web de instância PHP hospedada no Apache Web Server e em execução em uma AMI do Amazon Linux 2.

O Apache Web Server, o PHP e a aplicação PHP simples são instalados pelos scripts auxiliares do CloudFormation instalados por padrão na AMI do Amazon Linux 2. O trecho do modelo a seguir mostra os metadados que descrevem os pacotes e os arquivos a instalar, neste caso o Apache Web Server e a infraestrutura PHP do repositório Yum da AMI do Amazon Linux 2. O trecho também mostra a seção `Services`, que garante que o Apache Web Server esteja em execução. 

```
WebServerInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      config:
        packages:
          yum:
            httpd: []
            php: []
        files:
          /var/www/html/index.php:
            content: |
              <?php
              echo '<h1>Hello World!</h1>';
              ?>
            mode: '000644'
            owner: apache
            group: apache
        services:
          systemd:
            httpd:
              enabled: true
              ensureRunning: true
```

A aplicação em si é um exemplo de “Hello World” totalmente definida dentro do modelo. Para um aplicativo do mundo real, os arquivos podem ser armazenados no Amazon S3, no GitHub ou em outro repositório e referenciados a partir do modelo. O CloudFormation pode baixar pacotes (como RPMs ou RubyGems) nem referenciar arquivos individuais e expandir arquivos `.zip` e `.tar` para criar os artefatos da aplicação na instância do Amazon EC2.

O modelo habilita e configura o daemon `cfn-hup` para receber alterações na configuração definida nos metadados da instância do Amazon EC2. Usando o daemon `cfn-hup`, você pode atualizar o software de aplicação, como a versão do Apache ou do PHP, ou o próprio arquivo da aplicação PHP no CloudFormation. O trecho a seguir do mesmo recurso do Amazon EC2 no modelo mostra os itens necessários para configurar o `cfn-hup` para chamar o `cfn-init` a cada dois minutos para observar e aplicar atualizações nos metadados. Caso contrário, o `cfn-init` só é executado uma vez na inicialização.

```
files:
  /etc/cfn/cfn-hup.conf:
    content: !Sub |
      [main]
      stack=${AWS::StackId}
      region=${AWS::Region}
      # The interval used to check for changes to the resource metadata in minutes. Default is 15
      interval=2
    mode: '000400'
    owner: root
    group: root
  /etc/cfn/hooks.d/cfn-auto-reloader.conf:
    content: !Sub |
      [cfn-auto-reloader-hook]
      triggers=post.update
      path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
      action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
      runas=root
services:
  systemd:
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
```

Para concluir a pilha, na seção `Properties` da definição da instância do Amazon EC2, a propriedade `UserData` contém o script `cloud-init` que chama o `cfn-init` a fim de instalar os pacotes e arquivos. Para obter mais informações, consulte [Referência de scripts auxiliares do CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) no *Guia de referência de modelos do CloudFormation*. O modelo também cria um grupo de segurança do Amazon EC2.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          yum update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

**Para iniciar uma pilha desse modelo**

1. Copie o modelo e salve-o localmente no sistema como um arquivo de texto. Anote o local, pois será necessário usar o arquivo em uma etapa posterior.

1. Faça login no Console de gerenciamento da AWS e abra o console CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Escolha **Criar pilha, com novos recursos (padrão)**.

1. Escolha **Escolher um modelo existente**.

1. Em **Especificar modelo**, escolha **Carregar um arquivo de modelo** e navegue até o arquivo que você criou na primeira etapa e, em seguida, escolha **Avançar**.

1. Na página **Especificar detalhes da pilha**, insira **UpdateTutorial** como o nome da pilha.

1. Em **Parâmetros**, mantenha todos os parâmetros iguais e escolha **Avançar** duas vezes.

1. Na tela **Revisar e criar**, escolha **Enviar**.

Depois que o status da pilha for `CREATE_COMPLETE`, a guia **Saída** exibirá o URL de seu site. Se você clicar no valor da saída `WebsiteURL`, verá sua nova aplicação PHP funcionando.

## Etapa 2: atualizar a aplicação
<a name="update-stack-update-application"></a>

Agora que implantamos a pilha, vamos atualizar o aplicativo. Vamos fazer uma alteração simples no texto impresso pela aplicação. Para fazer isso, vamos adicionar um comando echo ao arquivo index.php como mostrado neste trecho de modelo:

```
files:
  /var/www/html/index.php:
    content: |
      <?php
      echo "<h1>Hello World!</h1>";
      echo "<p>This is an updated version of our application.</p>";
      ?>
    mode: '000644'
    owner: apache
    group: apache
```

Use um editor de texto para editar manualmente o arquivo de modelo que você salvou localmente.

Agora, atualize a pilha.

**Para atualizar a pilha com seu modelo atualizado**

1. No console do CloudFormation, selecione a pilha **UpdateTutorial**.

1. Escolha **Atualizar, fazer uma atualização direta**.

1. Escolha **Substituir modelo existente**.

1. Em **Especificar modelo**, escolha **Carregar um arquivo de modelo** e carregue o arquivo de modelo modificado, e depois escolha **Avançar**.

1. Na página **Especificar detalhes da pilha**, mantenha todos os parâmetros iguais e escolha **Avançar**.

1. Na página **Revisar**, analise suas alterações. Em **Alterações**, você verá que o CloudFormation atualizará o recurso `WebServerInstance`.

1. Selecione **Enviar**.

Quando a pilha estiver no estado `UPDATE_COMPLETE`, será possível escolher o valor da saída `WebsiteURL` novamente para verificar se as alterações da aplicação tiveram efeito. O daemon `cfn-hup` é executado a cada dois minutos e, portanto, pode levar até dois minutos para que a aplicação seja alterada após a atualização da pilha.

Para ver o conjunto de recursos que foram atualizados, vá para o console do CloudFormation. Na guia **Eventos**, examine os eventos da pilha. Neste caso específico, os metadados de `WebServerInstance` da instância do Amazon EC2 foram atualizados, o que fez o CloudFormation reavaliar também os outros recursos (`WebServerSecurityGroup`) para garantir que não havia outras alterações. Nenhum outro recurso da pilha foi modificado. O CloudFormation só atualiza os recursos da pilha que são afetados por alterações feitas na pilha. Tais alterações podem ser diretas, como alterações de propriedades ou metadados, ou podem ser devido a dependências ou fluxos de dados por meio de `Ref`, `GetAtt` ou outras funções intrínsecas do modelo. Para obter mais informações, consulte [Referência de funções intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

Essa atualização simples ilustra o processo. No entanto, você pode fazer alterações muito mais complexas nos arquivos e pacotes implantados nas instâncias do Amazon EC2. Por exemplo, você pode decidir que precisa adicionar o MySQL à instância, junto com suporte PHP para MySQL. Para fazer isso, basta adicionar outros pacotes e arquivos juntamente com todos os serviços adicionais à configuração e, em seguida, atualizar a pilha para implantar as alterações.

```
packages:
  yum:
    httpd: []
    php: []
    mysql: []
    php-mysql: []
    mysql-server: []
    mysql-libs: []

  ...

services:
  systemd:
    httpd:
      enabled: true
      ensureRunning: true
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    mysqld:
      enabled: true
      ensureRunning: true
```

Você pode atualizar os metadados do CloudFormation a fim de atualizar para novas versões dos pacotes usados pela aplicação. Nos exemplos anteriores, a propriedade de versão de cada pacote está vazia, indicando que o `cfn-init` deve instalar a versão mais recente do pacote.

```
packages:
  yum:
    httpd: []
    php: []
```

Opcionalmente, você pode especificar uma string de versão para um pacote. Se você alterar a string de versão em chamadas de pilha de atualização subsequentes, a nova versão do pacote será implantada. Veja um exemplo de como usar os números de versão para pacotes do RubyGems. Qualquer pacote compatível com o versionamento pode ter versões específicas.

```
packages:
  rubygems:
    mysql: []
    rubygems-update:
      - "1.6.2"
    rake:
      - "0.8.7"
    rails:
      - "2.3.11"
```

## Etapa 3: adicionar o acesso por SSH com um par de chaves
<a name="update-stack-add-key-pair"></a>

Também é possível atualizar um recurso no modelo para adicionar propriedades que não foram originalmente especificadas no modelo. Para ilustrar, vamos adicionar um par de chaves do Amazon EC2 a uma instância existente do EC2 e, em seguida, abrir a porta 22 no grupo de segurança do Amazon EC2 para que você possa usar o Secure Shell (SSH) para acessar a instância.

**Para adicionar acesso SSH a uma instância Amazon EC2 existente**

1. Adicione outros dois parâmetros ao modelo para transmitir o nome de um par de chaves do Amazon EC2 existente e a localização do SSH.

   ```
   Parameters:
     KeyName:
       Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
       Type: AWS::EC2::KeyPair::KeyName
       ConstraintDescription: must be the name of an existing EC2 KeyPair.
   
     SSHLocation:
       Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
       Type: String
       MinLength: 9
       MaxLength: 18
       Default: 0.0.0.0/0
       AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
       ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
   ```

1. Adicione a propriedade `KeyName` à instância Amazon EC2.

   ```
   WebServerInstance:
     Type: AWS::EC2::Instance
     Properties:
       ImageId: !Ref LatestAmiId
       InstanceType: !Ref InstanceType
       KeyName: !Ref KeyName
       SecurityGroupIds:
         - !Ref WebServerSecurityGroup
   ```

1. Adicione a porta 22 e a localização do SSH às regras de entrada referentes ao security group do Amazon EC2.

   ```
   WebServerSecurityGroup:
     Type: AWS::EC2::SecurityGroup
     Properties:
       GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
       SecurityGroupIngress:
         - IpProtocol: tcp
           FromPort: 80
           ToPort: 80
           CidrIp: 0.0.0.0/0
         - IpProtocol: tcp
           FromPort: 22
           ToPort: 22
           CidrIp: !Ref SSHLocation
   ```

1. Atualize a pilha usando as mesmas etapas explicadas em [Etapa 2: atualizar a aplicação](#update-stack-update-application).

## Etapa 4: atualizar o tipo de instância
<a name="update-stack-update-instance-type"></a>

Agora, vamos demonstrar como atualizar a infraestrutura subjacente alterando o tipo de instância.

A pilha criada até o momento usa uma instância t3.micro do Amazon EC2. Vamos supor que o site recém-criado esteja recebendo cada vez mais tráfego do que uma instância t3.micro pode processar, e agora você deseja mudar para um tipo de instância m5.large do Amazon EC2. Se a arquitetura do tipo de instância for alterada, a instância será criada com uma AMI diferente. No entanto, tanto a t3.micro quanto a m5.large usam as mesmas arquiteturas de CPU e executam AMIs do Amazon Linux 2 (x86\$164). Para obter mais informações, consulte [Compatibilidade para alterar o tipo de instância](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resize-limitations.html) no *Guia do usuário do Amazon EC2*.

Vamos usar o modelo que modificamos na etapa anterior para alterar o tipo de instância. Como `InstanceType` era um parâmetro de entrada para o modelo, não é necessário modificá-lo. É possível alterar o valor do parâmetro na página **Especificar detalhes da pilha**.

**Para atualizar a pilha com um novo valor de parâmetro**

1. No console do CloudFormation, selecione a pilha **UpdateTutorial**.

1. Escolha **Atualizar, fazer uma atualização direta**.

1. Escolha **Usar modelo existente** e depois **Avançar**.

1. Na página **Especificar detalhes da pilha**, altere o valor da caixa de texto **InstanceType** de `t3.micro` para `m5.large`. Em seguida, escolha **Avançar** duas vezes.

1. Na página **Revisar**, analise suas alterações. Em **Alterações**, você verá que o CloudFormation atualizará o recurso `WebServerInstance`.

1. Selecione **Enviar**.

Você pode alterar dinamicamente o tipo de instância de uma instância do Amazon EC2 baseada no EBS iniciando e parando a instância. O CloudFormation tenta otimizar a alteração atualizando o tipo de instância e reiniciando a instância, de modo que o ID de instância não seja alterado. Quando a instância é reiniciada, no entanto, o endereço IP público da instância é alterado. Para garantir que o endereço IP elástico esteja vinculado corretamente depois da alteração, o CloudFormation também o atualiza. Você pode ver as alterações no console do CloudFormation na guia **Eventos**.

Para verificar o tipo de instância a partir do Console de gerenciamento da AWS, abra o console do Amazon EC2 e localize sua instância.

## Etapa 5: atualizar a AMI
<a name="update-stack-update-ami"></a>

Agora, vamos atualizar nossa pilha para usar o Amazon Linux 2023, que é a próxima geração do Amazon Linux. 

A atualização da AMI é uma grande mudança que exige a substituição da instância. Não é possível simplesmente iniciar e interromper a instância para modificar a AMI. O CloudFormation considera isso uma alteração em uma propriedade imutável do recurso. Para alterar uma propriedade imutável, o CloudFormation precisa iniciar um recurso substituto, neste caso, uma nova instância do Amazon EC2 executando a nova AMI. 

Vamos conferir como podemos atualizar nosso modelo de pilha para usar o Amazon Linux 2023. As principais mudanças incluem a atualização do parâmetro da AMI e a mudança do `yum` para o gerenciador de pacotes `dnf`.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2023 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.

  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.

  SSHLocation:
    Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          dnf update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            dnf:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                echo "<p>This is an updated version of our application.</p>";
                echo "<p>Running on Amazon Linux 2023!</p>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

Atualize a pilha usando as mesmas etapas explicadas em [Etapa 2: atualizar a aplicação](#update-stack-update-application).

Depois que a nova instância está em execução, o CloudFormation atualiza os outros recursos da pilha para que apontem para o novo recurso. Quando todos os novos recursos são criados, o recurso antigo é excluído. Esse processo é conhecido como `UPDATE_CLEANUP`. Desta vez, você notará que o ID da instância e o URL do aplicativo da instância na pilha foram alterados como resultado da atualização. Os eventos na tabela **Evento** contêm uma descrição “A atualização solicitada tem uma alteração em uma propriedade imutável e, portanto, está criando um novo recurso físico” para indicar que um recurso foi substituído.

Como alternativa: se você tem um código de aplicação escrito na AMI que deseja atualizar, pode usar o mesmo mecanismo de atualização de pilha para atualizar a AMI para que ela carregue a nova aplicação.

**Para atualizar a AMI com o código personalizado da aplicação**

1. Crie a nova AMI contendo as alterações da aplicação ou do sistema operacional. Para mais informações, consulte [Criar uma AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html) com suporte do Amazon EBS na *Guia do Usuário do Amazon EC2.*

1. Atualize o modelo para incorporar o novo ID da AMI.

1. Atualize a pilha usando as mesmas etapas explicadas em [Etapa 2: atualizar a aplicação](#update-stack-update-application).

Ao atualizar a pilha, o CloudFormation detecta que o ID da AMI foi alterado e, em seguida, aciona uma atualização da pilha da mesma maneira que iniciamos a atualização demonstrada acima.

## Considerações sobre disponibilidade e impacto
<a name="update.walkthrough.impact"></a>

Diferentes propriedades têm diferentes impactos nos recursos na pilha. Você pode usar o CloudFormation para atualizar qualquer propriedade. No entanto, antes de fazer qualquer alteração, você deve considerar estas perguntas:

1. Como a atualização afeta o recurso em si? Por exemplo, a atualização de um limite de alarme deixará o alarme inativo durante a atualização. Como vimos, a alteração do tipo de instância exige que a instância seja parada e reiniciada. O CloudFormation usa as ações de atualizar ou modificar nos recursos subjacentes para alterá-los. Para compreender o impacto de atualizações, é necessário verificar a documentação dos recursos específicos.

1. A alteração é mutável ou imutável? Algumas alterações nas propriedades de recursos, como alteração da AMI em uma instância do Amazon EC2, não são compatíveis com os serviços subjacentes. No caso de alterações mutáveis, o CloudFormation usará APIs do tipo Atualizar ou Modificar para os recursos subjacentes. Para alterações de propriedade imutáveis, o CloudFormation criará novos recursos com as propriedades atualizadas e, em seguida, os vinculará à pilha antes de excluir os recursos antigos. Embora o CloudFormation tente reduzir o tempo de inatividade dos recursos de pilha, a substituição de um recurso é um processo de várias etapas e levará tempo. Durante a reconfiguração da pilha, seu aplicativo não estará totalmente operacional. Por exemplo, ele pode não ser capaz de atender a solicitações ou acessar um banco de dados.

## Recursos relacionados
<a name="update.walkthrough.related"></a>

Para obter mais informações sobre como usar o CloudFormation para iniciar aplicações e sobre a integração com outros serviços de configuração e implantação, como o Puppet e o Opscode Chef, consulte os seguintes whitepapers:
+ [Bootstrapping applications via CloudFormation](https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf)
+ [Integrating CloudFormation with Opscode Chef](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf)
+ [Integrating CloudFormation with Puppet](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithPuppet.pdf)

# Criar uma aplicação dimensionada e com balanceamento de carga
<a name="walkthrough-autoscaling"></a>

Neste passo a passo, você cria uma pilha que ajuda a configurar uma aplicação dimensionada e com balanceamento de carga. O passo a passo fornece um modelo de exemplo que você usa para criar a pilha. O modelo de exemplo provisiona um grupo do Auto Scaling, um Application Load Balancer, grupos de segurança que controlam o tráfego para o balanceador de carga e para o grupo do Auto Scaling e uma configuração de notificação do Amazon SNS para publicar notificações sobre atividades de escalabilidade. 

Esse modelo cria uma ou mais instâncias do Amazon EC2 e um Application Load Balancer. Você será cobrado pelos recursos da AWS usados se criar uma pilha com base nesse modelo. 

## Modelo de pilha completo
<a name="example-templates-autoscaling-full-stack-template"></a>

Vamos começar com o modelo.

**YAML**

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  InstanceType:
    Description: The EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.micro
      - t3.small
      - t3.medium
  KeyName:
    Description: Name of an existing EC2 key pair to allow SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
  OperatorEmail:
    Description: The email address to notify when there are any scaling activities
    Type: String
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  Subnets:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: At least two public subnets in different Availability Zones in the selected VPC
  VPC:
    Type: AWS::EC2::VPC::Id
    Description: A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet
Resources:
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EC2 Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        SourceSecurityGroupId:
          Fn::GetAtt:
          - ELBSecurityGroup
          - GroupId
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: !Ref SSHLocation
  EC2TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 15
      HealthyThresholdCount: 5
      Matcher:
        HttpCode: '200'
      Name: EC2TargetGroup
      Port: 80
      Protocol: HTTP
      TargetGroupAttributes:
      - Key: deregistration_delay.timeout_seconds
        Value: '20'
      UnhealthyThresholdCount: 3
      VpcId: !Ref VPC
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref EC2TargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: 80
      Protocol: HTTP
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      Subnets: !Ref Subnets
      SecurityGroups:
        - !GetAtt ELBSecurityGroup.GroupId
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: !Ref LatestAmiId
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        SecurityGroupIds: 
          - !Ref EC2SecurityGroup
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd
            systemctl start httpd
            systemctl enable httpd
            echo "<h1>Hello World!</h1>" > /var/www/html/index.html
  NotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MaxSize: '3'
      MinSize: '1'
      NotificationConfigurations:
        - TopicARN: !Ref NotificationTopic
          NotificationTypes: ['autoscaling:EC2_INSTANCE_LAUNCH', 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR', 'autoscaling:EC2_INSTANCE_TERMINATE', 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR']
      TargetGroupARNs:
        - !Ref EC2TargetGroup
      VPCZoneIdentifier: !Ref Subnets
```

**JSON**

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "InstanceType":{
      "Description":"The EC2 instance type",
      "Type":"String",
      "Default":"t3.micro",
      "AllowedValues":[
        "t3.micro",
        "t3.small",
        "t3.medium"
      ]
    },
    "KeyName":{
      "Description":"Name of an existing EC2 key pair to allow SSH access to the instances",
      "Type":"AWS::EC2::KeyPair::KeyName"
    },
    "LatestAmiId":{
      "Description":"The latest Amazon Linux 2 AMI from the Parameter Store",
      "Type":"AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
      "Default":"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    },
    "OperatorEmail":{
      "Description":"The email address to notify when there are any scaling activities",
      "Type":"String"
    },
    "SSHLocation":{
      "Description":"The IP address range that can be used to SSH to the EC2 instances",
      "Type":"String",
      "MinLength":9,
      "MaxLength":18,
      "Default":"0.0.0.0/0",
      "ConstraintDescription":"Must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "Subnets":{
      "Type":"List<AWS::EC2::Subnet::Id>",
      "Description":"At least two public subnets in different Availability Zones in the selected VPC"
    },
    "VPC":{
      "Type":"AWS::EC2::VPC::Id",
      "Description":"A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet"
    }
  },
  "Resources":{
    "ELBSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"ELB Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "EC2SecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"EC2 Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "SourceSecurityGroupId":{
              "Fn::GetAtt":[
                "ELBSecurityGroup",
                "GroupId"
              ]
            }
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":{
              "Ref":"SSHLocation"
            }
          }
        ]
      }
    },
    "EC2TargetGroup":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":30,
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":15,
        "HealthyThresholdCount":5,
        "Matcher":{
          "HttpCode":"200"
        },
        "Name":"EC2TargetGroup",
        "Port":80,
        "Protocol":"HTTP",
        "TargetGroupAttributes":[
          {
            "Key":"deregistration_delay.timeout_seconds",
            "Value":"20"
          }
        ],
        "UnhealthyThresholdCount":3,
        "VpcId":{
          "Ref":"VPC"
        }
      }
    },
    "ALBListener":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "TargetGroupArn":{
              "Ref":"EC2TargetGroup"
            }
          }
        ],
        "LoadBalancerArn":{
          "Ref":"ApplicationLoadBalancer"
        },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ApplicationLoadBalancer":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "Subnets":{
          "Ref":"Subnets"
        },
        "SecurityGroups":[
          {
            "Fn::GetAtt":[
              "ELBSecurityGroup",
              "GroupId"
            ]
          }
        ]
      }
    },
    "LaunchTemplate":{
      "Type":"AWS::EC2::LaunchTemplate",
      "Properties":{
        "LaunchTemplateName":{
          "Fn::Sub":"${AWS::StackName}-launch-template"
        },
        "LaunchTemplateData":{
          "ImageId":{
            "Ref":"LatestAmiId"
          },
          "InstanceType":{
            "Ref":"InstanceType"
          },
          "KeyName":{
            "Ref":"KeyName"
          },
          "SecurityGroupIds":[
            {
              "Ref":"EC2SecurityGroup"
            }
          ],
          "UserData":{
            "Fn::Base64":{
              "Fn::Join":[
                "",
                [
                  "#!/bin/bash\n",
                  "yum update -y\n",
                  "yum install -y httpd\n",
                  "systemctl start httpd\n",
                  "systemctl enable httpd\n",
                  "echo \"<h1>Hello World!</h1>\" > /var/www/html/index.html"
                ]
              ]
            }
          }
        }
      }
    },
    "NotificationTopic":{
      "Type":"AWS::SNS::Topic",
      "Properties":{
        "Subscription":[
          {
            "Endpoint":{
              "Ref":"OperatorEmail"
            },
            "Protocol":"email"
          }
        ]
      }
    },
    "WebServerGroup":{
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"LaunchTemplate"
          },
          "Version":{
            "Fn::GetAtt":[
              "LaunchTemplate",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"3",
        "MinSize":"1",
        "NotificationConfigurations":[
          {
            "TopicARN":{
              "Ref":"NotificationTopic"
            },
            "NotificationTypes":[
              "autoscaling:EC2_INSTANCE_LAUNCH",
              "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
              "autoscaling:EC2_INSTANCE_TERMINATE",
              "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
            ]
          }
        ],
        "TargetGroupARNs":[
          {
            "Ref":"EC2TargetGroup"
          }
        ],
        "VPCZoneIdentifier":{
          "Ref":"Subnets"
        }
      }
    }
  }
}
```

## Demonstração do modelo
<a name="example-templates-autoscaling-description"></a>

A primeira parte desse modelo especifica o `Parameters`. A cada parâmetro deve receber um valor em tempo de execução para que o CloudFormation provisione a pilha com êxito. Os recursos especificados mais tarde nesse modelo fazem referência a esses valores e usam os dados.
+ `InstanceType`: o tipo de instância do EC2 provisionado pelo Amazon EC2 Auto Scaling. Se não especificado, um padrão de `t3.micro` será usado.
+ `KeyName`: um par de chaves do EC2 existente para permitir o acesso SSH às instâncias.
+ `LatestAmiId`: a imagem de máquina da Amazon (AMI) para as instâncias. Se não for especificada, suas instâncias serão iniciadas com uma AMI do Amazon Linux 2, usando um parâmetro público AWS Systems Manager mantido pelo AWS. Para obter mais informações, consulte [Localizar parâmetros públicos](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html), no *Guia do usuário do AWS Systems Manager*.
+ `OperatorEmail`: o endereço de e-mail para o qual você deseja enviar notificações de atividade de escalabilidade.
+ `SSHLocation`: o intervalo de endereços IP que pode ser usado para aplicar SSH nas instâncias.
+ `Subnets`: pelo menos duas sub-redes públicas devem estar em diferentes zonas de disponibilidade. 
+ `VPC`: uma nuvem privada virtual (VPC) na sua conta que permite aos recursos em sub-redes públicas se conectarem à Internet. 
**nota**  
Você pode usar a VPC padrão e as sub-redes padrão para permitir que as instâncias acessem a Internet. Nesse último caso, certifique-se de que a VPC tenha uma sub-rede mapeada para cada zona de disponibilidade da região na qual você está trabalhando. No mínimo, é necessário ter duas sub-redes públicas disponíveis para criar o balanceador de carga.

A próxima parte desse modelo especifica o `Resources`. Esta seção especifica os recursos da pilha e suas propriedades.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) do recurso `ELBSecurityGroup` 
+ `SecurityGroupIngress` contém uma regra de entrada TCP que permite acesso de *todos os endereços IP* (“CidrIp”: “0.0.0.0/0") na porta 80.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) do recurso `EC2SecurityGroup` 
+ `SecurityGroupIngress` contém duas regras de entrada: 1) uma regra de entrada TCP que permite acesso SSH (porta 22) a partir do intervalo de endereços IP que você fornece ao parâmetro de entrada `SSHLocation` e 2) uma regra de entrada TCP que permite acesso do balanceador de carga especificando o grupo de segurança do balanceador de carga. A função [GetAtt](resources-section-structure.md#resource-properties-getatt) é usada para obter o ID do grupo de segurança com o nome lógico `ELBSecurityGroup`.

Recurso [AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) `EC2TargetGroup`
+ `Port`, `Protocol` e `HealthCheckProtocol` especificam a porta da instância (80) e o protocolo (HTTP) para onde o `ApplicationLoadBalancer` roteia o tráfego e que o Elastic Load Balancing utiliza para verificar a integridade das instâncias do EC2.
+ `HealthCheckIntervalSeconds` especifica que as instâncias do EC2 têm um intervalo de 30 segundos entre verificações de integridade. O `HealthCheckTimeoutSeconds` é definido como o tempo que Elastic Load Balancing espera por uma resposta do destino da verificação de integridade (15 segundos neste exemplo). Após o tempo limite, o Elastic Load Balancing marca essa verificação de integridade da instância do EC2 como não íntegra. Quando uma instância do EC2 falha em três verificações de integridade consecutivas (`UnhealthyThresholdCount`), o Elastic Load Balancing interrompe o roteamento do tráfego para essa instância do EC2 até que ela tenha cinco verificações de integridade positivas consecutivas (`HealthyThresholdCount`). Nesse ponto, o Elastic Load Balancing considera a instância íntegra e começa a rotear o tráfego para ela novamente.
+ `TargetGroupAttributes` atualiza o valor do atraso de cancelamento do registro do grupo de destino para 20 segundos. Por padrão, o Elastic Load Balancing aguarda 300 segundos antes de concluir o processo de cancelamento do registro.

Recurso [AWS::ElasticLoadBalancingV2::Listener](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) `ALBListener`
+ `DefaultActions` especifica a porta na qual o balanceador de carga escuta, o grupo de destino ao qual o balanceador de carga encaminha solicitações e o protocolo usado para rotear as solicitações.

Recurso [AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html) `ApplicationLoadBalancer`
+ `Subnets` usa o valor do parâmetro de entrada `Subnets` como a lista de sub-redes públicas nas quais os nós do balanceador de carga serão criados.
+ `SecurityGroup` obtém o ID do grupo de segurança que atua como um firewall virtual para seus nós de balanceador de carga a fim de controlar o tráfego de entrada. A função [GetAtt](resources-section-structure.md#resource-properties-getatt) é usada para obter o ID do grupo de segurança com o nome lógico `ELBSecurityGroup`.

Recurso [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) `LaunchTemplate`
+ `ImageId` usa o valor do parâmetro de entrada `LatestAmiId` como a AMI a ser usada.
+ `KeyName` usa o valor do parâmetro de entrada `KeyName` como o par de chaves do EC2 a ser usado.
+ `SecurityGroupIds` obtém o ID do grupo de segurança com o nome lógico `EC2SecurityGroup` que atua como um firewall virtual para suas instâncias do EC2 a fim de controlar o tráfego de entrada.
+ `UserData` é um script de configuração executado depois que a instância está ativa e em execução. Neste exemplo, o script instala o Apache e cria um arquivo index.html.

Recurso [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) `NotificationTopic`
+ `Subscription` usa o valor do parâmetro de entrada `OperatorEmail` como o endereço de e-mail do destinatário das notificações quando há atividades de escalabilidade. 

Recurso [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) `WebServerGroup`
+ `MinSize` e `MaxSize` definem os números mínimo e máximo de instâncias do EC2 no grupo do Auto Scaling.
+ `TargetGroupARNs` usa o ARN do grupo de destino com o nome lógico `EC2TargetGroup`. À medida que esse grupo do Auto Scaling é escalado, ele automaticamente registra e cancela o registro de instâncias nesse grupo de destino.
+ `VPCZoneIdentifier` usa o valor do parâmetro de entrada `Subnets` como a lista de sub-redes públicas nas quais as instâncias do EC2 podem ser criadas.

## Etapa 1: Iniciar a pilha
<a name="example-templates-autoscaling-launch-stack"></a>

Para iniciar a pilha, verifique se você tem permissões do AWS Identity and Access Management (IAM) para usar todos estes serviços: Amazon EC2, Amazon EC2 Auto Scaling,AWS Systems Manager, Elastic Load Balancing, Amazon SNS e CloudFormation. 

O procedimento a seguir envolve o upload do modelo de pilha de amostra a partir de um arquivo. Abra um editor de texto na máquina local e adicione um dos modelos. Salve o arquivo com o nome `sampleloadbalancedappstack.template`.

**Para executar o modelo de pilha**

1. Faça login no Console de gerenciamento da AWS e abra o console CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Escolha **Create stack (Criar pilha)**, **With new resources (Com novos recursos (padrão))**.

1. Em **Especificar modelo**, escolha **Carregar um arquivo de modelo**, **Escolher arquivo** para carregar o arquivo `sampleloadbalancedappstack.template`. 

1. Escolha **Próximo**.

1. Na página **Specify stack details** (Especificar detalhes da pilha), digite um nome para a pilha (por exemplo, **SampleLoadBalancedAppStack**).

1. Em **Parameters** (Parâmetros), analise os parâmetros da pilha e forneça valores para todos os parâmetros que não tenham valores padrão, incluindo **OperatorEmail**, **SSHLocation**, **KeyName**, **VPC** e **Subnets**.

1. Escolha **Next** (Próximo) duas vezes.

1. Na página **Revisar**, verifique e confirme as configurações.

1. Selecione **Enviar**.

   Você pode visualizar o status da pilha no console do CloudFormation, na coluna **Status**. Quando o CloudFormation criar a pilha, você receberá o status **CREATE\$1COMPLETE**.
**nota**  
Depois de criar a pilha, você deve confirmar a assinatura para que o endereço de e-mail possa começar a receber notificações. Para obter mais informações, consulte [Obter notificações do Amazon SNS quando o grupo do Auto Scaling é dimensionado](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-sns-notifications.html) no *Guia do usuário do Amazon EC2 Auto Scaling*.

## Etapa 2: limpar recursos de amostra
<a name="example-templates-autoscaling-clean-up"></a>

Para ter certeza de que você não será cobrado por recursos de amostra não utilizados, exclua a pilha.

**Para excluir a pilha**

1. No console do CloudFormation, selecione a pilha **SampleLoadBalancedAppStack**.

1. Escolha **Excluir**.

1. Na mensagem de confirmação, escolha **Delete stack** (Excluir pilha).

   O status de **SampleLoadBalancedAppStack** muda para **DELETE\$1IN\$1PROGRESS**. Quando o CloudFormation conclui a exclusão da pilha, ela é removida da lista.

Use o modelos de exemplo deste passo a passo para criar seus próprios modelos de pilha. Para obter mais informações, consulte [Tutorial: Configurar uma aplicação dimensionada e com balanceamento de carga](https://docs.aws.amazon.com/autoscaling/ec2/userguide/tutorial-ec2-auto-scaling-load-balancer.html), no *Guia do usuário do Amazon EC2 Auto Scaling*.

# Emparelhar com uma VPC em outra Conta da AWS
<a name="peer-with-vpc-in-another-account"></a>

Você pode emparelhar com uma nuvem privada virtual (VPC) em outra Conta da AWS usando [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html). Isso cria uma conexão de rede entre duas VPCs que permite rotear o tráfego entre elas, de maneira que elas possam se comunicar como se estivessem na mesma rede. uma conexão de pareamento da VPC pode ajudar a facilitar o acesso e a transferência dos dados.

Para estabelecer uma conexão de emparelhamento da VPC, você precisa autorizar duas Contas da AWS separadas dentro de uma única pilha do CloudFormation.

Consulte mais informações sobre o emparelhamento de VPCs e suas limitações no [Guia de emparelhamento da Amazon VPC](https://docs.aws.amazon.com/vpc/latest/peering/). 

## Pré-requisitos
<a name="peer-with-vpc-in-another-account-prerequisites"></a>

1. Você precisa de um ID da VPC pareada, um ID de Conta da AWS e uma [função de acesso de conta cruzada](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html) para a conexão de pareamento. 
**nota**  
Esta descrição se refere a duas contas: a primeira é uma conta que permite o pareamento de contas cruzadas (a *conta de aceitação*). A segunda é uma conta que solicita a conexão de pareamento (a *conta solicitante*).

1. Para aceitar a conexão de pareamento da VPC, a função de acesso de conta cruzada deve ser assumível por você. O recurso se comporta da mesma maneira que um recurso de conexão de pareamento da VPC na mesma conta. Para obter mais informações sobre como um administrador do IAM concede aos usuários permissões para assumir o perfil entre contas, consulte [Conceder permissões a um usuário para alternar perfis](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html) no *Guia do usuário do IAM*.

## Etapa 1: Criar uma VPC e uma função de conta cruzada
<a name="step-1-create-vpc-and-cross-account-role"></a>

Nesta etapa, você criará a VPC e a função na *conta de aceitação*.

**Para criar uma VPC e um perfil de acesso entre contas**

1. Faça login no Console de gerenciamento da AWS e abra o console CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Na página **Pilhas**, escolha **Criar pilha** no canto superior direito e depois **Com novos recursos (padrão)**.

1. Em **Pré-requisito: preparar modelo**, escolha **Escolher um modelo existente** e depois **Carregar um arquivo de modelo**, **Escolher arquivo**.

1. Abra um editor de texto na máquina local e adicione um dos modelos a seguir. Salve o arquivo e volte ao console para selecioná-lo como o arquivo de modelo.  
**Example JSON**  

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Description": "Create a VPC and an assumable role for cross account VPC peering.",
     "Parameters": {
       "PeerRequesterAccountId": {
         "Type": "String"
       }
     },
     "Resources": {
       "vpc": {
         "Type": "AWS::EC2::VPC",
         "Properties": {
           "CidrBlock": "10.1.0.0/16",
           "EnableDnsSupport": false,
           "EnableDnsHostnames": false,
           "InstanceTenancy": "default"
         }
       },
       "peerRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
           "AssumeRolePolicyDocument": {
             "Statement": [
               {
                 "Principal": {
                   "AWS": {
                     "Ref": "PeerRequesterAccountId"
                   }
                 },
                 "Action": [
                   "sts:AssumeRole"
                 ],
                 "Effect": "Allow"
               }
             ]
           },
           "Path": "/",
           "Policies": [
             {
               "PolicyName": "root",
               "PolicyDocument": {
                 "Version": "2012-10-17",		 	 	 
                 "Statement": [
                   {
                     "Effect": "Allow",
                     "Action": "ec2:AcceptVpcPeeringConnection",
                     "Resource": "*"
                   }
                 ]
               }
             }
           ]
         }
       }
     },
     "Outputs": {
       "VPCId": {
         "Value": {
           "Ref": "vpc"
         }
       },
       "RoleARN": {
         "Value": {
           "Fn::GetAtt": [
             "peerRole",
             "Arn"
           ]
         }
       }
     }
   }
   ```  
**Example YAML**  

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Description: Create a VPC and an assumable role for cross account VPC peering.
   Parameters:
     PeerRequesterAccountId:
       Type: String
   Resources:
     vpc:
       Type: AWS::EC2::VPC
       Properties:
         CidrBlock: 10.1.0.0/16
         EnableDnsSupport: false
         EnableDnsHostnames: false
         InstanceTenancy: default
     peerRole:
       Type: AWS::IAM::Role
       Properties:
         AssumeRolePolicyDocument:
           Statement:
             - Principal:
                 AWS: !Ref PeerRequesterAccountId
               Action:
                 - 'sts:AssumeRole'
               Effect: Allow
         Path: /
         Policies:
           - PolicyName: root
             PolicyDocument:
               Version: 2012-10-17 		 	 	 
               Statement:
                 - Effect: Allow
                   Action: 'ec2:AcceptVpcPeeringConnection'
                   Resource: '*'
   Outputs:
     VPCId:
       Value: !Ref vpc
     RoleARN:
       Value: !GetAtt 
         - peerRole
         - Arn
   ```

1. Escolha **Próximo**.

1. Dê um nome à pilha (por exemplo, **VPC-owner**) e insira o ID da Conta da AWS; da *conta solicitante* no campo **PeerRequesterAccountId**.

1. Aceite os padrões e escolha **Próximo**.

1. Escolha **Reconheço que o CloudFormation pode criar recursos do IAM** e escolha **Criar pilha**.

## Etapa 2: Criar um modelo que inclua `AWS::EC2::VPCPeeringConnection`
<a name="step-2-create-template-for-vpc-peering-connection-owner"></a>

Agora que já criou a VPC e a função de conta cruzada, você pode parear com a VPC usando outra Conta da AWS (a *conta solicitante*).

**Para criar um modelo que inclua o recurso [AWS::EC2::VPCPeeringConnection](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html)**

1. Volte para a página inicial do console do CloudFormation.

1. Na página **Pilhas**, escolha **Criar pilha** no canto superior direito e depois **Com novos recursos (padrão)**.

1. Em **Pré-requisito: preparar modelo**, escolha **Escolher um modelo existente** e depois **Carregar um arquivo de modelo**, **Escolher arquivo**.

1. Abra um editor de texto na máquina local e adicione um dos modelos a seguir. Salve o arquivo e volte ao console para selecioná-lo como o arquivo de modelo.  
**Example JSON**  

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Description": "Create a VPC and a VPC Peering connection using the PeerRole to accept.",
     "Parameters": {
       "PeerVPCAccountId": {
         "Type": "String"
       },
       "PeerVPCId": {
         "Type": "String"
       },
       "PeerRoleArn": {
         "Type": "String"
       }
     },
     "Resources": {
       "vpc": {
         "Type": "AWS::EC2::VPC",
         "Properties": {
           "CidrBlock": "10.2.0.0/16",
           "EnableDnsSupport": false,
           "EnableDnsHostnames": false,
           "InstanceTenancy": "default"
         }
       },
       "vpcPeeringConnection": {
         "Type": "AWS::EC2::VPCPeeringConnection",
         "Properties": {
           "VpcId": {
             "Ref": "vpc"
           },
           "PeerVpcId": {
             "Ref": "PeerVPCId"
           },
           "PeerOwnerId": {
             "Ref": "PeerVPCAccountId"
           },
           "PeerRoleArn": {
             "Ref": "PeerRoleArn"
           }
         }
       }
     },
     "Outputs": {
       "VPCId": {
         "Value": {
           "Ref": "vpc"
         }
       },
       "VPCPeeringConnectionId": {
         "Value": {
           "Ref": "vpcPeeringConnection"
         }
       }
     }
   }
   ```  
**Example YAML**  

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Description: Create a VPC and a VPC Peering connection using the PeerRole to accept.
   Parameters:
     PeerVPCAccountId:
       Type: String
     PeerVPCId:
       Type: String
     PeerRoleArn:
       Type: String
   Resources:
     vpc:
       Type: AWS::EC2::VPC
       Properties:
         CidrBlock: 10.2.0.0/16
         EnableDnsSupport: false
         EnableDnsHostnames: false
         InstanceTenancy: default
     vpcPeeringConnection:
       Type: AWS::EC2::VPCPeeringConnection
       Properties:
         VpcId: !Ref vpc
         PeerVpcId: !Ref PeerVPCId
         PeerOwnerId: !Ref PeerVPCAccountId
         PeerRoleArn: !Ref PeerRoleArn
   Outputs:
     VPCId:
       Value: !Ref vpc
     VPCPeeringConnectionId:
       Value: !Ref vpcPeeringConnection
   ```

1. Escolha **Próximo**.

1. Dê um nome à pilha (por exemplo, **VPC-peering-connection**).

1. Aceite os padrões e escolha **Próximo**.

1. Escolha **Reconheço que o CloudFormation pode criar recursos do IAM** e escolha **Criar pilha**.

## Criar um modelo com uma política altamente restritiva
<a name="create-template-with-highly-restrictive-policy"></a>

Convém criar uma política de pareamento altamente restritiva para a VPC usando outra Conta da AWS. 

O modelo de exemplo a seguir mostra como alterar o modelo do proprietário pareado da VPC (a *conta de aceitação* criada na Etapa 1 acima), de maneira que ele seja mais restritivo.

**Example JSON**  

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Description":"Create a VPC and an assumable role for cross account VPC peering.",
  "Parameters":{
    "PeerRequesterAccountId":{
      "Type":"String"
    }
  },
  "Resources":{
    "peerRole":{
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument":{
          "Statement":[
            {
              "Action":[
                "sts:AssumeRole"
              ],
              "Effect":"Allow",
              "Principal":{
                "AWS":{
                  "Ref":"PeerRequesterAccountId"
                }
              }
            }
          ]
        },
        "Path":"/",
        "Policies":[
          {
            "PolicyDocument":{
              "Statement":[
                {
                  "Action":"ec2:acceptVpcPeeringConnection",
                  "Effect":"Allow",
                  "Resource":{
                    "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}"
                  }
                },
                {
                  "Action":"ec2:acceptVpcPeeringConnection",
                  "Condition":{
                    "StringEquals":{
                      "ec2:AccepterVpc":{
                        "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}"
                      }
                    }
                  },
                  "Effect":"Allow",
                  "Resource":{
                    "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc-peering-connection/*"
                  }
                }
              ],
              "Version":"2012-10-17" 		 	 	 
            },
            "PolicyName":"root"
          }
        ]
      }
    },
    "vpc":{
      "Type":"AWS::EC2::VPC",
      "Properties":{
        "CidrBlock":"10.1.0.0/16",
        "EnableDnsHostnames":false,
        "EnableDnsSupport":false,
        "InstanceTenancy":"default"
      }
    }
  },
  "Outputs":{
    "RoleARN":{
      "Value":{
        "Fn::GetAtt":[
          "peerRole",
          "Arn"
        ]
      }
    },
    "VPCId":{
      "Value":{
        "Ref":"vpc"
      }
    }
  }
}
```

**Example YAML**  

```
AWSTemplateFormatVersion: 2010-09-09
Description: Create a VPC and an assumable role for cross account VPC peering.
Parameters:
  PeerRequesterAccountId:
    Type: String
Resources:
  peerRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              AWS:
                Ref: PeerRequesterAccountId
      Path: /
      Policies:
        - PolicyDocument:
            Statement:
              - Action: 'ec2:acceptVpcPeeringConnection'
                Effect: Allow
                Resource:
                  'Fn::Sub': 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
              - Action: 'ec2:acceptVpcPeeringConnection'
                Condition:
                  StringEquals:
                    'ec2:AccepterVpc':
                      'Fn::Sub': 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
                Effect: Allow
                Resource:
                  'Fn::Sub': >-
                    arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc-peering-connection/*
            Version: 2012-10-17 		 	 	 
          PolicyName: root
  vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      EnableDnsHostnames: false
      EnableDnsSupport: false
      InstanceTenancy: default
Outputs:
  RoleARN:
    Value:
      'Fn::GetAtt':
        - peerRole
        - Arn
  VPCId:
    Value:
      Ref: vpc
```

Para acessar o VPC, você pode usar o mesmo modelo solicitante como na Etapa 2 acima.

Para obter mais informações, consulte [Identity and Access Management para emparelhamento de VPC ](https://docs.aws.amazon.com/vpc/latest/peering/security-iam.html) no *Guia de emparelhamento de Amazon VPC*.

# Executar implantações azuis/verdes do ECS por meio do CodeDeploy usando o CloudFormation
<a name="blue-green"></a>

Para atualizar uma aplicação em execução no Amazon Elastic Container Service (Amazon ECS), é possível usar uma estratégia de implantação azul/verde do CodeDeploy. Essa estratégia ajuda a minimizar as interrupções causadas pela alteração das versões da aplicação. 

Em uma implantação azul/verde, você cria um novo ambiente de aplicação (chamado de *verde*) junto com seu ambiente ativo atual (chamado de *azul*). Isso permite que você monitore e teste o ambiente verde antes de encaminhar o tráfego ao vivo do ambiente azul para o ambiente verde. Depois que o ambiente verde estiver servindo tráfego ao vivo, você poderá encerrar o ambiente azul com segurança.

Para permitir que o CloudFormation execute implantações azuis/verdes em uma pilha, inclua as seguintes informações no modelo de pilha:
+ Uma seção `Hooks` que descreve um hook `AWS::CodeDeploy::BlueGreen`.
+  Uma seção `Transform` que especifica a transformação `AWS::CodeDeployBlueGreen`.

Os tópicos a seguir orientam você ao longo da configuração de um modelo do CloudFormation para uma implantação azul/verde no ECS.

**Topics**
+ [Sobre implantações azuis/verdes](about-blue-green-deployments.md)
+ [Considerações ao gerenciar implantações azul/verde do ECS usando o CloudFormation](blue-green-considerations.md)
+ [Sintaxe do hook `AWS::CodeDeploy::BlueGreen`](blue-green-hook-syntax.md)
+ [Exemplo de modelo de implantação azul/verde](blue-green-template-example.md)

# Sobre implantações azuis/verdes
<a name="about-blue-green-deployments"></a>

Este tópico fornece uma visão geral de como realizar implantações azuis/verdes com o CloudFormation. Ele também explica como preparar seu modelo do CloudFormation para implantações azuis/verdes.

**Topics**
+ [Como funciona](#blue-green-how-it-works)
+ [Atualizações de recursos que iniciam implantações verdes](#blue-green-resources)
+ [Preparar o modelo do](#blue-green-setup)
+ [Modelar sua implantação azul/verde](#blue-green-required)
+ [Conjuntos de alterações](#blue-green-changesets)
+ [Monitorar eventos da pilha](#blue-green-events)
+ [permissões do IAM](#blue-green-iam)

## Como funciona
<a name="blue-green-how-it-works"></a>

Ao usar o CloudFormation para executar implantações azuis/verdes do ECS via CodeDeploy, você começa criando um modelo de pilha que define os recursos para seus ambientes de aplicativo azul e verde, incluindo a especificação das configurações de roteamento de tráfego e de estabilização a serem usadas. Em seguida, você cria uma pilha com base nesse modelo. Isso gera sua aplicação azul (atual). O CloudFormation cria somente os recursos azuis durante a criação da pilha. Os recursos para uma implantação verde não são criados até que sejam necessários.

Depois, se em uma futura atualização de pilha você atualizar os recursos de definição de tarefa ou do conjunto de tarefas no aplicativo azul, o CloudFormation fará o seguinte:
+ Gerará todos os recursos de ambiente do aplicativo verde necessários
+ Deslocará o tráfego com base nos parâmetros de roteamento de tráfego especificados
+ Excluirá os recursos azuis

Se ocorrer um erro em qualquer ponto antes da implantação verde ser finalizada com êxito, o CloudFormation reverterá a pilha para seu estado anterior ao início de toda a implantação verde.

## Atualizações de recursos que iniciam implantações verdes
<a name="blue-green-resources"></a>

Quando você executa uma atualização de pilha que atualiza determinadas propriedades de recursos do ECS, o CloudFormation inicia um processo de implantação verde. Os recursos que iniciam esse processo são:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html) 

No entanto, se as atualizações desses recursos não envolverem alterações de propriedade que exijam substituição, uma implantação ecológica não será iniciada. Para obter mais informações, consulte [Compreender atualização de comportamentos de recursos da pilha](using-cfn-updating-stacks-update-behaviors.md).

É importante observar que não é possível combinar atualizações para os recursos acima com atualizações para outros recursos na mesma operação de atualização de pilha. Se precisar atualizar os recursos listados e outros recursos na mesma pilha, você terá duas opções:
+ Execute duas operações de atualização de pilha separadas: uma que inclua somente as atualizações para os recursos acima e uma atualização de pilha separada que inclua alterações em quaisquer outros recursos.
+ Remova as seções `Transform` e `Hooks` do modelo e execute a atualização da pilha. Neste caso, o CloudFormation não executará uma implantação verde.

## Preparar seu modelo para executar implantações azul/verde do ECS
<a name="blue-green-setup"></a>

Para permitir implantações azul/verde em sua pilha, inclua as seções a seguir no modelo de pilha antes de executar uma atualização dela.
+ Adicione uma referência à transformação `AWS::CodeDeployBlueGreen` ao modelo:

  ```
  "Transform": [
    "AWS::CodeDeployBlueGreen"
  ],
  ```
+ Adicione uma seção `Hooks` que invoque o hook `AWS::CodeDeploy::BlueGreen` e especifique as propriedades para a implantação. Para obter mais informações, consulte [Sintaxe do hook `AWS::CodeDeploy::BlueGreen`](blue-green-hook-syntax.md).
+ Na seção `Resources`, defina os recursos azuis e verdes para a implantação.

É possível adicionar essas seções ao criar o modelo pela primeira vez (ou seja, antes de criar a pilha) ou adicioná-las a um modelo existente antes de executar uma atualização de pilha. Se você especificar a implantação azul/verde para uma nova pilha, o CloudFormation criará somente os recursos azuis durante a criação. Os recursos para a implantação verde não serão criados até que sejam necessários durante uma atualização da pilha.

## Modelar sua implantação azul/verde usando recursos do CloudFormation
<a name="blue-green-required"></a>

Para executar a implantação azul/verde do CodeDeploy no ECS, o modelo do CloudFormation deverá incluir os recursos que modelam sua implantação, como um serviço do Amazon ECS e um balanceador de carga. Para mais detalhes sobre o que esses recursos representam, consulte [Antes de iniciar uma implantação do Amazon ECS](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-steps-ecs.html#deployment-steps-prerequisites-ecs) no *Guia do usuário do AWS CodeDeploy*.


| Requisito | Recurso | Obrigatório/opcional | Inicia a implantação azul/verde se substituído? | 
| --- | --- | --- | --- | 
| Cluster do Amazon ECS | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html) | Opcional. O cluster padrão pode ser usado. | Não | 
| Serviço do Amazon ECS | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html) | Obrigatório. | Não | 
| Application ou Network Load Balancer | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html) | Obrigatório. | Não | 
| Listener de produção | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | Obrigatório. | Não | 
| Listener de teste  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | Opcional. | Não | 
| Dois grupos de destino | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) | Obrigatório. | Não | 
| Definição de tarefa do Amazon ECS  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html) | Obrigatório. | Sim | 
| Contêiner para seu aplicativo do Amazon ECS | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name) | Obrigatório. | Não | 
| Porta para o conjunto de tarefas de substituição | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport) | Obrigatório. | Não | 

## Conjuntos de alterações
<a name="blue-green-changesets"></a>

É altamente recomendável que você crie um conjunto de alterações antes de executar uma atualização de pilha que iniciará uma implantação verde. Isso permite que você veja as alterações que serão feitas na pilha antes da execução da atualização da pilha. Esteja ciente de que as alterações de recursos podem não ser listadas na ordem em que serão executadas durante a atualização da pilha. Para obter mais informações, consulte [Atualizar pilhas do CloudFormation usando conjuntos de alterações](using-cfn-updating-stacks-changesets.md).

## Monitorar eventos da pilha
<a name="blue-green-events"></a>

É possível visualizar os eventos da pilha gerados em cada etapa da implantação do ECS na guia **Events** (Eventos) da página **Stack** (Pilha) e usando a AWS CLI. Para obter mais informações, consulte [Monitorar o progresso da pilha](monitor-stack-progress.md).

## Permissões do IAM para implantações azuis/verdes
<a name="blue-green-iam"></a>

Para que o CloudFormation execute com sucesso as implantações azul/verde, você deve ter as seguintes permissões do CodeDeploy:
+ `codedeploy:Get*`
+ `codedeploy:CreateCloudFormationDeployment`

Para obter mais informações, consulte [Ações, recursos e chaves de condição do CodeDeploy](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awscodedeploy.html) na *Referência de autorização do serviço*.

# Considerações ao gerenciar implantações azul/verde do ECS usando o CloudFormation
<a name="blue-green-considerations"></a>

O processo de usar o CloudFormation para realizar implantações azuis/verdes do ECS por meio do CodeDeploy é diferente de uma implantação padrão do ECS que usa somente o CodeDeploy. Para obter uma compreensão detalhada dessas diferenças, consulte [Diferenças entre implantações azuis/verdes do Amazon ECS via CodeDeploy e CloudFormation](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-create-ecs-cfn.html#differences-ecs-bg-cfn) no *Guia do usuário do AWS CodeDeploy*. 

Ao gerenciar sua implantação azul/verde usando o CloudFormation, há certas limitações e considerações que você deve ter em mente:
+ Somente atualizações de determinados recursos acionarão uma implantação verde. Para obter mais informações, consulte [Atualizações de recursos que iniciam implantações verdes](about-blue-green-deployments.md#blue-green-resources).
+ Não é possível incluir atualizações de recursos que iniciam implantações verdes e atualizações de outros recursos na mesma atualização de pilha. Para obter mais informações, consulte [Atualizações de recursos que iniciam implantações verdes](about-blue-green-deployments.md#blue-green-resources).
+ Só é possível especificar um único serviço do ECS como o destino de implantação.
+ Os parâmetros cujos valores forem ofuscados pelo CloudFormation não poderão ser atualizados pelo CodeDeploy durante uma implantação verde e causarão um erro e uma falha na atualização da pilha. Isso inclui:
  + Parâmetros definidos com o atributo `NoEcho`.
  + Parâmetros que usam referências dinâmicas para recuperar seus valores de serviços externos. Para obter mais informações sobre referências dinâmicas, consulte [Obter valores armazenados em outros serviços usando referências dinâmicas](dynamic-references.md).
+ Para cancelar uma implantação verde que ainda está em andamento, cancele a atualização da pilha no CloudFormation, e não no CodeDeploy ou ECS. Para obter mais informações, consulte [Cancelar uma atualização de pilha](using-cfn-stack-update-cancel.md). Após a conclusão de uma atualização, não será possível cancelá-la. No entanto, é possível atualizar uma pilha novamente com quaisquer configurações anteriores.
+ No momento, os seguintes recursos do CloudFormation não são compatíveis com modelos que definem implantações azuis/verdes do ECS:
  + Declarar [saídas](outputs-section-structure.md) ou usar [Fn::ImportValue](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html) para importar valores de outras pilhas.
  + Importar recursos. Para obter mais informações sobre a importação de recursos, consulte [Importar recursos da AWS para uma pilha do CloudFormation](import-resources.md).
  + Usar o hook `AWS::CodeDeploy::BlueGreen` em um modelo que inclua recursos de pilha aninhados. Para saber mais sobre pilhas aninhadas, consulte [Dividir um modelo em partes reutilizáveis usando pilhas aninhadas](using-cfn-nested-stacks.md).
  + Usar o hook `AWS::CodeDeploy::BlueGreen` em uma pilha aninhada.

# Sintaxe do hook `AWS::CodeDeploy::BlueGreen`
<a name="blue-green-hook-syntax"></a>

A sintaxe a seguir descreve a estrutura de um hook `AWS::CodeDeploy::BlueGreen` para implantações azuis/verdes do ECS.

## Sintaxe
<a name="cfn-blue-green-hook-syntax"></a>

```
"Hooks": {
  "Logical ID": {
    "Type": "AWS::CodeDeploy::BlueGreen",
    "Properties": {
      "TrafficRoutingConfig": {
        "Type": "Traffic routing type",
        "TimeBasedCanary": {
          "StepPercentage": Integer,
          "BakeTimeMins": Integer
        },
        "TimeBasedLinear": {
          "StepPercentage": Integer,
          "BakeTimeMins": Integer
        }
      },
      "AdditionalOptions": {"TerminationWaitTimeInMinutes": Integer},
      "LifecycleEventHooks": {
        "BeforeInstall": "FunctionName",
        "AfterInstall": "FunctionName",
        "AfterAllowTestTraffic": "FunctionName",
        "BeforeAllowTraffic": "FunctionName",
        "AfterAllowTraffic": "FunctionName"
      },
      "ServiceRole": "CodeDeployServiceRoleName",
      "Applications": [
        {
          "Target": {
            "Type": "AWS::ECS::Service",
            "LogicalID": "Logical ID of AWS::ECS::Service"
          },
          "ECSAttributes": {
            "TaskDefinitions": [
              "Logical ID of AWS::ECS::TaskDefinition (Blue)",
              "Logical ID of AWS::ECS::TaskDefinition (Green)"
            ],
            "TaskSets": [
              "Logical ID of AWS::ECS::TaskSet (Blue)",
              "Logical ID of AWS::ECS::TaskSet (Green)"
            ],
            "TrafficRouting": {
              "ProdTrafficRoute": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "LogicalID": "Logical ID of AWS::ElasticLoadBalancingV2::Listener (Production)"
              },
              "TestTrafficRoute": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "LogicalID": "Logical ID of AWS::ElasticLoadBalancingV2::Listener (Test)"
              },
              "TargetGroups": [
                "Logical ID of AWS::ElasticLoadBalancingV2::TargetGroup (Blue)",
                "Logical ID of AWS::ElasticLoadBalancingV2::TargetGroup (Green)"
              ]
            }
          }
        }
      ]
    }
  }
}
```

## Propriedades
<a name="cfn-blue-green-hook-properties"></a>

ID lógico (também chamado de *nome lógico*)  
O ID lógico de um hook declarado na seção `Hooks` do modelo. O ID lógico deve ser alfanumérico (A-Z a-z 0-9) e exclusivo no modelo.  
*Obrigatório*: Sim    
`Type`  
O tipo do hook. `AWS::CodeDeploy::BlueGreen`  
*Obrigatório*: Sim  
`Properties`  
Propriedades do hook.  
*Obrigatório*: Sim    
`TrafficRoutingConfig`  
Definição das configurações de roteamento de tráfego.  
*Obrigatório*: não  
A configuração padrão é o deslocamento de tráfego canário baseado em tempo, com uma porcentagem de 15% de etapa e um tempo de incorporação de cinco minutos.    
`Type`  
O tipo de deslocamento de tráfego usado pela configuração de implantação.  
Valores válidos: AllAtOnce \$1 TimeBasedCanary \$1 TimeBasedLinear  
*Obrigatório*: Sim    
`TimeBasedCanary`  
Especifica uma configuração que desloca o tráfego de uma versão da implantação para outra em incrementos de dois.  
*Necessário*: Condicional: se você especificar `TimeBasedCanary` como o tipo de roteamento de tráfego, deverá incluir o parâmetro `TimeBasedCanary`.    
`StepPercentage`  
A porcentagem de tráfego a ser deslocado no primeiro incremento de uma implantação `TimeBasedCanary`. A porcentagem da etapa deve ser 14% ou maior.  
*Obrigatório*: não  
`BakeTimeMins`  
O número de minutos entre o primeiro e o segundo deslocamento de tráfego de uma implantação `TimeBasedCanary`.  
*Obrigatório*: não  
`TimeBasedLinear`  
Especifica uma configuração que desloca o tráfego de uma versão da implantação para outra em incrementos iguais, com um número igual de minutos entre cada incremento.  
*Necessário*: Condicional: se você especificar `TimeBasedLinear` como o tipo de roteamento de tráfego, deverá incluir o parâmetro `TimeBasedLinear`.    
`StepPercentage`  
A porcentagem de tráfego deslocado no início de cada incremento de uma implantação `TimeBasedLinear`. A porcentagem da etapa deve ser 14% ou maior.  
*Obrigatório*: não  
`BakeTimeMins`  
O número de minutos entre cada deslocamento de tráfego incremental de uma implantação `TimeBasedLinear`.  
*Obrigatório*: não  
`AdditionalOptions`  
Opções adicionais para a implantação azul/verde.  
*Obrigatório*: não    
`TerminationWaitTimeInMinutes`  
Especifica o tempo de espera, em minutos, antes de encerrar os recursos azuis.  
*Obrigatório*: não  
`LifecycleEventHooks`  
Use hooks de eventos de ciclo de vida para especificar uma função do Lambda que o CodeDeploy possa chamar para validar uma implantação. É possível usar a mesma função ou uma diferente para os eventos de ciclo de vida de implantação. Após a conclusão dos testes de validação, a função do Lambda `AfterAllowTraffic` chama de volta o CodeDeploy e entrega um resultado de `Succeeded` ou `Failed`. Para mais informações, consulte a [seção “Hooks” do AppSpec](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html) no *Guia do usuário do AWS CodeDeploy.*  
*Obrigatório*: não    
`BeforeInstall`  
Função a ser usada para executar tarefas antes que o conjunto de tarefas de substituição seja criado.  
*Obrigatório*: não  
`AfterInstall`  
Função a ser usada para executar tarefas depois que o conjunto de tarefas de substituição for criado e um dos grupos de destino for associado a ele.  
*Obrigatório*: não  
`AfterAllowTestTraffic`  
Função a ser usada para executar tarefas depois que o listener de teste distribuir o tráfego para o conjunto de tarefas de substituição.  
*Obrigatório*: não  
`BeforeAllowTraffic`  
Função a ser usada para executar tarefas depois que o segundo grupo de destino for associado ao conjunto de tarefas de substituição, mas antes que o tráfego seja deslocado para o conjunto de tarefas de substituição.  
*Obrigatório*: não  
`AfterAllowTraffic`  
Função a ser usada para executar tarefas depois que o segundo grupo de destino distribuir o tráfego para o conjunto de tarefas de substituição.  
*Obrigatório*: não  
`ServiceRole`  
A função de execução a ser usada pelo CloudFormation para executar as implantações azul/verde. Para obter uma lista das permissões necessárias, consulte [Permissões do IAM para implantações azuis/verdes](about-blue-green-deployments.md#blue-green-iam).  
*Obrigatório*: não  
`Applications`  
Especifica as propriedades do aplicativo do Amazon ECS.  
*Obrigatório*: sim    
`Target`  
  
*Obrigatório*: sim    
`Type`  
O tipo de recurso.  
*Obrigatório*: sim  
`LogicalID`  
O ID lógico do recurso.  
*Obrigatório*: Sim  
`ECSAttributes`  
Os recursos que representam os vários requisitos de sua implantação de aplicativos do Amazon ECS.  
*Obrigatório*: Sim    
`TaskDefinitions`  
O ID lógico do recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html) para executar o contêiner do Docker que contém sua aplicação do Amazon ECS.  
*Obrigatório*: sim  
`TaskSets`  
Os IDs lógicos dos recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html) a serem usados como conjuntos de tarefas para a aplicação.  
*Obrigatório*: sim  
`TrafficRouting`  
Especifica os recursos usados para roteamento de tráfego.  
*Obrigatório*: sim    
`ProdTrafficRoute`  
O listener é usado pelo load balancer para direcionar o tráfego para seus grupos de destino.  
*Obrigatório*: sim    
`Type`  
O tipo do recurso. `AWS::ElasticLoadBalancingV2::Listener`  
*Obrigatório*: sim  
`LogicalID`  
O ID lógico do recurso.  
*Obrigatório*: sim  
`TestTrafficRoute`  
O listener é usado pelo load balancer para direcionar o tráfego para seus grupos de destino.  
*Obrigatório*: sim    
`Type`  
O tipo do recurso. `AWS::ElasticLoadBalancingV2::Listener`  
*Obrigatório*: sim  
`LogicalID`  
O ID lógico do recurso.  
*Obrigatório*: não  
`TargetGroups`  
ID lógico dos recursos a serem usados como grupos de destino para rotear o tráfego para o destino registrado.  
*Obrigatório*: sim

# Exemplo de modelo de implantação azul/verde
<a name="blue-green-template-example"></a>

O modelo de exemplo a seguir configura uma implantação azul/verde do CodeDeploy no ECS com um progresso de roteamento de tráfego de 15% por etapa e um período de estabilização de 5 minutos entre cada etapa. 

Criar uma pilha com o modelo provisionará a configuração inicial da implantação. Se você fez alguma alteração nas propriedades do recurso `BlueTaskSet` que exija que esse recurso seja substituído, o CloudFormation inicializará uma implantação verde como parte da atualização da pilha.

## JSON
<a name="blue-green-template-example.json"></a>

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "Vpc":{ "Type":"AWS::EC2::VPC::Id" },
    "Subnet1":{ "Type":"AWS::EC2::Subnet::Id" },
    "Subnet2":{ "Type":"AWS::EC2::Subnet::Id" }
  },
  "Transform":[ "AWS::CodeDeployBlueGreen" ],
  "Hooks":{
    "CodeDeployBlueGreenHook":{
      "Type":"AWS::CodeDeploy::BlueGreen",
      "Properties":{
        "TrafficRoutingConfig":{
          "Type":"TimeBasedCanary",
          "TimeBasedCanary":{
            "StepPercentage":15,
            "BakeTimeMins":5
          }
        },
        "Applications":[
          {
            "Target":{
              "Type":"AWS::ECS::Service",
              "LogicalID":"ECSDemoService"
            },
            "ECSAttributes":{
              "TaskDefinitions":[ "BlueTaskDefinition","GreenTaskDefinition" ],
              "TaskSets":[ "BlueTaskSet","GreenTaskSet" ],
              "TrafficRouting":{
                "ProdTrafficRoute":{
                  "Type":"AWS::ElasticLoadBalancingV2::Listener",
                  "LogicalID":"ALBListenerProdTraffic"
                },
                "TargetGroups":[ "ALBTargetGroupBlue","ALBTargetGroupGreen" ]
              }
            }
          }
        ]
      }
    }
  },
  "Resources":{
    "ExampleSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"Security group for ec2 access",
        "VpcId":{ "Ref":"Vpc" },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          },
          {
            "IpProtocol":"tcp",
            "FromPort":8080,
            "ToPort":8080,
            "CidrIp":"0.0.0.0/0"
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "ALBTargetGroupBlue":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":5,
        "HealthCheckPath":"/",
        "HealthCheckPort":"80",
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":2,
        "HealthyThresholdCount":2,
        "Matcher":{ "HttpCode":"200" },
        "Port":80,
        "Protocol":"HTTP",
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "TargetType":"ip",
        "UnhealthyThresholdCount":4,
        "VpcId":{ "Ref":"Vpc" }
      }
    },
    "ALBTargetGroupGreen":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":5,
        "HealthCheckPath":"/",
        "HealthCheckPort":"80",
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":2,
        "HealthyThresholdCount":2,
        "Matcher":{ "HttpCode":"200" },
        "Port":80,
        "Protocol":"HTTP",
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "TargetType":"ip",
        "UnhealthyThresholdCount":4,
        "VpcId":{ "Ref":"Vpc" }
      }
    },
    "ExampleALB":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "SecurityGroups":[{ "Ref":"ExampleSecurityGroup" }],
        "Subnets":[{ "Ref":"Subnet1" },{ "Ref":"Subnet2" }],
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "Type":"application",
        "IpAddressType":"ipv4"
      }
    },
    "ALBListenerProdTraffic":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "ForwardConfig":{
              "TargetGroups":[
                {
                  "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" },
                  "Weight":1
                }
              ]
            }
          }
        ],
        "LoadBalancerArn":{ "Ref":"ExampleALB" },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ALBListenerProdRule":{
      "Type":"AWS::ElasticLoadBalancingV2::ListenerRule",
      "Properties":{
        "Actions":[
          {
            "Type":"forward",
            "ForwardConfig":{
              "TargetGroups":[
                {
                  "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" },
                  "Weight":1
                }
              ]
            }
          }
        ],
        "Conditions":[
          {
            "Field":"http-header",
            "HttpHeaderConfig":{
              "HttpHeaderName":"User-Agent",
              "Values":[ "Mozilla" ]
            }
          }
        ],
        "ListenerArn":{ "Ref":"ALBListenerProdTraffic" },
        "Priority":1
      }
    },
    "ECSTaskExecutionRole":{
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument":{
          "Version": "2012-10-17",		 	 	 
          "Statement":[
            {
              "Sid":"",
              "Effect":"Allow",
              "Principal":{
                "Service":"ecs-tasks.amazonaws.com"
              },
              "Action":"sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns":[ "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" ]
      }
    },
    "BlueTaskDefinition":{
      "Type":"AWS::ECS::TaskDefinition",
      "Properties":{
        "ExecutionRoleArn":{
          "Fn::GetAtt":[ "ECSTaskExecutionRole","Arn" ]
        },
        "ContainerDefinitions":[
          {
            "Name":"DemoApp",
            "Image":"nginxdemos/hello:latest",
            "Essential":true,
            "PortMappings":[
              {
                "HostPort":80,
                "Protocol":"tcp",
                "ContainerPort":80
              }
            ]
          }
        ],
        "RequiresCompatibilities":[ "FARGATE" ],
        "NetworkMode":"awsvpc",
        "Cpu":"256",
        "Memory":"512",
        "Family":"ecs-demo"
      }
    },
    "ECSDemoCluster":{
      "Type":"AWS::ECS::Cluster",
      "Properties":{}
    },
    "ECSDemoService":{
      "Type":"AWS::ECS::Service",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "DesiredCount":1,
        "DeploymentController":{ "Type":"EXTERNAL" }
      }
    },
    "BlueTaskSet":{
      "Type":"AWS::ECS::TaskSet",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "LaunchType":"FARGATE",
        "NetworkConfiguration":{
          "AwsVpcConfiguration":{
            "AssignPublicIp":"ENABLED",
            "SecurityGroups":[{ "Ref":"ExampleSecurityGroup" }],
            "Subnets":[{ "Ref":"Subnet1" },{ "Ref":"Subnet2" }]
          }
        },
        "PlatformVersion":"1.4.0",
        "Scale":{
          "Unit":"PERCENT",
          "Value":100
        },
        "Service":{ "Ref":"ECSDemoService"},
        "TaskDefinition":{ "Ref":"BlueTaskDefinition" },
        "LoadBalancers":[
          {
            "ContainerName":"DemoApp",
            "ContainerPort":80,
            "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" }
          }
        ]
      }
    },
    "PrimaryTaskSet":{
      "Type":"AWS::ECS::PrimaryTaskSet",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "Service":{ "Ref":"ECSDemoService" },
        "TaskSetId":{ "Fn::GetAtt":[ "BlueTaskSet","Id" ]
        }
      }
    }
  }
}
```

## YAML
<a name="blue-green-template-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  Vpc:
    Type: AWS::EC2::VPC::Id
  Subnet1:
    Type: AWS::EC2::Subnet::Id
  Subnet2:
    Type: AWS::EC2::Subnet::Id
Transform:
  - 'AWS::CodeDeployBlueGreen'
Hooks:
  CodeDeployBlueGreenHook:
    Type: AWS::CodeDeploy::BlueGreen
    Properties:
      TrafficRoutingConfig:
        Type: TimeBasedCanary
        TimeBasedCanary:
          StepPercentage: 15
          BakeTimeMins: 5
      Applications:
        - Target:
            Type: AWS::ECS::Service
            LogicalID: ECSDemoService
          ECSAttributes:
            TaskDefinitions:
              - BlueTaskDefinition
              - GreenTaskDefinition
            TaskSets:
              - BlueTaskSet
              - GreenTaskSet
            TrafficRouting:
              ProdTrafficRoute:
                Type: AWS::ElasticLoadBalancingV2::Listener
                LogicalID: ALBListenerProdTraffic
              TargetGroups:
                - ALBTargetGroupBlue
                - ALBTargetGroupGreen
Resources:
  ExampleSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for ec2 access
      VpcId: !Ref Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 8080
          ToPort: 8080
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  ALBTargetGroupBlue:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 5
      HealthCheckPath: /
      HealthCheckPort: '80'
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 2
      HealthyThresholdCount: 2
      Matcher:
        HttpCode: '200'
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Group
          Value: Example
      TargetType: ip
      UnhealthyThresholdCount: 4
      VpcId: !Ref Vpc
  ALBTargetGroupGreen:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 5
      HealthCheckPath: /
      HealthCheckPort: '80'
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 2
      HealthyThresholdCount: 2
      Matcher:
        HttpCode: '200'
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Group
          Value: Example
      TargetType: ip
      UnhealthyThresholdCount: 4
      VpcId: !Ref Vpc
  ExampleALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      SecurityGroups:
        - !Ref ExampleSecurityGroup
      Subnets:
        - !Ref Subnet1
        - !Ref Subnet2
      Tags:
        - Key: Group
          Value: Example
      Type: application
      IpAddressType: ipv4
  ALBListenerProdTraffic:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ALBTargetGroupBlue
                Weight: 1
      LoadBalancerArn: !Ref ExampleALB
      Port: 80
      Protocol: HTTP
  ALBListenerProdRule:
    Type: AWS::ElasticLoadBalancingV2::ListenerRule
    Properties:
      Actions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ALBTargetGroupBlue
                Weight: 1
      Conditions:
        - Field: http-header
          HttpHeaderConfig:
            HttpHeaderName: User-Agent
            Values:
              - Mozilla
      ListenerArn: !Ref ALBListenerProdTraffic
      Priority: 1
  ECSTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: ''
            Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'
  BlueTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ExecutionRoleArn: !GetAtt 
        - ECSTaskExecutionRole
        - Arn
      ContainerDefinitions:
        - Name: DemoApp
          Image: 'nginxdemos/hello:latest'
          Essential: true
          PortMappings:
            - HostPort: 80
              Protocol: tcp
              ContainerPort: 80
      RequiresCompatibilities:
        - FARGATE
      NetworkMode: awsvpc
      Cpu: '256'
      Memory: '512'
      Family: ecs-demo
  ECSDemoCluster:
    Type: AWS::ECS::Cluster
    Properties: {}
  ECSDemoService:
    Type: AWS::ECS::Service
    Properties:
      Cluster: !Ref ECSDemoCluster
      DesiredCount: 1
      DeploymentController:
        Type: EXTERNAL
  BlueTaskSet:
    Type: AWS::ECS::TaskSet
    Properties:
      Cluster: !Ref ECSDemoCluster
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsVpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - !Ref ExampleSecurityGroup
          Subnets:
            - !Ref Subnet1
            - !Ref Subnet2
      PlatformVersion: 1.4.0
      Scale:
        Unit: PERCENT
        Value: 100
      Service: !Ref ECSDemoService
      TaskDefinition: !Ref BlueTaskDefinition
      LoadBalancers:
        - ContainerName: DemoApp
          ContainerPort: 80
          TargetGroupArn: !Ref ALBTargetGroupBlue
  PrimaryTaskSet:
    Type: AWS::ECS::PrimaryTaskSet
    Properties:
      Cluster: !Ref ECSDemoCluster
      Service: !Ref ECSDemoService
      TaskSetId: !GetAtt 
        - BlueTaskSet
        - Id
```

# Trechos de modelo do CloudFormation
<a name="template-snippets"></a>

Esta seção fornece uma série de exemplos de cenários que você pode usar para entender como declarar várias partes de modelo do CloudFormation. Você também pode usar os trechos como ponto de partida para seções de seus modelos personalizados.

**Topics**
+ [Trechos de modelos gerais](quickref-general.md)
+ [Snippets de modelos do CloudFormation para ajuste de escala automático](quickref-autoscaling.md)
+ [Snippets de modelo do Console de faturamento da AWS](quickref-billingconductor.md)
+ [Trechos de modelo do CloudFormation](quickref-cloudformation.md)
+ [Trechos de modelo do Amazon CloudFront](quickref-cloudfront.md)
+ [Trechos de modelo do Amazon CloudWatch](quickref-cloudwatch.md)
+ [Trechos de modelo do Amazon CloudWatch Logs](quickref-cloudwatchlogs.md)
+ [Trechos de modelo do Amazon DynamoDB](quickref-dynamodb.md)
+ [Snippets de modelo do CloudFormation do Amazon EC2](quickref-ec2.md)
+ [Modelos de exemplo do Amazon Elastic Container Service](quickref-ecs.md)
+ [Modelo de exemplo do Amazon Elastic File System](quickref-efs.md)
+ [Trechos de modelo do Elastic Beanstalk](quickref-elasticbeanstalk.md)
+ [Trechos de modelo do Elastic Load Balancing](quickref-elb.md)
+ [Trechos de modelo do AWS Identity and Access Management](quickref-iam.md)
+ [AWS LambdaModelo](quickref-lambda.md)
+ [Trechos de modelo do Amazon Redshift](quickref-redshift.md)
+ [Trechos de modelo do Amazon RDS](quickref-rds.md)
+ [Trechos de modelos do Route 53](quickref-route53.md)
+ [Trechos de modelo do Amazon S3](quickref-s3.md)
+ [Trechos de modelo do Amazon SNS](quickref-sns.md)
+ [Trechos de modelo do Amazon SQS](scenario-sqs-queue.md)
+ [Trechos de modelo do Amazon Timestream](scenario-timestream-queue.md)

# Trechos de modelos gerais
<a name="quickref-general"></a>

Os exemplos a seguir mostram diferentes recursos de modelos do CloudFormation que não são específicos de um serviço da AWS

**Topics**
+ [Propriedade UserData codificada em Base64](#scenario-userdata-base64)
+ [Propriedade UserData codificada em Base64 com AccessKey e SecretKey](#scenario-userdata-base64-with-keys)
+ [Seção Parameters com um parâmetro de string literal](#scenario-one-string-parameter)
+ [Seção Parameters com parâmetro string com restrição de expressão regular](#scenario-constraint-string-parameter)
+ [Seção Parameters com parâmetros numéricos com restrições MinValue e MaxValue](#scenario-one-number-min-parameter)
+ [Seção Parameters com parâmetro numérico com a restrição AllowedValues](#scenario-one-number-parameter)
+ [Seção Parameters com um parâmetro CommaDelimitedList literal](#scenario-one-list-parameter)
+ [Seção Parameters com valor de parâmetro baseado em pseudoparâmetro](#scenario-one-pseudo-parameter)
+ [Seção Mapping com três mapeamentos](#scenario-mapping-with-four-maps)
+ [Description com base em string literal](#scenario-description-from-literal-string)
+ [Seção Outputs com uma saída de string literal](#scenario-output-with-literal-string)
+ [Seção Outputs com uma saída de referência de recurso e uma saída de referência de pseudoparâmetro](#scenario-output-with-ref-and-pseudo-ref)
+ [Seção Outputs com uma saída com base em uma função, uma string literal, uma referência e um pseudoparâmetro](#scenario-output-with-complex-spec)
+ [Versão de formato do modelo](#scenario-format-version)
+ [Propriedade Tags da AWS](#scenario-format-aws-tag)

## Propriedade UserData codificada em Base64
<a name="scenario-userdata-base64"></a>

Este exemplo mostra a montagem de uma propriedade `UserData` usando as funções `Fn::Base64` e `Fn::Join`. As referências `MyValue` e `MyName` são parâmetros que devem ser definidos na seção `Parameters` do modelo. A sequência literal `Hello World` é apenas outro valor que este exemplo passa como parte do `UserData`.

### JSON
<a name="quickref-general-example-1.json"></a>

```
1. "UserData" : {
2.     "Fn::Base64" : {
3.         "Fn::Join" : [ ",", [
4.             { "Ref" : "MyValue" },
5.             { "Ref" : "MyName" },
6.             "Hello World" ] ]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-1.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      Ref: MyValue
4.      Ref: MyName
5.      Hello World
```

## Propriedade UserData codificada em Base64 com AccessKey e SecretKey
<a name="scenario-userdata-base64-with-keys"></a>

Este exemplo mostra a montagem de uma propriedade `UserData` usando as funções `Fn::Base64` e `Fn::Join`. Inclui as informações de `AccessKey` e `SecretKey`. As referências `AccessKey` e `SecretKey` são parâmetros que devem ser definidos na seção Parameters do modelo.

### JSON
<a name="quickref-general-example-2.json"></a>

```
1. "UserData" : {
2.     "Fn::Base64" : {
3.         "Fn::Join" : [ "", [
4.             "ACCESS_KEY=", { "Ref" : "AccessKey" },
5.             "SECRET_KEY=", { "Ref" : "SecretKey" } ]
6.         ]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-2.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      ACCESS_KEY=${AccessKey}
4.      SECRET_KEY=${SecretKey}
```

## Seção Parameters com um parâmetro de string literal
<a name="scenario-one-string-parameter"></a>

O exemplo a seguir descreve uma declaração válida da seção Parameters na qual um único parâmetro de tipo `String` é declarado.

### JSON
<a name="quickref-general-example-3.json"></a>

```
1. "Parameters" : {
2.     "UserName" : {
3.         "Type" : "String",
4.         "Default" : "nonadmin",
5.         "Description" : "Assume a vanilla user if no command-line spec provided"
6.     }
7. }
```

### YAML
<a name="quickref-general-example-3.yaml"></a>

```
1. Parameters:
2.   UserName:
3.     Type: String
4.     Default: nonadmin
5.     Description: Assume a vanilla user if no command-line spec provided
```

## Seção Parameters com parâmetro string com restrição de expressão regular
<a name="scenario-constraint-string-parameter"></a>

O exemplo a seguir descreve uma declaração válida da seção Parameters na qual um único parâmetro de tipo `String` é declarado. O parâmetro `AdminUserAccount` tem um valor padrão de `admin`. O valor do parâmetro deve ter um tamanho mínimo de 1, um tamanho máximo de 16 e conter caracteres alfabéticos e numéricos, mas deve começar com um caractere alfabético.

### JSON
<a name="quickref-general-example-4.json"></a>

```
 1. "Parameters" : {
 2.     "AdminUserAccount": {
 3.       "Default": "admin",
 4.       "NoEcho": "true",
 5.       "Description" : "The admin account user name",
 6.       "Type": "String",
 7.       "MinLength": "1",
 8.       "MaxLength": "16",
 9.       "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*"
10.     }
11. }
```

### YAML
<a name="quickref-general-example-4.yaml"></a>

```
1. Parameters:
2.   AdminUserAccount:
3.     Default: admin
4.     NoEcho: true
5.     Description: The admin account user name
6.     Type: String
7.     MinLength: 1
8.     MaxLength: 16
9.     AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
```

## Seção Parameters com parâmetros numéricos com restrições MinValue e MaxValue
<a name="scenario-one-number-min-parameter"></a>

O exemplo a seguir descreve uma declaração válida da seção Parameters na qual um único parâmetro de tipo `Number` é declarado. O parâmetro `WebServerPort` tem um padrão de 80, um valor mínimo de 1 e um valor máximo de 65535.

### JSON
<a name="quickref-general-example-5.json"></a>

```
1. "Parameters" : {
2.     "WebServerPort": {
3.       "Default": "80",
4.       "Description" : "TCP/IP port for the web server",
5.       "Type": "Number",
6.       "MinValue": "1",
7.       "MaxValue": "65535"
8.     }
9. }
```

### YAML
<a name="quickref-general-example-5.yaml"></a>

```
1. Parameters:
2.   WebServerPort:
3.     Default: 80
4.     Description: TCP/IP port for the web server
5.     Type: Number
6.     MinValue: 1
7.     MaxValue: 65535
```

## Seção Parameters com parâmetro numérico com a restrição AllowedValues
<a name="scenario-one-number-parameter"></a>

O exemplo a seguir descreve uma declaração válida da seção Parameters na qual um único parâmetro de tipo `Number` é declarado. O parâmetro `WebServerPort` tem um padrão de 80 e permite apenas valores de 80 e 8888.

### JSON
<a name="quickref-general-example-6.json"></a>

```
1. "Parameters" : {
2.     "WebServerPortLimited": {
3.       "Default": "80",
4.       "Description" : "TCP/IP port for the web server",
5.       "Type": "Number",
6.       "AllowedValues" : ["80", "8888"]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-6.yaml"></a>

```
1. Parameters:
2.   WebServerPortLimited:
3.     Default: 80
4.     Description: TCP/IP port for the web server
5.     Type: Number
6.     AllowedValues:
7.     - 80
8.     - 8888
```

## Seção Parameters com um parâmetro CommaDelimitedList literal
<a name="scenario-one-list-parameter"></a>

O exemplo a seguir descreve uma declaração válida da seção `Parameters` na qual um único parâmetro do tipo `CommaDelimitedList` é declarado. A propriedade `NoEcho` é definida como `TRUE`, o que mascara seu valor com asteriscos (\$1\$1\$1\$1\$1) na saída **describe-stacks**, exceto pelas informações armazenadas nos locais especificados abaixo.

**Importante**  
O uso do atributo `NoEcho` não mascara informações armazenadas no seguinte:  
A seção de modelo de `Metadata`. O CloudFormation não transforma, modifica nem edita nenhuma informação incluída na seção `Metadata`. Para obter mais informações, consulte [Metadados](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
A seção de modelo de `Outputs`. Para obter mais informações, consulte [Saídas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
O atributo `Metadata` de uma definição de recurso. Para obter mais informações, consulte o atributo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
É altamente recomendável não usar esses mecanismos para incluir informações confidenciais, como senhas ou segredos.

**Importante**  
Em vez de incorporar informações confidenciais diretamente em modelos do CloudFormation, recomendamos usar os parâmetros dinâmicos no modelo da pilha para fazer referência a informações confidenciais que são armazenadas e gerenciadas de forma externa ao CloudFormation, como no AWS Systems Manager Parameter Store ou no AWS Secrets Manager.  
Para obter mais informações, consulte a prática recomendada [Não incorporar credenciais nos seus modelos](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).

### JSON
<a name="quickref-general-example-7.json"></a>

```
1. "Parameters" : {
2.     "UserRoles" : {
3.         "Type" : "CommaDelimitedList",
4.         "Default" : "guest,newhire",
5.         "NoEcho" : "TRUE"
6.     }
7. }
```

### YAML
<a name="quickref-general-example-7.yaml"></a>

```
1. Parameters:
2.   UserRoles:
3.     Type: CommaDelimitedList
4.     Default: "guest,newhire"
5.     NoEcho: true
```

## Seção Parameters com valor de parâmetro baseado em pseudoparâmetro
<a name="scenario-one-pseudo-parameter"></a>

O exemplo a seguir mostra comandos nos dados do usuário do EC2 que usam os pseudoparâmetros `AWS::StackName` e `AWS::Region`. Para obter mais informações sobre pseudoparâmetros, consulte [Obter valores da AWS usando pseudoparâmetros](pseudo-parameter-reference.md).

### JSON
<a name="quickref-general-example-10.json"></a>

```
 1.           "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
 2.              "#!/bin/bash -xe\n",
 3.              "yum install -y aws-cfn-bootstrap\n",
 4. 
 5.              "/opt/aws/bin/cfn-init -v ",
 6.              "         --stack ", { "Ref" : "AWS::StackName" },
 7.              "         --resource LaunchConfig ",
 8.              "         --region ", { "Ref" : "AWS::Region" }, "\n",
 9. 
10.              "/opt/aws/bin/cfn-signal -e $? ",
11.              "         --stack ", { "Ref" : "AWS::StackName" },
12.              "         --resource WebServerGroup ",
13.              "         --region ", { "Ref" : "AWS::Region" }, "\n"
14.         ]]}}
15.       }
```

### YAML
<a name="quickref-general-example-10.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      #!/bin/bash -xe
4.      yum update -y aws-cfn-bootstrap
5.      /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --region ${AWS::Region}
6.      /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
```

## Seção Mapping com três mapeamentos
<a name="scenario-mapping-with-four-maps"></a>

O exemplo a seguir descreve uma declaração válida de seção `Mapping` que contém três mapeamentos. O mapa, quando correspondido a uma chave de mapeamento de `Stop`, `SlowDown` ou `Go` fornece os valores RGB atribuídos ao atributo `RGBColor` correspondente.

### JSON
<a name="quickref-general-example-11.json"></a>

```
 1. "Mappings" : {
 2.     "LightColor" : {
 3.         "Stop" : {
 4.             "Description" : "red",
 5.             "RGBColor" : "RED 255 GREEN 0 BLUE 0"
 6.         },
 7.         "SlowDown" : {
 8.             "Description" : "yellow",
 9.             "RGBColor" : "RED 255 GREEN 255 BLUE 0"
10.         },
11.         "Go" : {
12.             "Description" : "green",
13.             "RGBColor" : "RED 0 GREEN 128 BLUE 0"
14.         }
15.     }
16. }
```

### YAML
<a name="quickref-general-example-11.yaml"></a>

```
 1. Mappings:
 2.   LightColor:
 3.     Stop:
 4.       Description: red
 5.       RGBColor: "RED 255 GREEN 0 BLUE 0"
 6.     SlowDown:
 7.       Description: yellow
 8.       RGBColor: "RED 255 GREEN 255 BLUE 0"
 9.     Go:
10.       Description: green
11.       RGBColor: "RED 0 GREEN 128 BLUE 0"
```

## Description com base em string literal
<a name="scenario-description-from-literal-string"></a>

O exemplo a seguir descreve uma declaração válida da seção `Description`, onde o valor é baseado em uma string literal. Este trecho pode ser para modelos, parâmetros, recursos, propriedades ou saídas.

### JSON
<a name="quickref-general-example-8.json"></a>

```
1. "Description" : "Replace this value"
```

### YAML
<a name="quickref-general-example-8.yaml"></a>

```
1. Description: "Replace this value"
```

## Seção Outputs com uma saída de string literal
<a name="scenario-output-with-literal-string"></a>

Este exemplo mostra uma atribuição de saída com base em uma sequência literal.

### JSON
<a name="quickref-general-example-12.json"></a>

```
1. "Outputs" : {
2.     "MyPhone" : {
3.         "Value" : "Please call 555-5555",
4.         "Description" : "A random message for aws cloudformation describe-stacks"
5.     }
6. }
```

### YAML
<a name="quickref-general-example-12.yaml"></a>

```
1. Outputs:
2.   MyPhone:
3.     Value: Please call 555-5555
4.     Description: A random message for aws cloudformation describe-stacks
```

## Seção Outputs com uma saída de referência de recurso e uma saída de referência de pseudoparâmetro
<a name="scenario-output-with-ref-and-pseudo-ref"></a>

Este exemplo mostra uma seção `Outputs` com duas atribuições de saída. Uma é baseada em um recurso, e a outra é baseada em uma pseudoreferência.

### JSON
<a name="quickref-general-example-13.json"></a>

```
1. "Outputs" : {
2.    "SNSTopic" : { "Value" : { "Ref" : "MyNotificationTopic" } },
3.    "StackName" : { "Value" : { "Ref" : "AWS::StackName" } }
4. }
```

### YAML
<a name="quickref-general-example-13.yaml"></a>

```
1. Outputs:
2.   SNSTopic:
3.     Value: !Ref MyNotificationTopic
4.   StackName:
5.     Value: !Ref AWS::StackName
```

## Seção Outputs com uma saída com base em uma função, uma string literal, uma referência e um pseudoparâmetro
<a name="scenario-output-with-complex-spec"></a>

Este exemplo mostra uma seção Outputs com uma atribuição de saída. A função Join é usada para concatenar o valor usando um sinal de porcentagem como delimitador.

### JSON
<a name="quickref-general-example-14.json"></a>

```
1. "Outputs" : {
2.     "MyOutput" : {
3.         "Value" : { "Fn::Join" :
4.             [ "%", [ "A-string", {"Ref" : "AWS::StackName" } ] ]
5.         }
6.     }
7. }
```

### YAML
<a name="quickref-general-example-14.yaml"></a>

```
1. Outputs:
2.   MyOutput:
3.     Value: !Join [ %, [ 'A-string', !Ref 'AWS::StackName' ]]
```

## Versão de formato do modelo
<a name="scenario-format-version"></a>

O trecho a seguir descreve uma declaração válida da seção `AWSTemplateFormatVersion`.

### JSON
<a name="quickref-general-example-9.json"></a>

```
1. "AWSTemplateFormatVersion" : "2010-09-09"
```

### YAML
<a name="quickref-general-example-9.yaml"></a>

```
1. AWSTemplateFormatVersion: '2010-09-09'
```

## Propriedade Tags da AWS
<a name="scenario-format-aws-tag"></a>

Este exemplo mostra uma propriedade `Tags` da AWS. Você pode especificar essa propriedade na seção Properties de um recurso. Quando o recurso é criado, ele será marcado com as tags que você declara.

### JSON
<a name="quickref-general-example-15.json"></a>

```
 1. "Tags" : [
 2.       {
 3.         "Key" : "keyname1",
 4.         "Value" : "value1"
 5.       },
 6.       {
 7.         "Key" : "keyname2",
 8.         "Value" : "value2"
 9.       }
10.     ]
```

### YAML
<a name="quickref-general-example-15.yaml"></a>

```
1. Tags: 
2.   - 
3.     Key: "keyname1"
4.     Value: "value1"
5.   - 
6.     Key: "keyname2"
7.     Value: "value2"
```

# Snippets de modelos do CloudFormation para ajuste de escala automático
<a name="quickref-autoscaling"></a>

Com o Amazon EC2 Auto Scaling, é possível escalar automaticamente instâncias do Amazon EC2 seja com políticas de escalabilidade ou com escalabilidade programada. Grupos do Auto Scaling são conjuntos de instâncias do Amazon EC2 que habilitam recursos de escalabilidade automática e gerenciamento de frotas, como políticas de escalabilidade, ações programadas, verificações de integridade, ganchos do ciclo de vida e balanceamento de carga. 

O Aplicativo Auto Scaling fornece escalabilidade automática de diferentes recursos além do Amazon EC2, com políticas de escalabilidade ou com escalabilidade programada.

É possível criar e configurar grupos de Auto Scaling, políticas de escalabilidade, ações programadas e outros recursos de ajuste de escala automático com parte de sua infraestrutura usando modelos do CloudFormation. Os modelos facilitam o gerenciamento e a automação da implantação de recursos de ajuste de escala automático de forma consistente e repetível. 

Os snippets de modelos de exemplo a seguir descrevem os recursos ou componentes do CloudFormation para o Amazon EC2 Auto Scaling e o ajuste de escala automático de aplicações. Esses snippets foram projetados para serem integrados a um modelo e não devem ser executados de forma independente.

**Topics**
+ [Configurar os recursos do Amazon EC2 Auto Scaling](quickref-ec2-auto-scaling.md)
+ [Configurar recursos de ajuste de escala automático de aplicações](quickref-application-auto-scaling.md)

# Configurar os recursos do Amazon EC2 Auto Scaling com o CloudFormation
<a name="quickref-ec2-auto-scaling"></a>

Os exemplos a seguir mostram snippets diferentes a serem incluídos em modelos para uso com o Amazon EC2 Auto Scaling.

**Topics**
+ [Criar um grupo do Auto Scaling com uma única instância](#scenario-single-instance-as-group)
+ [Criar um grupo do Auto Scaling com balanceador de carga anexado](#scenario-as-group)
+ [Criar um grupo do Auto Scaling com notificações](#scenario-as-notification)
+ [Criar um grupo do Auto Scaling que usa um `CreationPolicy` e um `UpdatePolicy`](#scenario-as-updatepolicy)
+ [Criar uma política de escalabilidade em etapas](#scenario-step-scaling-policy)
+ [Exemplos de grupos de instâncias mistas](#scenario-mixed-instances-group-template-examples)
+ [Exemplos de configuração de ativação](#scenario-launch-config-template-examples)

## Criar um grupo do Auto Scaling com uma única instância
<a name="scenario-single-instance-as-group"></a>

Este exemplo mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) com uma única instância para ajudar você a começar. A propriedade `VPCZoneIdentifier` do grupo do Auto Scaling especifica uma lista de sub-redes existentes em três diferentes zonas de disponibilidade. É necessário especificar os IDs de sub-rede aplicáveis da conta antes de criar a pilha. A propriedade `LaunchTemplate` faz referência a um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) com o nome lógico `myLaunchTemplate` definido em outra parte do modelo.

**nota**  
Para obter exemplos de modelos inicialização, consulte [Criar modelos de execução com o CloudFormation](quickref-ec2-launch-templates.md) na seção de snippets do Amazon EC2 e a seção [Exemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) no recurso `AWS::EC2::LaunchTemplate`.

### JSON
<a name="quickref-autoscaling-example-1.json"></a>

```
 1. "myASG" : {
 2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.    "Properties" : {
 4.       "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
 5.       "LaunchTemplate" : {
 6.         "LaunchTemplateId" : {
 7.           "Ref" : "myLaunchTemplate"
 8.         },
 9.         "Version" : {
10.           "Fn::GetAtt" : [
11.             "myLaunchTemplate",
12.             "LatestVersionNumber"
13.           ]
14.         }
15.       },
16.       "MaxSize" : "1",
17.       "MinSize" : "1"
18.    }
19. }
```

### YAML
<a name="quickref-autoscaling-example-1.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - subnetIdAz1
 6.       - subnetIdAz2
 7.       - subnetIdAz3
 8.     LaunchTemplate:
 9.       LaunchTemplateId: !Ref myLaunchTemplate
10.       Version: !GetAtt myLaunchTemplate.LatestVersionNumber
11.     MaxSize: '1'
12.     MinSize: '1'
```

## Criar um grupo do Auto Scaling com balanceador de carga anexado
<a name="scenario-as-group"></a>

Este exemplo mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) para balanceamento de carga em diversos servidores. Ele especifica os nomes lógicos dos recursos da AWS declarados em outro lugar no mesmo modelo.

1. A propriedade `VPCZoneIdentifier` especifica os nomes lógicos de dois recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html) em que as instâncias do EC2 do grupo do Auto Scaling serão criadas: `myPublicSubnet1` e `myPublicSubnet2`.

1. A propriedade `LaunchTemplate` especifica um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) com o nome lógico `myLaunchTemplate`.

1. A propriedade `TargetGroupARNs` lista os grupos de destino de um Application Load Balancer ou um Network Load Balancer usado para rotear o tráfego para o grupo de Auto Scaling. Neste exemplo, um grupo de destino é especificado, um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) com o nome lógico `myTargetGroup`.

### JSON
<a name="quickref-autoscaling-example-2.json"></a>

```
 1. "myServerGroup" : {
 2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.    "Properties" : {
 4.       "VPCZoneIdentifier" : [ { "Ref" : "myPublicSubnet1" }, { "Ref" : "myPublicSubnet2" } ],
 5.       "LaunchTemplate" : {
 6.         "LaunchTemplateId" : {
 7.           "Ref" : "myLaunchTemplate"
 8.         },
 9.         "Version" : {
10.           "Fn::GetAtt" : [
11.             "myLaunchTemplate",
12.             "LatestVersionNumber"
13.           ]
14.         }
15.       },
16.       "MaxSize" : "5",
17.       "MinSize" : "1",
18.       "TargetGroupARNs" : [ { "Ref" : "myTargetGroup" } ]
19.    }
20. }
```

### YAML
<a name="quickref-autoscaling-example-2.yaml"></a>

```
 1. myServerGroup:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - !Ref myPublicSubnet1
 6.       - !Ref myPublicSubnet2
 7.     LaunchTemplate:
 8.       LaunchTemplateId: !Ref myLaunchTemplate
 9.       Version: !GetAtt myLaunchTemplate.LatestVersionNumber
10.     MaxSize: '5'
11.     MinSize: '1'
12.     TargetGroupARNs:
13.       - !Ref myTargetGroup
```

### Consulte também
<a name="scenario-as-group-see-also"></a>

Para obter um exemplo detalhado que cria um grupo de Auto Scaling com uma política de escalabilidade de rastreamento de destino baseada na métrica `ALBRequestCountPerTarget` predefinida para o Application Load Balancer, consulte a seção [Exemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples) no recurso `AWS::AutoScaling::ScalingPolicy`.

## Criar um grupo do Auto Scaling com notificações
<a name="scenario-as-notification"></a>

Este exemplo mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) que envia notificações do Amazon SNS quando eventos especificados ocorrem. A propriedade `NotificationConfigurations` especifica o tópico do SNS em que o CloudFormation envia uma notificação e os eventos farão com que o CloudFormation envie notificações. Quando os eventos especificados por `NotificationTypes` ocorrem, o CloudFormation enviará uma notificação para o tópico do SNS especificado pelo `TopicARN`. Quando você inicializa a pilha, o CloudFormation cria um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html) (`snsTopicForAutoScalingGroup`) que é declarado no mesmo modelo.

A propriedade `VPCZoneIdentifier` do grupo do Auto Scaling especifica uma lista de sub-redes existentes em três diferentes zonas de disponibilidade. É necessário especificar os IDs de sub-rede aplicáveis da conta antes de criar a pilha. A propriedade `LaunchTemplate` faz referência ao nome lógico de um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) declarado em outro lugar no mesmo modelo.

### JSON
<a name="quickref-autoscaling-example-3.json"></a>

```
 1. "myASG" : {
 2.   "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.   "DependsOn": [
 4.     "snsTopicForAutoScalingGroup"
 5.   ],
 6.   "Properties" : {
 7.     "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
 8.     "LaunchTemplate" : {
 9.       "LaunchTemplateId" : {
10.         "Ref" : "logicalName"
11.       },
12.       "Version" : {
13.         "Fn::GetAtt" : [
14.           "logicalName",
15.           "LatestVersionNumber"
16.         ]
17.       }
18.     },
19.     "MaxSize" : "5",
20.     "MinSize" : "1",
21.     "NotificationConfigurations" : [
22.       {
23.         "TopicARN" : { "Ref" : "snsTopicForAutoScalingGroup" },
24.         "NotificationTypes" : [
25.           "autoscaling:EC2_INSTANCE_LAUNCH",
26.           "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
27.           "autoscaling:EC2_INSTANCE_TERMINATE",
28.           "autoscaling:EC2_INSTANCE_TERMINATE_ERROR",
29.           "autoscaling:TEST_NOTIFICATION"
30.         ]
31.       }
32.     ]
33.   }
34. }
```

### YAML
<a name="quickref-autoscaling-example-3.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   DependsOn:
 4.     - snsTopicForAutoScalingGroup
 5.   Properties:
 6.     VPCZoneIdentifier:
 7.       - subnetIdAz1
 8.       - subnetIdAz2
 9.       - subnetIdAz3
10.     LaunchTemplate:
11.       LaunchTemplateId: !Ref logicalName
12.       Version: !GetAtt logicalName.LatestVersionNumber
13.     MaxSize: '5'
14.     MinSize: '1'
15.     NotificationConfigurations:
16.       - TopicARN: !Ref snsTopicForAutoScalingGroup
17.         NotificationTypes:
18.           - autoscaling:EC2_INSTANCE_LAUNCH
19.           - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
20.           - autoscaling:EC2_INSTANCE_TERMINATE
21.           - autoscaling:EC2_INSTANCE_TERMINATE_ERROR
22.           - autoscaling:TEST_NOTIFICATION
```

## Criar um grupo do Auto Scaling que usa um `CreationPolicy` e um `UpdatePolicy`
<a name="scenario-as-updatepolicy"></a>

O exemplo a seguir mostra como adicionar os atributos `CreationPolicy` e `UpdatePolicy` a um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html).

A política de criação de exemplos impede que o grupo do Auto Scaling atinja o status `CREATE_COMPLETE` até que CloudFormation receba o número `Count` de sinais de êxito quando o grupo estiver pronto. Para sinalizar que o grupo do Auto Scaling está pronto, um script auxiliar `cfn-signal` adicionado aos dados do usuário do modelo de inicialização (não mostrado) é executado nas instâncias. Se as instâncias não enviarem um sinal dentro do `Timeout` especificado, o CloudFormation assumirá que as instâncias não foram criadas, a criação do recurso falhará e o CloudFormation reverterá a pilha.

A política de atualização de exemplo instrui o CloudFormation a executar uma atualização contínua usando a propriedade `AutoScalingRollingUpdate`. A atualização contínua faz alterações no grupo de Auto Scaling em pequenos lotes (neste exemplo, instância por instância) com base no `MaxBatchSize` e em um tempo de pausa entre lotes de atualizações com base no `PauseTime`. O atributo `MinInstancesInService` especifica o número mínimo de instâncias que devem estar em serviço no grupo do Auto Scaling e o CloudFormation atualiza instâncias antigas.

O atributo `WaitOnResourceSignals` é definido como `true`. O CloudFormation deve receber um sinal de cada instância nova dentro do `PauseTime` especificado para continuar a atualização. Embora a atualização da pilha esteja em andamento, os seguintes processos de Auto Scaling do EC2 são suspensos: `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification` e `ScheduledActions`. Observação: não suspenda os tipos de processo `Launch`, `Terminate` ou `AddToLoadBalancer` (se o grupo de Auto Scaling estiver sendo usado com o Elastic Load Balancing), pois isso pode impedir que a atualização contínua funcione corretamente.

A propriedade `VPCZoneIdentifier` do grupo do Auto Scaling especifica uma lista de sub-redes existentes em três diferentes zonas de disponibilidade. É necessário especificar os IDs de sub-rede aplicáveis da conta antes de criar a pilha. A propriedade `LaunchTemplate` faz referência ao nome lógico de um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) declarado em outro lugar no mesmo modelo.

Para obter mais informações sobre os atributos `CreationPolicy` e `UpdatePolicy`, consulte a [Referência de atributos de recursos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html).

### JSON
<a name="quickref-autoscaling-example-4.json"></a>

```
{
  "Resources":{
    "myASG":{
      "CreationPolicy":{
        "ResourceSignal":{
          "Count":"3",
          "Timeout":"PT15M"
        }
      },
      "UpdatePolicy":{
        "AutoScalingRollingUpdate":{
          "MinInstancesInService":"3",
          "MaxBatchSize":"1",
          "PauseTime":"PT12M5S",
          "WaitOnResourceSignals":"true",
          "SuspendProcesses":[
            "HealthCheck",
            "ReplaceUnhealthy",
            "AZRebalance",
            "AlarmNotification",
            "ScheduledActions",
            "InstanceRefresh"
          ]
        }
      },
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "VPCZoneIdentifier":[ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"logicalName"
          },
          "Version":{
            "Fn::GetAtt":[
              "logicalName",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"5",
        "MinSize":"3"
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-4.yaml"></a>

```
---
Resources:
  myASG:
    CreationPolicy:
      ResourceSignal:
        Count: '3'
        Timeout: PT15M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: '3'
        MaxBatchSize: '1'
        PauseTime: PT12M5S
        WaitOnResourceSignals: true
        SuspendProcesses:
          - HealthCheck
          - ReplaceUnhealthy
          - AZRebalance
          - AlarmNotification
          - ScheduledActions
          - InstanceRefresh
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier:
        - subnetIdAz1
        - subnetIdAz2
        - subnetIdAz3
      LaunchTemplate:
        LaunchTemplateId: !Ref logicalName
        Version: !GetAtt logicalName.LatestVersionNumber
      MaxSize: '5'
      MinSize: '3'
```

## Criar uma política de escalabilidade em etapas
<a name="scenario-step-scaling-policy"></a>

Este exemplo mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html) que aumenta a escala horizontalmente do grupo do Auto Scaling usando uma política de escalabilidade em etapas. A propriedade `AdjustmentType` especifica `ChangeInCapacity`, o que significa que `ScalingAdjustment` representa o número de instâncias para adicionar (se `ScalingAdjustment` for positivo) ou excluir (se for negativo). Neste exemplo, `ScalingAdjustment` é 1; por isso, a política incrementa o número de instâncias do EC2 no grupo em 1 quando o limite do alarme é atingido.

O recurso `CPUAlarmHigh` de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html) especifica a política de escalabilidade `ASGScalingPolicyHigh` como a ação a ser executada quando o alarme está em um estado ALARM (`AlarmActions`). A propriedade `Dimensions` faz referência ao nome lógico de um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) declarado em outro lugar no mesmo modelo.

### JSON
<a name="quickref-autoscaling-example-5.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "ASGScalingPolicyHigh":{
 4.       "Type":"AWS::AutoScaling::ScalingPolicy",
 5.       "Properties":{
 6.         "AutoScalingGroupName":{ "Ref":"logicalName" },
 7.         "PolicyType":"StepScaling",
 8.         "AdjustmentType":"ChangeInCapacity",
 9.         "StepAdjustments":[
10.           {
11.             "MetricIntervalLowerBound":0,
12.             "ScalingAdjustment":1
13.           }
14.         ]
15.       }
16.     },
17.     "CPUAlarmHigh":{
18.       "Type":"AWS::CloudWatch::Alarm",
19.       "Properties":{
20.         "EvaluationPeriods":"2",
21.         "Statistic":"Average",
22.         "Threshold":"90",
23.         "AlarmDescription":"Scale out if CPU > 90% for 2 minutes",
24.         "Period":"60",
25.         "AlarmActions":[ { "Ref":"ASGScalingPolicyHigh" } ],
26.         "Namespace":"AWS/EC2",
27.         "Dimensions":[
28.           {
29.             "Name":"AutoScalingGroupName",
30.             "Value":{ "Ref":"logicalName" }
31.           }
32.         ],
33.         "ComparisonOperator":"GreaterThanThreshold",
34.         "MetricName":"CPUUtilization"
35.       }
36.     }
37.   }
38. }
```

### YAML
<a name="quickref-autoscaling-example-5.yaml"></a>

```
 1. ---
 2. Resources:
 3.   ASGScalingPolicyHigh:
 4.     Type: AWS::AutoScaling::ScalingPolicy
 5.     Properties:
 6.       AutoScalingGroupName: !Ref logicalName
 7.       PolicyType: StepScaling
 8.       AdjustmentType: ChangeInCapacity
 9.       StepAdjustments: 
10.         - MetricIntervalLowerBound: 0
11.           ScalingAdjustment: 1
12.   CPUAlarmHigh:
13.     Type: AWS::CloudWatch::Alarm
14.     Properties:
15.       EvaluationPeriods: 2
16.       Statistic: Average
17.       Threshold: 90
18.       AlarmDescription: 'Scale out if CPU > 90% for 2 minutes'
19.       Period: 60
20.       AlarmActions:
21.         - !Ref ASGScalingPolicyHigh
22.       Namespace: AWS/EC2
23.       Dimensions:
24.         - Name: AutoScalingGroupName
25.           Value:
26.             !Ref logicalName
27.       ComparisonOperator: GreaterThanThreshold
28.       MetricName: CPUUtilization
```

### Consulte também
<a name="scenario-as-policy-see-also"></a>

Para obter mais exemplos de modelos para políticas de escalabilidade, consulte a seção [Exemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples) no recurso `AWS::AutoScaling::ScalingPolicy`.

## Exemplos de grupos de instâncias mistas
<a name="scenario-mixed-instances-group-template-examples"></a>

### Criar um grupo do Auto Scaling usando seleção de tipo de instância baseada em atributos
<a name="scenario-mixed-instances-group-instance-requirements"></a>

Este exemplo mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) que contém informações para executar um grupo de instâncias mistas utilizando a seleção de tipos de instâncias baseadas em atributos. Você especifica os valores mínimo e máximo para a propriedade `VCpuCount` e o valor mínimo para a propriedade `MemoryMiB`. Todos os tipos de instância usados pelo grupo do Auto Scaling devem corresponder aos atributos de instância exigidos. 

A propriedade `VPCZoneIdentifier` do grupo do Auto Scaling especifica uma lista de sub-redes existentes em três diferentes zonas de disponibilidade. É necessário especificar os IDs de sub-rede aplicáveis da conta antes de criar a pilha. A propriedade `LaunchTemplate` faz referência ao nome lógico de um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) declarado em outro lugar no mesmo modelo.

#### JSON
<a name="quickref-mixed-instances-group-example-2.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "myASG":{
 4.       "Type":"AWS::AutoScaling::AutoScalingGroup",
 5.       "Properties":{
 6.         "VPCZoneIdentifier":[
 7.           "subnetIdAz1",
 8.           "subnetIdAz2",
 9.           "subnetIdAz3"
10.         ],
11.         "MixedInstancesPolicy":{
12.           "LaunchTemplate":{
13.             "LaunchTemplateSpecification":{
14.               "LaunchTemplateId":{
15.                 "Ref":"logicalName"
16.               },
17.               "Version":{
18.                 "Fn::GetAtt":[
19.                   "logicalName",
20.                   "LatestVersionNumber"
21.                 ]
22.               }
23.             },
24.             "Overrides":[
25.               {
26.                 "InstanceRequirements":{
27.                   "VCpuCount":{
28.                     "Min":2,
29.                     "Max":4
30.                   },
31.                   "MemoryMiB":{
32.                     "Min":2048
33.                   }
34.                 }
35.               }
36.             ]
37.           }
38.         },
39.         "MaxSize":"5",
40.         "MinSize":"1"
41.       }
42.     }
43.   }
44. }
```

#### YAML
<a name="quickref-mixed-instances-group-example-1.yaml"></a>

```
 1. ---
 2. Resources:
 3.   myASG:
 4.     Type: AWS::AutoScaling::AutoScalingGroup
 5.     Properties:
 6.       VPCZoneIdentifier:
 7.         - subnetIdAz1
 8.         - subnetIdAz2
 9.         - subnetIdAz3
10.       MixedInstancesPolicy:
11.         LaunchTemplate:
12.           LaunchTemplateSpecification:
13.             LaunchTemplateId: !Ref logicalName
14.             Version: !GetAtt logicalName.LatestVersionNumber
15.           Overrides:
16.             - InstanceRequirements:
17.                 VCpuCount:
18.                   Min: 2
19.                   Max: 4
20.                 MemoryMiB:
21.                   Min: 2048
22.       MaxSize: '5'
23.       MinSize: '1'
```

## Exemplos de configuração de ativação
<a name="scenario-launch-config-template-examples"></a>

### Criar uma configuração de execução
<a name="scenario-as-launch-config"></a>

Este exemplo mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html) para um grupo do AutoScaling em que você especifica valores para as propriedades `ImageId`, `InstanceType` e `SecurityGroups`. A propriedade `SecurityGroups` especifica o nome lógico de um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) especificado em outro local no modelo e um grupo de segurança existente do EC2 chamado `myExistingEC2SecurityGroup`.

#### JSON
<a name="quickref-launch-config-example-1.json"></a>

```
1. "mySimpleConfig" : {
2.    "Type" : "AWS::AutoScaling::LaunchConfiguration",
3.    "Properties" : {
4.       "ImageId" : "ami-02354e95b3example",
5.       "InstanceType" : "t3.micro",
6.       "SecurityGroups" : [ { "Ref" : "logicalName" }, "myExistingEC2SecurityGroup" ]
7.    }
8. }
```

#### YAML
<a name="quickref-launch-config-example-1.yaml"></a>

```
1. mySimpleConfig:
2.   Type: AWS::AutoScaling::LaunchConfiguration
3.   Properties:
4.     ImageId: ami-02354e95b3example
5.     InstanceType: t3.micro
6.     SecurityGroups:
7.       - !Ref logicalName
8.       - myExistingEC2SecurityGroup
```

### Criar um grupo do Auto Scaling que usa uma configuração de execução
<a name="scenario-single-instance-as-group-launch-configuration"></a>

Este exemplo mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) com uma única instância. A propriedade `VPCZoneIdentifier` do grupo do Auto Scaling especifica uma lista de sub-redes existentes em três diferentes zonas de disponibilidade. É necessário especificar os IDs de sub-rede aplicáveis da conta antes de criar a pilha. A propriedade `LaunchConfigurationName` faz referência a um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html) com o nome lógico `mySimpleConfig` definido em seu modelo.

#### JSON
<a name="quickref-launch-config-example-2.json"></a>

```
1. "myASG" : {
2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
3.    "Properties" : {
4.       "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
5.       "LaunchConfigurationName" : { "Ref" : "mySimpleConfig" },
6.       "MaxSize" : "1",
7.       "MinSize" : "1"
8.    }
9. }
```

#### YAML
<a name="quickref-launch-config-example-2.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - subnetIdAz1
 6.       - subnetIdAz2
 7.       - subnetIdAz3
 8.     LaunchConfigurationName: !Ref mySimpleConfig
 9.     MaxSize: '1'
10.     MinSize: '1'
```

# Configurar recursos de ajuste de escala automático de aplicações com o CloudFormation
<a name="quickref-application-auto-scaling"></a>

Esta seção fornece exemplos de modelos do CloudFormation para políticas de escalabilidade e ações programadas do aplicação Auto Scaling para diferentes recursos da AWS.

**Importante**  
Quando um snippet do ajuste de escala automático da aplicação é incluído no modelo, talvez seja necessário declarar uma dependência do recurso escalável específico criado por meio do modelo usando o atributo `DependsOn`. Isso substitui o paralelismo padrão e direciona o CloudFormation para operar em recursos em uma ordem especificada. Caso contrário, a configuração de escalabilidade pode ser aplicada antes que o recurso tenha sido configurado completamente.  
Para obter mais informações, consulte o atributo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html).

**Topics**
+ [Criar uma política de escalabilidade para uma frota do AppStream](#w2aac11c41c15c19b9)
+ [Criar uma política de escalabilidade para um cluster de banco de dados Aurora](#w2aac11c41c15c19c11)
+ [Criar uma política de escalabilidade para uma tabela do DynamoDB](#w2aac11c41c15c19c13)
+ [Criar uma política de escalabilidade para um serviço do Amazon ECS (métricas: média de CPU e memória)](#w2aac11c41c15c19c15)
+ [Criar uma política de escalabilidade para um serviço do Amazon ECS (métrica: contagem média de solicitações por destino)](#w2aac11c41c15c19c17)
+ [Criar uma ação programada com uma expressão cron para uma função do Lambda](#w2aac11c41c15c19c19)
+ [Criar uma ação programada com uma expressão `at` para uma frota spot](#w2aac11c41c15c19c21)

## Criar uma política de escalabilidade para uma frota do AppStream
<a name="w2aac11c41c15c19b9"></a>

Este snippet mostra como criar uma política e aplicá-la a um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html) usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html). O recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) declara um destino escalável ao qual essa política é aplicada. O Application Auto Scaling pode dimensionar o número de instâncias da frota no mínimo de 1 instância e no máximo 20. A política mantém a utilização média da capacidade da frota em 75%, com períodos de esfriamento de aumento e redução de escala horizontalmente de 300 segundos (5 minutos).

Ela usa as funções intrínsecas `Fn::Join` e `Rev` para construir a propriedade `ResourceId` com o nome lógico do recurso `AWS::AppStream::Fleet` especificado no mesmo modelo. Para obter mais informações, consulte [Referência de funções intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-6.json"></a>

```
{
  "Resources" : {
    "ScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 20,
        "MinCapacity" : 1,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet" },
        "ServiceNamespace" : "appstream",
        "ScalableDimension" : "appstream:fleet:DesiredCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "fleet",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        }
      }
    },
    "ScalingPolicyAppStreamFleet" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu75" },
        "PolicyType" : "TargetTrackingScaling",
        "ServiceNamespace" : "appstream",
        "ScalableDimension" : "appstream:fleet:DesiredCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "fleet",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 75,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "AppStreamAverageCapacityUtilization"
          },
          "ScaleInCooldown" : 300,
          "ScaleOutCooldown" : 300
        }
      }
    } 
  }
}
```

### YAML
<a name="quickref-autoscaling-example-6.yaml"></a>

```
---
Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 20
      MinCapacity: 1
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet'
      ServiceNamespace: appstream
      ScalableDimension: appstream:fleet:DesiredCapacity
      ResourceId: !Join
        - /
        - - fleet
          - !Ref logicalName
  ScalingPolicyAppStreamFleet:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu75
      PolicyType: TargetTrackingScaling
      ServiceNamespace: appstream
      ScalableDimension: appstream:fleet:DesiredCapacity
      ResourceId: !Join
        - /
        - - fleet
          - !Ref logicalName
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 75
        PredefinedMetricSpecification:
          PredefinedMetricType: AppStreamAverageCapacityUtilization
        ScaleInCooldown: 300
        ScaleOutCooldown: 300
```

## Criar uma política de escalabilidade para um cluster de banco de dados Aurora
<a name="w2aac11c41c15c19c11"></a>

Neste snippet, você registra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html). O recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) indica que o cluster de banco de dados deve ser escalado dinamicamente para ter de uma a oito réplicas do Aurora. Também é possível aplicar uma política de escalabilidade de rastreamento de destino ao cluster usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html).

Nessa configuração, a métrica predefinida `RDSReaderAverageCPUUtilization` é usada para ajustar um cluster de banco de dados Aurora com base em uma utilização média da CPU de 40 por cento em todas as réplicas do Aurora nesse cluster de banco de dados Aurora. A configuração fornece um desaquecimento de redução de 10 minutos e em um desaquecimento de expansão de 5 minutos.

Esse exemplo usa a função intrínseca `Fn::Sub` para construir a propriedade `ResourceId` com o nome lógico do recurso `AWS::RDS::DBCluster` especificado no mesmo modelo. Para obter mais informações, consulte [Referência de funções intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-7.json"></a>

```
{
  "Resources" : {
    "ScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 8,
        "MinCapacity" : 1,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster" },
        "ServiceNamespace" : "rds",
        "ScalableDimension" : "rds:cluster:ReadReplicaCount",
        "ResourceId" : { "Fn::Sub" : "cluster:${logicalName}" }
      }
    },
    "ScalingPolicyDBCluster" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu40" },
        "PolicyType" : "TargetTrackingScaling",
        "ServiceNamespace" : "rds",
        "ScalableDimension" : "rds:cluster:ReadReplicaCount",
        "ResourceId" : { "Fn::Sub" : "cluster:${logicalName}" }, 
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 40,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "RDSReaderAverageCPUUtilization"
          },
          "ScaleInCooldown" : 600,
          "ScaleOutCooldown" : 300
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-7.yaml"></a>

```
---
Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 8
      MinCapacity: 1
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster'
      ServiceNamespace: rds
      ScalableDimension: rds:cluster:ReadReplicaCount
      ResourceId: !Sub cluster:${logicalName}
  ScalingPolicyDBCluster:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu40
      PolicyType: TargetTrackingScaling
      ServiceNamespace: rds
      ScalableDimension: rds:cluster:ReadReplicaCount
      ResourceId: !Sub cluster:${logicalName}
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 40
        PredefinedMetricSpecification:
          PredefinedMetricType: RDSReaderAverageCPUUtilization
        ScaleInCooldown: 600
        ScaleOutCooldown: 300
```

## Criar uma política de escalabilidade para uma tabela do DynamoDB
<a name="w2aac11c41c15c19c13"></a>

Esse trecho mostra como criar uma política com o tipo de política `TargetTrackingScaling` e aplicá-la a um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html) usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html). O recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) declara um destino escalável ao qual essa política é aplicada, com um mínimo de cinco unidades de capacidade de gravação e um máximo de 15. A política de escalabilidade escala o throughput da capacidade de gravação da tabela para manter a utilização de destino em 50% com base na métrica `DynamoDBWriteCapacityUtilization` predefinida.

Ela usa as funções intrínsecas `Fn::Join` e `Ref` para construir a propriedade `ResourceId` com o nome lógico do recurso `AWS::DynamoDB::Table` especificado no mesmo modelo. Para obter mais informações, consulte [Referência de funções intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**nota**  
Para obter mais informações sobre como criar um modelo do CloudFormation para recursos do DynamoDB, consulte a postagem [Como usar o CloudFormation para configurar o ajuste de escala automático para tabelas e índices do Amazon DynamoDB](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/) no blog sobre banco de dados da AWS.

### JSON
<a name="quickref-autoscaling-example-8.json"></a>

```
{
  "Resources" : {
    "WriteCapacityScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 15,
        "MinCapacity" : 5,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" },
        "ServiceNamespace" : "dynamodb",
        "ScalableDimension" : "dynamodb:table:WriteCapacityUnits",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "table",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        }
      }
    },
    "WriteScalingPolicy" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : "WriteScalingPolicy",
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "WriteCapacityScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 50.0,
          "ScaleInCooldown" : 60,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "DynamoDBWriteCapacityUtilization"
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-8.yaml"></a>

```
---
Resources:
  WriteCapacityScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 15
      MinCapacity: 5
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
      ServiceNamespace: dynamodb
      ScalableDimension: dynamodb:table:WriteCapacityUnits
      ResourceId: !Join
        - /
        - - table
          - !Ref logicalName
  WriteScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: WriteScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 50.0
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
```

## Criar uma política de escalabilidade para um serviço do Amazon ECS (métricas: média de CPU e memória)
<a name="w2aac11c41c15c19c15"></a>

Este snippet mostra como criar uma política e aplicá-la a um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html) usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html). O recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) declara um destino escalável ao qual essa política é aplicada. O Application Auto Scaling pode escalar o número de tarefas em um mínimo de 1 tarefa e um máximo de 6.

Ele cria duas políticas de escalabilidade com o tipo de política `TargetTrackingScaling`. As políticas são usadas para escalar o serviço do ECS com base no uso médio de CPU e memória do serviço. Ele usa as funções intrínsecas `Fn::Join` e `Ref` para criar a propriedade `ResourceId` com os nomes lógicos dos recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html) (`myContainerCluster`) e `AWS::ECS::Service` (`myService`) especificados no mesmo modelo. Para obter mais informações, consulte [Referência de funções intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-9.json"></a>

```
{
  "Resources" : {
    "ECSScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : "6",
        "MinCapacity" : "1",
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" },
        "ServiceNamespace" : "ecs",
        "ScalableDimension" : "ecs:service:DesiredCount",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "service",
              {
                "Ref" : "myContainerCluster"
              },
              {
                "Fn::GetAtt" : [
                  "myService",
                  "Name"
                ]
              }
            ]
          ]
        }
      }
    },
    "ServiceScalingPolicyCPU" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu70" },
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 70.0,
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ECSServiceAverageCPUUtilization"
          }
        }
      }
    },
    "ServiceScalingPolicyMem" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-mem90" },
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 90.0,
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ECSServiceAverageMemoryUtilization"
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-9.yaml"></a>

```
---
Resources:
  ECSScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 6
      MinCapacity: 1  
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService'
      ServiceNamespace: ecs
      ScalableDimension: 'ecs:service:DesiredCount'
      ResourceId: !Join 
        - /
        - - service
          - !Ref myContainerCluster
          - !GetAtt myService.Name
  ServiceScalingPolicyCPU:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu70
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 70.0
        ScaleInCooldown: 180
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageCPUUtilization
  ServiceScalingPolicyMem:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-mem90
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 90.0
        ScaleInCooldown: 180
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageMemoryUtilization
```

## Criar uma política de escalabilidade para um serviço do Amazon ECS (métrica: contagem média de solicitações por destino)
<a name="w2aac11c41c15c19c17"></a>

O exemplo a seguir aplica uma política de escalabilidade de rastreamento de destino com a métrica predefinida `ALBRequestCountPerTarget` a um serviço do ECS. A política é usada para adicionar capacidade ao serviço do ECS quando a contagem de solicitações por destino (por minuto) excede o valor de destino. Como o valor de `DisableScaleIn` é definido como `true`, a política de rastreamento de destino não removerá a capacidade do destino escalável.

Ele usa as funções intrínsecas `Fn::Join` e `Fn::GetAtt` para criar a propriedade `ResourceLabel` com os nomes lógicos dos recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html) (`myLoadBalancer`) e [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) (`myTargetGroup`) especificados no mesmo modelo. Para obter mais informações, consulte [Referência de funções intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

As propriedades `MaxCapacity` e `MinCapacity` do destino escalável e a propriedade `TargetValue` dos valores de parâmetro de referência da política de escalabilidade que você transfere para o modelo ao criar ou atualizar uma pilha.

### JSON
<a name="quickref-autoscaling-example-10.json"></a>

```
{
  "Resources" : {
    "ECSScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : { "Ref" : "MaxCount" },
        "MinCapacity" : { "Ref" : "MinCount" },
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" },
        "ServiceNamespace" : "ecs",
        "ScalableDimension" : "ecs:service:DesiredCount",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "service",
              {
                "Ref" : "myContainerCluster"
              },
              {
                "Fn::GetAtt" : [
                  "myService",
                  "Name"
                ]
              }
            ]
          ]
        }
      }
    },
    "ServiceScalingPolicyALB" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : "alb-requests-per-target-per-minute",
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : { "Ref" : "ALBPolicyTargetValue" },
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 30,
          "DisableScaleIn" : true,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ALBRequestCountPerTarget",
            "ResourceLabel" : {
              "Fn::Join" : [
                "/",
                [
                  {
                    "Fn::GetAtt" : [
                      "myLoadBalancer",
                      "LoadBalancerFullName"
                    ]
                  },
                  {
                    "Fn::GetAtt" : [
                      "myTargetGroup",
                      "TargetGroupFullName"
                    ]
                  }
                ]
              ]
            }
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-10.yaml"></a>

```
---
Resources:
  ECSScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: !Ref MaxCount
      MinCapacity: !Ref MinCount  
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService'
      ServiceNamespace: ecs
      ScalableDimension: 'ecs:service:DesiredCount'
      ResourceId: !Join 
        - /
        - - service
          - !Ref myContainerCluster
          - !GetAtt myService.Name
  ServiceScalingPolicyALB:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: alb-requests-per-target-per-minute
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: !Ref ALBPolicyTargetValue
        ScaleInCooldown: 180
        ScaleOutCooldown: 30
        DisableScaleIn: true
        PredefinedMetricSpecification:
          PredefinedMetricType: ALBRequestCountPerTarget
          ResourceLabel: !Join 
            - '/' 
            - - !GetAtt myLoadBalancer.LoadBalancerFullName
              - !GetAtt myTargetGroup.TargetGroupFullName
```

## Criar uma ação programada com uma expressão cron para uma função do Lambda
<a name="w2aac11c41c15c19c19"></a>

Esse trecho registra a simultaneidade provisionada para um alias de função ([https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html)) denominado `BLUE` usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html). Ele também cria uma ação programada com uma programação recorrente usando uma expressão cron. O fuso horário para a programação recorrente é UTC.

Ele usa as funções intrínsecas `Fn::Join` e `Ref` na propriedade `RoleARN` para especificar o ARN do perfil vinculado ao serviço. Ele usa a função intrínseca `Fn::Sub` para criar a propriedade `ResourceId` com o nome lógico do recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) ou [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) especificado no mesmo modelo. Para obter mais informações, consulte [Referência de funções intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**nota**  
Não é possível alocar simultaneidade provisionada em um alias que aponte para a versão não publicada (`$LATEST`).  
Para obter mais informações sobre como criar um modelo do CloudFormation para recursos do Lambda, consulte a publicação do blog [Scheduling AWS Lambda Provisioned Concurrency for recurring peak usage](https://aws.amazon.com/blogs/compute/scheduling-aws-lambda-provisioned-concurrency-for-recurring-peak-usage/), no blog sobre computação da AWS.

### JSON
<a name="quickref-autoscaling-example-11.json"></a>

```
{
  "ScalableTarget" : {
    "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
    "Properties" : {
      "MaxCapacity" : 250,
      "MinCapacity" : 0,
      "RoleARN" : {
        "Fn::Join" : [
          ":",
          [
            "arn:aws:iam:",
            {
              "Ref" : "AWS::AccountId"
            },
            "role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency"
          ]
        ]
      },
      "ServiceNamespace" : "lambda",
      "ScalableDimension" : "lambda:function:ProvisionedConcurrency",
      "ResourceId" : { "Fn::Sub" : "function:${logicalName}:BLUE" },
      "ScheduledActions" : [
        {
          "ScalableTargetAction" : {
            "MinCapacity" : "250"
          },
          "ScheduledActionName" : "my-scale-out-scheduled-action",
          "Schedule" : "cron(0 18 * * ? *)",
          "EndTime" : "2022-12-31T12:00:00.000Z"
        }
      ]
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-11.yaml"></a>

```
ScalableTarget:
  Type: AWS::ApplicationAutoScaling::ScalableTarget
  Properties:
    MaxCapacity: 250
    MinCapacity: 0
    RoleARN: !Join 
      - ':'
      - - 'arn:aws:iam:'
        - !Ref 'AWS::AccountId'
        - role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency
    ServiceNamespace: lambda
    ScalableDimension: lambda:function:ProvisionedConcurrency
    ResourceId: !Sub function:${logicalName}:BLUE
    ScheduledActions:
      - ScalableTargetAction:
          MinCapacity: 250
        ScheduledActionName: my-scale-out-scheduled-action
        Schedule: 'cron(0 18 * * ? *)'
        EndTime: '2022-12-31T12:00:00.000Z'
```

## Criar uma ação programada com uma expressão `at` para uma frota spot
<a name="w2aac11c41c15c19c21"></a>

Este snippet mostra como criar duas ações programadas que ocorrem somente uma vez para um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-spotfleet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-spotfleet.html) usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html). O fuso horário para cada ação programada para ocorrer uma única vez é UTC.

Ela usa as funções intrínsecas `Fn::Join` e `Ref` para construir a propriedade `ResourceId` com o nome lógico do recurso `AWS::EC2::SpotFleet` especificado no mesmo modelo. Para obter mais informações, consulte [Referência de funções intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**nota**  
A solicitação de frota spot deve ter o tipo de solicitação `maintain`. O dimensionamento automático não é compatível com solicitações únicas nem blocos spot.

### JSON
<a name="quickref-autoscaling-example-12.json"></a>

```
{
  "Resources" : {
    "SpotFleetScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 0,
        "MinCapacity" : 0,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest" },
        "ServiceNamespace" : "ec2",
        "ScalableDimension" : "ec2:spot-fleet-request:TargetCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "spot-fleet-request",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        },
        "ScheduledActions" : [
          {
            "ScalableTargetAction" : {
              "MaxCapacity" : "10",
              "MinCapacity" : "10"
            },
            "ScheduledActionName" : "my-scale-out-scheduled-action",
            "Schedule" : "at(2022-05-20T13:00:00)"
          },
          {
            "ScalableTargetAction" : {
              "MaxCapacity" : "0",
              "MinCapacity" : "0"
            },
            "ScheduledActionName" : "my-scale-in-scheduled-action",
            "Schedule" : "at(2022-05-20T21:00:00)"
          }
        ]
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-12.yaml"></a>

```
---
Resources:
  SpotFleetScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 0
      MinCapacity: 0
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest'
      ServiceNamespace: ec2
      ScalableDimension: 'ec2:spot-fleet-request:TargetCapacity'
      ResourceId: !Join 
        - /
        - - spot-fleet-request
          - !Ref logicalName
      ScheduledActions:
        - ScalableTargetAction:
            MaxCapacity: 10
            MinCapacity: 10
          ScheduledActionName: my-scale-out-scheduled-action
          Schedule: 'at(2022-05-20T13:00:00)'
        - ScalableTargetAction:
            MaxCapacity: 0
            MinCapacity: 0
          ScheduledActionName: my-scale-in-scheduled-action
          Schedule: 'at(2022-05-20T21:00:00)'
```

# Snippets de modelo do Console de faturamento da AWS
<a name="quickref-billingconductor"></a>

Esse exemplo cria um plano de preços com uma regra de preço com marcação global de 10%. Esse plano de preços está anexado ao grupo de faturamento. O grupo de faturamento também tem dois itens de linha personalizados que aplicam uma cobrança de USD 10 e uma cobrança de 10% sobre o custo total do grupo de faturamento.

## JSON
<a name="quickref-billingconductor-example-1.json"></a>

```
 1. {
 2.    "Parameters": {
 3.       "LinkedAccountIds": {
 4.          "Type": "ListNumber"
 5.       },
 6.       "PrimaryAccountId": {
 7.          "Type": "Number"
 8.       }
 9.    },
10.    "Resources": {
11.       "TestPricingRule": {
12.          "Type": "AWS::BillingConductor::PricingRule",
13.          "Properties": {
14.             "Name": "TestPricingRule",
15.             "Description": "Test pricing rule created through Cloudformation. Mark everything by 10%.",
16.             "Type": "MARKUP",
17.             "Scope": "GLOBAL",
18.             "ModifierPercentage": 10
19.          }
20.       },
21.       "TestPricingPlan": {
22.          "Type": "AWS::BillingConductor::PricingPlan",
23.          "Properties": {
24.             "Name": "TestPricingPlan",
25.             "Description": "Test pricing plan created through Cloudformation.",
26.             "PricingRuleArns": [
27.                {"Fn::GetAtt": ["TestPricingRule", "Arn"]}
28.             ]
29.          }
30.       },
31.       "TestBillingGroup": {
32.          "Type": "AWS::BillingConductor::BillingGroup",
33.          "Properties": {
34.             "Name": "TestBillingGroup",
35.             "Description": "Test billing group created through Cloudformation with 1 linked account. The linked account is also the primary account.",
36.             "PrimaryAccountId": {
37.                "Ref": "PrimaryAccountId"
38.             },
39.             "AccountGrouping": {
40.                "LinkedAccountIds": null
41.             },
42.             "ComputationPreference": {
43.                "PricingPlanArn": {
44.                  "Fn::GetAtt": ["TestPricingPlan", "Arn"]
45.                }
46.             }
47.          }
48.       },
49.       "TestFlatCustomLineItem": {
50.          "Type": "AWS::BillingConductor::CustomLineItem",
51.          "Properties": {
52.             "Name": "TestFlatCustomLineItem",
53.             "Description": "Test flat custom line item created through Cloudformation for a $10 charge.",
54.             "BillingGroupArn": {
55.               "Fn::GetAtt": ["TestBillingGroup", "Arn"]
56.             },
57.             "CustomLineItemChargeDetails": {
58.                "Flat": {
59.                   "ChargeValue": 10
60.                },
61.                "Type": "FEE"
62.             }
63.          }
64.       },
65.       "TestPercentageCustomLineItem": {
66.          "Type": "AWS::BillingConductor::CustomLineItem",
67.          "Properties": {
68.             "Name": "TestPercentageCustomLineItem",
69.             "Description": "Test percentage custom line item created through Cloudformation for a %10 additional charge on the overall total bill of the billing group.",
70.             "BillingGroupArn": {
71.               "Fn::GetAtt": ["TestBillingGroup", "Arn"]
72.             },
73.             "CustomLineItemChargeDetails": {
74.                "Percentage": {
75.                   "PercentageValue": 10,
76.                   "ChildAssociatedResources": [
77.                      {"Fn::GetAtt": ["TestBillingGroup", "Arn"]}
78.                   ]
79.                },
80.                "Type": "FEE"
81.             }
82.          }
83.       }
84.    }
85. }
```

## YAML
<a name="quickref-billingconductor-example-1.yaml"></a>

```
 1. Parameters:
 2.   LinkedAccountIds:
 3.     Type: ListNumber
 4.   PrimaryAccountId:
 5.     Type: Number
 6. Resources:
 7.   TestPricingRule:
 8.     Type: AWS::BillingConductor::PricingRule
 9.     Properties:
10.       Name: 'TestPricingRule'
11.       Description: 'Test pricing rule created through Cloudformation. Mark everything by 10%.'
12.       Type: 'MARKUP'
13.       Scope: 'GLOBAL'
14.       ModifierPercentage: 10
15.   TestPricingPlan:
16.     Type: AWS::BillingConductor::PricingPlan
17.     Properties:
18.       Name: 'TestPricingPlan'
19.       Description: 'Test pricing plan created through Cloudformation.'
20.       PricingRuleArns:
21.         - !GetAtt TestPricingRule.Arn
22.   TestBillingGroup:
23.     Type: AWS::BillingConductor::BillingGroup
24.     Properties:
25.       Name: 'TestBillingGroup'
26.       Description: 'Test billing group created through Cloudformation with 1 linked account. The linked account is also the primary account.'
27.       PrimaryAccountId: !Ref PrimaryAccountId
28.       AccountGrouping:
29.         LinkedAccountIds: !Ref LinkedAccountIds
30.       ComputationPreference:
31.         PricingPlanArn: !GetAtt TestPricingPlan.Arn
32.   TestFlatCustomLineItem:
33.     Type: AWS::BillingConductor::CustomLineItem
34.     Properties:
35.       Name: 'TestFlatCustomLineItem'
36.       Description: 'Test flat custom line item created through Cloudformation for a $10 charge.'
37.       BillingGroupArn: !GetAtt TestBillingGroup.Arn
38.       CustomLineItemChargeDetails:
39.         Flat:
40.           ChargeValue: 10
41.         Type: 'FEE'
42.   TestPercentageCustomLineItem:
43.     Type: AWS::BillingConductor::CustomLineItem
44.     Properties:
45.       Name: 'TestPercentageCustomLineItem'
46.       Description: 'Test percentage custom line item created through Cloudformation for a %10 additional charge on the overall total bill of the billing group.'
47.       BillingGroupArn: !GetAtt TestBillingGroup.Arn
48.       CustomLineItemChargeDetails:
49.         Percentage:
50.           PercentageValue: 10
51.           ChildAssociatedResources:
52.             - !GetAtt TestBillingGroup.Arn
53.         Type: 'FEE'
```

# Trechos de modelo do CloudFormation
<a name="quickref-cloudformation"></a>

**Topics**
+ [Pilhas aninhadas](#w2aac11c41c23b5)
+ [Condição de espera](#w2aac11c41c23b7)

## Pilhas aninhadas
<a name="w2aac11c41c23b5"></a>

### Aninhar uma pilha em um modelo
<a name="scenario-stack"></a>

Este modelo de exemplo contém um recurso de pilha aninhada chamado `myStack`. Quando cria uma pilha com base no modelo, o CloudFormation cria o `myStack`, cujo modelo é especificado na propriedade `TemplateURL`. O valor de saída `StackRef` retorna o ID de pilha de `myStack`, e o valor `OutputFromNestedStack` retorna o valor de saída `BucketName` do recurso `myStack`. O formato `Outputs.nestedstackoutputname` é reservado para especificar valores de saída de pilhas aninhadas e pode ser usado em qualquer lugar dentro do modelo que a contém.

Para obter mais informações, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html).

#### JSON
<a name="quickref-cloudformation-example-1.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myStack" : {
 5. 	       "Type" : "AWS::CloudFormation::Stack",
 6. 	       "Properties" : {
 7. 	        "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template",
 8.               "TimeoutInMinutes" : "60"
 9. 	       }
10.         }
11.     },
12.     "Outputs": {
13.        "StackRef": {"Value": { "Ref" : "myStack"}},
14.        "OutputFromNestedStack" : {
15.              "Value" : { "Fn::GetAtt" : [ "myStack", "Outputs.BucketName" ] }
16.        }
17.     }
18. }
```

#### YAML
<a name="quickref-cloudformation-example-1.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myStack:
 4.     Type: AWS::CloudFormation::Stack
 5.     Properties:
 6.       TemplateURL: https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template
 7.       TimeoutInMinutes: '60'
 8. Outputs:
 9.   StackRef:
10.     Value: !Ref myStack
11.   OutputFromNestedStack:
12.     Value: !GetAtt myStack.Outputs.BucketName
```

### Aninhar uma pilha com parâmetros de entrada em um modelo
<a name="scenario-stack-parameters"></a>

Este modelo de exemplo contém um recurso de pilha que especifica parâmetros de entrada. Quando o CloudFormation cria uma pilha com base nesse modelo, ele usa os pares de valores declarados dentro da propriedade `Parameters` como os parâmetros de entrada para o modelo usado na criação da pilha `myStackWithParams`. Neste exemplo, os parâmetros `InstanceType` e `KeyName` são especificados.

Para obter mais informações, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html).

#### JSON
<a name="quickref-cloudformation-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myStackWithParams" : {
 5.   	       "Type" : "AWS::CloudFormation::Stack",
 6. 	       "Properties" : {
 7. 	           "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2ChooseAMI.template",
 8. 	           "Parameters" : {
 9. 	               "InstanceType" : "t2.micro",
10. 	               "KeyName" : "mykey"
11. 	           }
12.    	       }
13.         }
14.     }
15. }
```

#### YAML
<a name="quickref-cloudformation-example-2.yaml"></a>

```
1. AWSTemplateFormatVersion: '2010-09-09'
2. Resources:
3.   myStackWithParams:
4.     Type: AWS::CloudFormation::Stack
5.     Properties:
6.       TemplateURL: https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2ChooseAMI.template
7.       Parameters:
8.         InstanceType: t2.micro
9.         KeyName: mykey
```

## Condição de espera
<a name="w2aac11c41c23b7"></a>

### Usar uma condição de espera com uma instância do Amazon EC2
<a name="scenario-waitcondition"></a>

**Importante**  
Para recursos do Amazon EC2 e do Auto Scaling, recomendamos usar um atributo CreationPolicy, em vez de condições de espera. Adicione um atributo CreationPolicy a esses recursos e use o script auxiliar cfn-signal para sinalizar quando um processo de criação de instância foi concluído com êxito.

Caso não possa usar uma política de criação, você visualiza o modelo de exemplo a seguir, que declara uma instância Amazon EC2 com uma condição de espera. A condição de espera `myWaitCondition` usa `myWaitConditionHandle` para sinalização, usa o atributo `DependsOn` para especificar que a condição de espera será acionada depois do recurso de instância do Amazon EC2 ter sido criado e usa a propriedade `Timeout` para especificar uma duração de 4.500 segundos para a condição de espera. Além disso, o URL pré-assinado que sinaliza a condição de espera é passado para a instância do Amazon EC2 com a propriedade `UserData` do recurso `Ec2Instance`, o que permite que uma aplicação ou um script em execução nessa instância do Amazon EC2 recupere o URL pré-assinado e o empregue a fim de sinalizar um êxito ou uma falha para a condição de espera. Você precisa usar `cfn-signal` ou criar a aplicação ou o script que sinaliza a condição de espera. O valor de saída `ApplicationData` contém os dados repassados pelo sinal da condição de espera.

Para obter mais informações, consulte [Criar condições de espera em um modelo do CloudFormation](using-cfn-waitcondition.md).

#### JSON
<a name="quickref-cloudformation-example-3.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Mappings" : {
 4.         "RegionMap" : {
 5.             "us-east-1" : {
 6.                 "AMI" : "ami-0123456789abcdef0"
 7.             },
 8.             "us-west-1" : {
 9.                 "AMI" : "ami-0987654321fedcba0"
10.             },
11.             "eu-west-1" : {
12.                 "AMI" : "ami-0abcdef123456789a"
13.             },
14.             "ap-northeast-1" : {
15.                 "AMI" : "ami-0fedcba987654321b"
16.             },
17.             "ap-southeast-1" : {
18.                 "AMI" : "ami-0c1d2e3f4a5b6c7d8"
19.             }
20.         }
21.     },
22.     "Resources" : {
23.         "Ec2Instance" : {
24.             "Type" : "AWS::EC2::Instance",
25.             "Properties" : {
26.                 "UserData" : { "Fn::Base64" : {"Ref" : "myWaitHandle"}},
27.                 "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}
28.             }
29.         },
30.         "myWaitHandle" : {
31.             "Type" : "AWS::CloudFormation::WaitConditionHandle",
32.             "Properties" : {
33.             }
34.         },
35.         "myWaitCondition" : {
36.             "Type" : "AWS::CloudFormation::WaitCondition",
37.             "DependsOn" : "Ec2Instance",
38.             "Properties" : {
39.                 "Handle" : { "Ref" : "myWaitHandle" },
40.                 "Timeout" : "4500"
41.             }
42.         }
43.     },
44.     "Outputs" : {
45.         "ApplicationData" : {
46.             "Value" : { "Fn::GetAtt" : [ "myWaitCondition", "Data" ]},
47.             "Description" : "The data passed back as part of signalling the WaitCondition."
48.         }
49.     }
50. }
```

#### YAML
<a name="quickref-cloudformation-example-3.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Mappings:
 3.   RegionMap:
 4.     us-east-1:
 5.       AMI: ami-0123456789abcdef0
 6.     us-west-1:
 7.       AMI: ami-0987654321fedcba0
 8.     eu-west-1:
 9.       AMI: ami-0abcdef123456789a
10.     ap-northeast-1:
11.       AMI: ami-0fedcba987654321b
12.     ap-southeast-1:
13.       AMI: ami-0c1d2e3f4a5b6c7d8
14. Resources:
15.   Ec2Instance:
16.     Type: AWS::EC2::Instance
17.     Properties:
18.       UserData:
19.         Fn::Base64: !Ref myWaitHandle
20.       ImageId:
21.         Fn::FindInMap:
22.         - RegionMap
23.         - Ref: AWS::Region
24.         - AMI
25.   myWaitHandle:
26.     Type: AWS::CloudFormation::WaitConditionHandle
27.     Properties: {}
28.   myWaitCondition:
29.     Type: AWS::CloudFormation::WaitCondition
30.     DependsOn: Ec2Instance
31.     Properties:
32.       Handle: !Ref myWaitHandle
33.       Timeout: '4500'
34. Outputs:
35.   ApplicationData:
36.     Value: !GetAtt myWaitCondition.Data
37.     Description: The data passed back as part of signalling the WaitCondition.
```

### Usar o script auxiliar cfn-signal para sinalizar uma condição de espera
<a name="scenario-waitcondition-cfn-signal"></a>

Este exemplo mostra uma linha de comando `cfn-signal` que sinaliza êxito para uma condição de espera. Você precisa definir a linha de comando na propriedade `UserData` da instância do EC2.

#### JSON
<a name="w2aac11c41c23b7b4b4"></a>

```
"UserData": {
  "Fn::Base64": {
    "Fn::Join": [
      "", 
      [
         "#!/bin/bash -xe\n",
         "/opt/aws/bin/cfn-signal --exit-code 0 '", 
         {
           "Ref": "myWaitHandle"
         },
         "'\n"
      ]   
    ]
  }
}
```

#### YAML
<a name="w2aac11c41c23b7b4b6"></a>

```
UserData:
  Fn::Base64: !Sub |
    #!/bin/bash -xe
    /opt/aws/bin/cfn-signal --exit-code 0 '${myWaitHandle}'
```

### Usar Curl para sinalizar uma condição de espera
<a name="scenario-waitcondition-curl"></a>

Este exemplo mostra uma linha de comando Curl que sinaliza êxito para uma condição de espera.

```
1. curl -T /tmp/a "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
```

Em que o arquivo/tmp/a contém a seguinte estrutura JSON:

```
1. {
2.   "Status" : "SUCCESS",
3.   "Reason" : "Configuration Complete",
4.   "UniqueId" : "ID1234",
5.   "Data" : "Application has completed configuration."
6. }
```

Este exemplo mostra uma linha de comando Curl que envia o mesmo sinal de êxito, exceto por enviar o JSON como um parâmetro na linha de comando.

```
1. curl -X PUT -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
```

# Trechos de modelo do Amazon CloudFront
<a name="quickref-cloudfront"></a>

Use esses trechos do modelo de exemplo com o recurso de distribuição do Amazon CloudFront no CloudFormation. Para obter mais informações, consulte [Amazon CloudFront resource type reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudFront.html).

**Topics**
+ [Recurso de distribuição do Amazon CloudFront com uma origem do Amazon S3](#scenario-cloudfront-s3origin)
+ [Recurso de distribuição do Amazon CloudFront com origem personalizada](#scenario-cloudfront-customorigin)
+ [Distribuição do Amazon CloudFront com suporte a múltiplas origens.](#scenario-cloudfront-multiorigin)
+ [Distribuição do Amazon CloudFront com uma função do Lambda como origem](#scenario-cloudfront-lambda-origin)
+ [Consulte também](#w2aac11c41c27c15)

## Recurso de distribuição do Amazon CloudFront com uma origem do Amazon S3
<a name="scenario-cloudfront-s3origin"></a>

O modelo de exemplo, apresentado a seguir, mostra uma [distribuição](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) do Amazon CloudFront usando um [S3Origin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-s3originconfig.html) e uma identidade do acesso de origem (OAI) herdada. Para obter informações sobre como usar o controle do acesso à origem (OAC), consulte [Restringir o acesso ao conteúdo de uma origem do Amazon Simple Storage Service](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) no *Guia do desenvolvedor do Amazon CloudFront*.

### JSON
<a name="quickref-cloudfront-example-1.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myDistribution" : {
 5.             "Type" : "AWS::CloudFront::Distribution",
 6.             "Properties" : {
 7.                 "DistributionConfig" : {
 8.                     "Origins" : [ {
 9.                         "DomainName" : "amzn-s3-demo-bucket.s3.amazonaws.com",
10.                         "Id" : "myS3Origin",
11.                         "S3OriginConfig" : {
12.                             "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
13.                         }
14.                     }],
15.                     "Enabled" : "true",
16.                     "Comment" : "Some comment",
17.                     "DefaultRootObject" : "index.html",
18.                     "Logging" : {
19.                         "IncludeCookies" : "false",
20.                         "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
21.                         "Prefix" : "myprefix"
22.                     },
23.                     "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],
24.                     "DefaultCacheBehavior" : {
25.                         "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
26.                         "TargetOriginId" : "myS3Origin",
27.                         "ForwardedValues" : {
28.                             "QueryString" : "false",
29.                             "Cookies" : { "Forward" : "none" }
30.                         },
31.                         "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
32.                         "ViewerProtocolPolicy" : "allow-all"
33.                     },
34.                    "PriceClass" : "PriceClass_200",
35.                    "Restrictions" : {
36.                        "GeoRestriction" : {
37.                            "RestrictionType" : "whitelist",
38.                            "Locations" : [ "AQ", "CV" ]
39.                        }
40.                    },
41.                    "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }  
42.                 }
43.             }
44.         }
45.     }
46. }
```

### YAML
<a name="quickref-cloudfront-example-1.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myDistribution:
 4.     Type: AWS::CloudFront::Distribution
 5.     Properties:
 6.       DistributionConfig:
 7.         Origins:
 8.         - DomainName: amzn-s3-demo-bucket.s3.amazonaws.com
 9.           Id: myS3Origin
10.           S3OriginConfig:
11.             OriginAccessIdentity: origin-access-identity/cloudfront/E127EXAMPLE51Z
12.         Enabled: 'true'
13.         Comment: Some comment
14.         DefaultRootObject: index.html
15.         Logging:
16.           IncludeCookies: 'false'
17.           Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
18.           Prefix: myprefix
19.         Aliases:
20.         - mysite.example.com
21.         - yoursite.example.com
22.         DefaultCacheBehavior:
23.           AllowedMethods:
24.           - DELETE
25.           - GET
26.           - HEAD
27.           - OPTIONS
28.           - PATCH
29.           - POST
30.           - PUT
31.           TargetOriginId: myS3Origin
32.           ForwardedValues:
33.             QueryString: 'false'
34.             Cookies:
35.               Forward: none
36.           TrustedSigners:
37.           - 1234567890EX
38.           - 1234567891EX
39.           ViewerProtocolPolicy: allow-all
40.         PriceClass: PriceClass_200
41.         Restrictions:
42.           GeoRestriction:
43.             RestrictionType: whitelist
44.             Locations:
45.             - AQ
46.             - CV
47.         ViewerCertificate:
48.           CloudFrontDefaultCertificate: 'true'
```

## Recurso de distribuição do Amazon CloudFront com origem personalizada
<a name="scenario-cloudfront-customorigin"></a>

O seguinte modelo de exemplo mostra uma [distribuição](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) do Amazon CloudFront usando um [CustomOrigin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-customoriginconfig.html).

### JSON
<a name="quickref-cloudfront-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myDistribution" : {
 5.             "Type" : "AWS::CloudFront::Distribution",
 6.             "Properties" : {
 7.                 "DistributionConfig" : {
 8.                     "Origins" : [ {
 9.                             "DomainName" : "www.example.com",
10.                             "Id" : "myCustomOrigin",
11.                             "CustomOriginConfig" : {
12.                                 "HTTPPort" : "80",
13.                                 "HTTPSPort" : "443",
14.                                 "OriginProtocolPolicy" : "http-only"
15.                             }
16.                     } ],
17.                     "Enabled" : "true",
18.                     "Comment" : "Somecomment",
19.                     "DefaultRootObject" : "index.html",
20.                     "Logging" : {
21.                         "IncludeCookies" : "true",
22.                         "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
23.                         "Prefix": "myprefix"
24.                     },
25.                     "Aliases" : [
26.                         "mysite.example.com",
27.                         "*.yoursite.example.com"
28.                     ],
29.                     "DefaultCacheBehavior" : {
30.                         "TargetOriginId" : "myCustomOrigin",
31.                         "SmoothStreaming" : "false",  
32.                         "ForwardedValues" : {
33.                             "QueryString" : "false",
34.                             "Cookies" : { "Forward" : "all" }
35.                         },
36.                         "TrustedSigners" : [
37.                             "1234567890EX",
38.                             "1234567891EX"
39.                         ],
40.                         "ViewerProtocolPolicy" : "allow-all"
41.                     },
42.                     "CustomErrorResponses" : [ {
43.                         "ErrorCode" : "404",
44.                         "ResponsePagePath" : "/error-pages/404.html",
45.                         "ResponseCode" : "200",
46.                         "ErrorCachingMinTTL" : "30"
47.                     } ],
48.                    "PriceClass" : "PriceClass_200",
49.                    "Restrictions" : {
50.                        "GeoRestriction" : {
51.                            "RestrictionType" : "whitelist",
52.                            "Locations" : [ "AQ", "CV" ]
53.                        }
54.                    },
55.                    "ViewerCertificate": { "CloudFrontDefaultCertificate" : "true" }
56.                 }
57.             }
58.         }
59.     }
60. }
```

### YAML
<a name="quickref-cloudfront-example-2.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myDistribution:
 4.     Type: AWS::CloudFront::Distribution
 5.     Properties:
 6.       DistributionConfig:
 7.         Origins:
 8.         - DomainName: www.example.com
 9.           Id: myCustomOrigin
10.           CustomOriginConfig:
11.             HTTPPort: '80'
12.             HTTPSPort: '443'
13.             OriginProtocolPolicy: http-only
14.         Enabled: 'true'
15.         Comment: Somecomment
16.         DefaultRootObject: index.html
17.         Logging:
18.           IncludeCookies: 'true'
19.           Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
20.           Prefix: myprefix
21.         Aliases:
22.         - mysite.example.com
23.         - "*.yoursite.example.com"
24.         DefaultCacheBehavior:
25.           TargetOriginId: myCustomOrigin
26.           SmoothStreaming: 'false'
27.           ForwardedValues:
28.             QueryString: 'false'
29.             Cookies:
30.               Forward: all
31.           TrustedSigners:
32.           - 1234567890EX
33.           - 1234567891EX
34.           ViewerProtocolPolicy: allow-all
35.         CustomErrorResponses:
36.         - ErrorCode: '404'
37.           ResponsePagePath: "/error-pages/404.html"
38.           ResponseCode: '200'
39.           ErrorCachingMinTTL: '30'
40.         PriceClass: PriceClass_200
41.         Restrictions:
42.           GeoRestriction:
43.             RestrictionType: whitelist
44.             Locations:
45.             - AQ
46.             - CV
47.         ViewerCertificate:
48.           CloudFrontDefaultCertificate: 'true'
```

## Distribuição do Amazon CloudFront com suporte a múltiplas origens.
<a name="scenario-cloudfront-multiorigin"></a>

O seguinte exemplo mostra como declarar uma [distribuição](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) do CloudFront com suporte para múltiplas origens. Em [DistributionConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-distributionconfig.html), uma lista de origens é fornecida e um [DefaultCacheBehavior](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-defaultcachebehavior.html) é definido.

### JSON
<a name="quickref-cloudfront-example-3.json"></a>

```
{
    "AWSTemplateFormatVersion" : "2010-09-09",
    "Resources" : {
        "myDistribution" : {
            "Type" : "AWS::CloudFront::Distribution",
            "Properties" : {
                "DistributionConfig" : {
                    "Origins" : [ {
                        "Id" : "myS3Origin",
                        "DomainName" : "amzn-s3-demo-bucket.s3.amazonaws.com",
                        "S3OriginConfig" : {
                            "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
                        }
                     }, 
                     {
                         "Id" : "myCustomOrigin",
                         "DomainName" : "www.example.com",
                         "CustomOriginConfig" : {
                             "HTTPPort" : "80",
                             "HTTPSPort" : "443",
                             "OriginProtocolPolicy" : "http-only"
                         }
                     }
                   ],
                   "Enabled" : "true",
                   "Comment" : "Some comment",
                   "DefaultRootObject" : "index.html", 
                   "Logging" : {
                       "IncludeCookies" : "true",
                       "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
                       "Prefix" : "myprefix"
                   },            
                   "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],
                   "DefaultCacheBehavior" : {
                       "TargetOriginId" : "myS3Origin",
                       "ForwardedValues" : {
                           "QueryString" : "false",
                           "Cookies" : { "Forward" : "all" }
                        },
                       "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                       "ViewerProtocolPolicy" : "allow-all",
                       "MinTTL" : "100",
                       "SmoothStreaming" : "true"
                   },
                   "CacheBehaviors" : [ {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myS3Origin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images1/*.jpg"
                        }, 
                        {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myCustomOrigin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images2/*.jpg"
                        }
                   ],
                   "CustomErrorResponses" : [ {
                       "ErrorCode" : "404",
                       "ResponsePagePath" : "/error-pages/404.html",
                       "ResponseCode" : "200",
                       "ErrorCachingMinTTL" : "30"
                   } ],
                   "PriceClass" : "PriceClass_All",
                   "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }
                }
            }
        }
    }
}
```

### YAML
<a name="quickref-cloudfront-example-3.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
        - Id: myS3Origin
          DomainName: amzn-s3-demo-bucket.s3.amazonaws.com
          S3OriginConfig:
            OriginAccessIdentity: origin-access-identity/cloudfront/E127EXAMPLE51Z
        - Id: myCustomOrigin
          DomainName: www.example.com
          CustomOriginConfig:
            HTTPPort: '80'
            HTTPSPort: '443'
            OriginProtocolPolicy: http-only
        Enabled: 'true'
        Comment: Some comment
        DefaultRootObject: index.html
        Logging:
          IncludeCookies: 'true'
          Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
          Prefix: myprefix
        Aliases:
        - mysite.example.com
        - yoursite.example.com
        DefaultCacheBehavior:
          TargetOriginId: myS3Origin
          ForwardedValues:
            QueryString: 'false'
            Cookies:
              Forward: all
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '100'
          SmoothStreaming: 'true'
        CacheBehaviors:
        - AllowedMethods:
          - DELETE
          - GET
          - HEAD
          - OPTIONS
          - PATCH
          - POST
          - PUT
          TargetOriginId: myS3Origin
          ForwardedValues:
            QueryString: 'true'
            Cookies:
              Forward: none
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '50'
          PathPattern: images1/*.jpg
        - AllowedMethods:
          - DELETE
          - GET
          - HEAD
          - OPTIONS
          - PATCH
          - POST
          - PUT
          TargetOriginId: myCustomOrigin
          ForwardedValues:
            QueryString: 'true'
            Cookies:
              Forward: none
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '50'
          PathPattern: images2/*.jpg
        CustomErrorResponses:
        - ErrorCode: '404'
          ResponsePagePath: "/error-pages/404.html"
          ResponseCode: '200'
          ErrorCachingMinTTL: '30'
        PriceClass: PriceClass_All
        ViewerCertificate:
          CloudFrontDefaultCertificate: 'true'
```

## Distribuição do Amazon CloudFront com uma função do Lambda como origem
<a name="scenario-cloudfront-lambda-origin"></a>

O exemplo a seguir cria uma distribuição do CloudFront que apresenta um URL específico da função do Lambda (fornecida como parâmetro), possibilitando o acesso somente por HTTPS, o armazenamento em cache, a compactação e a entrega global. Ele configura o URL do Lambda como uma origem HTTPS personalizada e aplica uma política de armazenamento em cache da AWS padrão. A distribuição é otimizada para performance com suporte a HTTP/2 e IPv6 e gera o nome de domínio do CloudFront, permitindo que os usuários acessem a função do Lambda por meio de um endpoint seguro baseado em CDN. Para obter mais informações, consulte [Using Amazon CloudFront with AWS Lambda as origin to accelerate your web applications](https://aws.amazon.com/blogs/networking-and-content-delivery/using-amazon-cloudfront-with-aws-lambda-as-origin-to-accelerate-your-web-applications/) no Blog da AWS.

### JSON
<a name="quickref-cloudfront-example-lambda-origin.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "LambdaEndpoint": {
            "Type": "String",
            "Description": "The Lambda function URL endpoint without the 'https://'"
        }
    },
    "Resources": {
        "MyDistribution": {
            "Type": "AWS::CloudFront::Distribution",
            "Properties": {
                "DistributionConfig": {
                    "PriceClass": "PriceClass_All",
                    "HttpVersion": "http2",
                    "IPV6Enabled": true,
                    "Origins": [
                        {
                            "DomainName": {
                                "Ref": "LambdaEndpoint"
                            },
                            "Id": "LambdaOrigin",
                            "CustomOriginConfig": {
                                "HTTPSPort": 443,
                                "OriginProtocolPolicy": "https-only"
                            }
                        }
                    ],
                    "Enabled": "true",
                    "DefaultCacheBehavior": {
                        "TargetOriginId": "LambdaOrigin",
                        "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
                        "ViewerProtocolPolicy": "redirect-to-https",
                        "SmoothStreaming": "false",
                        "Compress": "true"
                    }
                }
            }
        }
    },
    "Outputs": {
        "CloudFrontDomain": {
            "Description": "CloudFront default domain name configured",
            "Value": {
                "Fn::Sub": "https://${MyDistribution.DomainName}/"
            }
        }
    }
}
```

### YAML
<a name="quickref-cloudfront-example-lambda-origin.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  LambdaEndpoint:
    Type: String
    Description: The Lambda function URL endpoint without the 'https://'
Resources:
  MyDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        PriceClass: PriceClass_All
        HttpVersion: http2
        IPV6Enabled: true
        Origins:
        - DomainName: !Ref LambdaEndpoint
          Id: LambdaOrigin
          CustomOriginConfig:
            HTTPSPort: 443
            OriginProtocolPolicy: https-only
        Enabled: 'true'
        DefaultCacheBehavior:
          TargetOriginId: LambdaOrigin
          CachePolicyId: '658327ea-f89d-4fab-a63d-7e88639e58f6'
          ViewerProtocolPolicy: redirect-to-https
          SmoothStreaming: 'false'
          Compress: 'true'
Outputs:
  CloudFrontDomain:
    Description: CloudFront default domain name configured
    Value: !Sub https://${MyDistribution.DomainName}/
```

## Consulte também
<a name="w2aac11c41c27c15"></a>

Para obter um exemplo de adição de um alias personalizado a um registro do Route 53 para criar um nome amigável para uma distribuição do CloudFront, consulte [Conjunto de registros de recursos de alias para uma distribuição do CloudFront](quickref-route53.md#scenario-user-friendly-url-for-cloudfront-distribution).

# Trechos de modelo do Amazon CloudWatch
<a name="quickref-cloudwatch"></a>

Use trechos do modelo de exemplo para ajudar a descrever os recursos do Amazon CloudWatch nos modelos do CloudFormation. Para obter mais informações, consulte [Referência de tipos de recursos do Amazon CloudWatch](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudWatch.html).

**Topics**
+ [Alarme de faturamento](#cloudwatch-sample-billing-alarm)
+ [Alarme de utilização da CPU](#cloudwatch-sample-cpu-utilization-alarm)
+ [Recuperar uma instância Amazon Elastic Compute Cloud](#cloudwatch-sample-recover-instance)
+ [Criar um painel básico](#cloudwatch-sample-dashboard-basic)
+ [Criar um painel com widgets exibidos lado a lado](#cloudwatch-sample-dashboard-sidebyside)

## Alarme de faturamento
<a name="cloudwatch-sample-billing-alarm"></a>

No exemplo a seguir, o Amazon CloudWatch envia uma notificação por e-mail quando as despesas de sua conta da AWS excedem o limite de alarme. Para receber notificações de uso, basta permitir os alertas de pagamento. Consulte mais informações em [Criar um alarme de faturamento para monitorar suas cobranças estimadas da AWS](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) no *Guia do usuário do Amazon CloudWatch*.

### JSON
<a name="quickref-cloudwatch-example-1.json"></a>

```
"SpendingAlarm": {
  "Type": "AWS::CloudWatch::Alarm",
  "Properties": {
    "AlarmDescription": { "Fn::Join": ["", [
      "Alarm if AWS spending is over $",
      { "Ref": "AlarmThreshold" }
    ]]},
    "Namespace": "AWS/Billing",
    "MetricName": "EstimatedCharges",
    "Dimensions": [{
      "Name": "Currency",
      "Value" : "USD"
    }],
    "Statistic": "Maximum",
    "Period": "21600",
    "EvaluationPeriods": "1",
    "Threshold": { "Ref": "AlarmThreshold" },
    "ComparisonOperator": "GreaterThanThreshold",
    "AlarmActions": [{
      "Ref": "BillingAlarmNotification"
    }],
    "InsufficientDataActions": [{
      "Ref": "BillingAlarmNotification"
    }]
  }
}
```

### YAML
<a name="quickref-cloudwatch-example-1.yaml"></a>

```
SpendingAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmDescription: 
      'Fn::Join':
        - ''
        - - Alarm if AWS spending is over $
          - !Ref: AlarmThreshold
    Namespace: AWS/Billing
    MetricName: EstimatedCharges
    Dimensions:
    - Name: Currency
      Value: USD
    Statistic: Maximum
    Period: '21600'
    EvaluationPeriods: '1'
    Threshold:
      !Ref: "AlarmThreshold"
    ComparisonOperator: GreaterThanThreshold
    AlarmActions:
    - !Ref: "BillingAlarmNotification"
    InsufficientDataActions:
    - !Ref: "BillingAlarmNotification"
```

## Alarme de utilização da CPU
<a name="cloudwatch-sample-cpu-utilization-alarm"></a>

O trecho de exemplo a seguir cria um alarme que envia uma notificação quando a utilização média da CPU de uma instância Amazon EC2 é excedida em 90% por mais de 60 segundos em três períodos de avaliação.

### JSON
<a name="quickref-cloudwatch-example-2.json"></a>

```
 1. "CPUAlarm" : {
 2.   "Type" : "AWS::CloudWatch::Alarm",
 3.   "Properties" : {
 4.     "AlarmDescription" : "CPU alarm for my instance",
 5.     "AlarmActions" : [ { "Ref" : "logical name of an AWS::SNS::Topic resource" } ],
 6.     "MetricName" : "CPUUtilization",
 7.     "Namespace" : "AWS/EC2",
 8.     "Statistic" : "Average",
 9.     "Period" : "60",
10.     "EvaluationPeriods" : "3",
11.     "Threshold" : "90",
12.     "ComparisonOperator" : "GreaterThanThreshold",
13.     "Dimensions" : [ {
14.       "Name" : "InstanceId",
15.       "Value" : { "Ref" : "logical name of an AWS::EC2::Instance resource" }
16.     } ]
17.   }
18. }
```

### YAML
<a name="quickref-cloudwatch-example-2.yaml"></a>

```
 1. CPUAlarm:
 2.   Type: AWS::CloudWatch::Alarm
 3.   Properties:
 4.     AlarmDescription: CPU alarm for my instance
 5.     AlarmActions:
 6.     - !Ref: "logical name of an AWS::SNS::Topic resource"
 7.     MetricName: CPUUtilization
 8.     Namespace: AWS/EC2
 9.     Statistic: Average
10.     Period: '60'
11.     EvaluationPeriods: '3'
12.     Threshold: '90'
13.     ComparisonOperator: GreaterThanThreshold
14.     Dimensions:
15.     - Name: InstanceId
16.       Value: !Ref: "logical name of an AWS::EC2::Instance resource"
```

## Recuperar uma instância Amazon Elastic Compute Cloud
<a name="cloudwatch-sample-recover-instance"></a>

O alarme do CloudWatch a seguir recupera uma instância do EC2 quando ocorrem falhas de verificação de status por 15 minutos consecutivos. Consulte mais informações sobre ações de alarme em [Criar alarmes para interromper, terminar, reinicializar ou recuperar uma instância do EC2](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html) no *Guia do usuário do Amazon CloudWatch*.

### JSON
<a name="quickref-cloudwatch-example-3.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" : {
    "RecoveryInstance" : {
      "Description" : "The EC2 instance ID to associate this alarm with.",
      "Type" : "AWS::EC2::Instance::Id"
    }
  },
  "Resources": {
    "RecoveryTestAlarm": {
      "Type": "AWS::CloudWatch::Alarm",
      "Properties": {
        "AlarmDescription": "Trigger a recovery when instance status check fails for 15 consecutive minutes.",
        "Namespace": "AWS/EC2" ,
        "MetricName": "StatusCheckFailed_System",
        "Statistic": "Minimum",
        "Period": "60",
        "EvaluationPeriods": "15",
        "ComparisonOperator": "GreaterThanThreshold",
        "Threshold": "0",
        "AlarmActions": [ {"Fn::Join" : ["", ["arn:aws:automate:", { "Ref" : "AWS::Region" }, ":ec2:recover" ]]} ],
        "Dimensions": [{"Name": "InstanceId","Value": {"Ref": "RecoveryInstance"}}]
      }
    }
  }
}
```

### YAML
<a name="quickref-cloudwatch-example-3.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  RecoveryInstance:
    Description: The EC2 instance ID to associate this alarm with.
    Type: AWS::EC2::Instance::Id
Resources:
  RecoveryTestAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: Trigger a recovery when instance status check fails for 15
        consecutive minutes.
      Namespace: AWS/EC2
      MetricName: StatusCheckFailed_System
      Statistic: Minimum
      Period: '60'
      EvaluationPeriods: '15'
      ComparisonOperator: GreaterThanThreshold
      Threshold: '0'
      AlarmActions: [ !Sub "arn:aws:automate:${AWS::Region}:ec2:recover" ]
      Dimensions:
      - Name: InstanceId
        Value: !Ref: RecoveryInstance
```

## Criar um painel básico
<a name="cloudwatch-sample-dashboard-basic"></a>

O exemplo a seguir cria um painel simples do CloudWatch com um widget de métrica que exibe a utilização da CPU e um widget de texto que exibe uma mensagem.

### JSON
<a name="quickref-cloudwatch-sample-dashboard-basic.json"></a>

```
{
    "BasicDashboard": {
        "Type": "AWS::CloudWatch::Dashboard",
        "Properties": {
            "DashboardName": "Dashboard1",
            "DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-012345\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"us-east-1\",\"title\":\"EC2 Instance CPU\"}},{\"type\":\"text\",\"x\":0,\"y\":7,\"width\":3,\"height\":3,\"properties\":{\"markdown\":\"Hello world\"}}]}"
        }
    }
}
```

### YAML
<a name="quickref-cloudwatch-sample-dashboard-basic.yaml"></a>

```
BasicDashboard:
  Type: AWS::CloudWatch::Dashboard
  Properties:
    DashboardName: Dashboard1
    DashboardBody: '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-012345"]],"period":300,"stat":"Average","region":"us-east-1","title":"EC2 Instance CPU"}},{"type":"text","x":0,"y":7,"width":3,"height":3,"properties":{"markdown":"Hello world"}}]}'
```

## Criar um painel com widgets exibidos lado a lado
<a name="cloudwatch-sample-dashboard-sidebyside"></a>

O exemplo a seguir cria um painel com dois widgets de métrica exibidos lado a lado.

### JSON
<a name="quickref-cloudwatch-sample-dashboard-sidebyside.json"></a>

```
{
    "DashboardSideBySide": {
        "Type": "AWS::CloudWatch::Dashboard",
        "Properties": {
            "DashboardName": "Dashboard1",
            "DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-012345\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"us-east-1\",\"title\":\"EC2 Instance CPU\"}},{\"type\":\"metric\",\"x\":12,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/S3\",\"BucketSizeBytes\",\"BucketName\",\"amzn-s3-demo-bucket\"]],\"period\":86400,\"stat\":\"Maximum\",\"region\":\"us-east-1\",\"title\":\"amzn-s3-demo-bucket bytes\"}}]}"
        }
    }
}
```

### YAML
<a name="quickref-cloudwatch-sample-dashboard-sidebysidequickref-cloudwatch-sample-dashboard-sidebyside.yaml"></a>

```
DashboardSideBySide:
  Type: AWS::CloudWatch::Dashboard
  Properties:
    DashboardName: Dashboard1
    DashboardBody: '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-012345"]],"period":300,"stat":"Average","region":"us-east-1","title":"EC2 Instance CPU"}},{"type":"metric","x":12,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/S3","BucketSizeBytes","BucketName","amzn-s3-demo-bucket"]],"period":86400,"stat":"Maximum","region":"us-east-1","title":"amzn-s3-demo-bucket bytes"}}]}'
```

# Trechos de modelo do Amazon CloudWatch Logs
<a name="quickref-cloudwatchlogs"></a>

O Amazon CloudWatch Logs pode monitorar seu sistema, aplicativos e arquivos de log personalizados em instâncias do Amazon EC2 ou outras origens. Você pode usar o CloudFormation para provisionar e gerenciar grupos de logs e filtros de métricas. Para obter mais informações sobre o CloudWatch Logs, consulte o [Guia do usuário do Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html).

**Topics**
+ [Enviar logs para o CloudWatch Logs de uma instância do Linux](#quickref-cloudwatchlogs-example1)
+ [Enviar logs para o CloudWatch Logs de uma instância do Windows](#quickref-cloudwatchlogs-example2)
+ [Consulte também](#w2aac11c41c35c11)

## Enviar logs para o CloudWatch Logs de uma instância do Linux
<a name="quickref-cloudwatchlogs-example1"></a>

O modelo a seguir demonstra como configurar um servidor Web no Amazon Linux 2023 com a integração com o CloudWatch Logs. O modelo executa as seguintes tarefas:
+ Instala o Apache e o PHP.
+ Configura o agente do CloudWatch para encaminhar logs de acesso do Apache para o CloudWatch Logs.
+ Configura um perfil do IAM para permitir que o agente do CloudWatch envie dados de log ao CloudWatch Logs.
+ Cria alarmes e notificações personalizados para monitorar erros 404 ou alto uso de largura de banda.

Os eventos de logs do servidor Web fornecem dados de métricas para os alarmes do CloudWatch. Os dois filtros de métrica descrevem como as informações de log são transformadas em métricas do CloudWatch. A métrica 404 conta o número de ocorrências 404. A métrica de tamanho controla o tamanho de uma solicitação. Os dois alarmes do CloudWatch enviarão notificações se houver mais que duas 404s em 2 minutos ou se o tamanho médio da solicitação for superior a 3500 KB por 10 minutos.

### JSON
<a name="quickref-cloudwatchlogs-example.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Sample template that sets up and configures CloudWatch Logs on Amazon Linux 2023 instance.",
    "Parameters": {
        "KeyName": {
            "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "SSHLocation": {
            "Description": "The IP address range that can be used to SSH to the EC2 instances",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        },
        "OperatorEmail": {
            "Description": "Email address to notify when CloudWatch alarms are triggered (404 errors or high bandwidth usage)",
            "Type": "String"
        }
    },
    "Resources": {
        "LogRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "LogRolePolicy",
                        "PolicyDocument": {
                            "Version": "2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:PutLogEvents",
                                        "logs:DescribeLogStreams",
                                        "logs:DescribeLogGroups",
                                        "logs:CreateLogGroup",
                                        "logs:CreateLogStream"
                                    ],
                                    "Resource": "*"
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "LogRoleInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Path": "/",
                "Roles": [{"Ref": "LogRole"}]
            }
        },
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 and SSH access via port 22",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": {"Ref": "SSHLocation"}
                    }
                ]
            }
        },
        "WebServerHost": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "Comment": "Install a simple PHP application on Amazon Linux 2023",
                "AWS::CloudFormation::Init": {
                    "config": {
                        "packages": {
                            "dnf": {
                                "httpd": [],
                                "php": [],
                                "php-fpm": []
                            }
                        },
                        "files": {
                            "/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json": {
                                "content": {
                                    "logs": {
                                        "logs_collected": {
                                            "files": {
                                                "collect_list": [{
                                                    "file_path": "/var/log/httpd/access_log",
                                                    "log_group_name": {"Ref": "WebServerLogGroup"},
                                                    "log_stream_name": "{instance_id}/apache.log",
                                                    "timestamp_format": "%d/%b/%Y:%H:%M:%S %z"
                                                }]
                                            }
                                        }
                                    }
                                },
                                "mode": "000644",
                                "owner": "root",
                                "group": "root"
                            },
                            "/var/www/html/index.php": {
                                "content": "<?php\necho '<h1>AWS CloudFormation sample PHP application on Amazon Linux 2023</h1>';\n?>\n",
                                "mode": "000644",
                                "owner": "apache",
                                "group": "apache"
                            },
                            "/etc/cfn/cfn-hup.conf": {
                                "content":  {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[main]\n",
                                            "stack=",
                                            {"Ref": "AWS::StackId"},
                                            "\n",
                                            "region=",
                                            {"Ref": "AWS::Region"},
                                            "\n"
                                        ]
                                    ]
                                },
                                "mode": "000400",
                                "owner": "root",
                                "group": "root"
                            },
                            "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[cfn-auto-reloader-hook]\n",
                                            "triggers=post.update\n",
                                            "path=Resources.WebServerHost.Metadata.AWS::CloudFormation::Init\n",
                                            "action=/opt/aws/bin/cfn-init -s ",
                                            {"Ref": "AWS::StackId"},
                                            " -r WebServerHost ",
                                            " --region     ",
                                            {"Ref": "AWS::Region"},
                                            "\n",
                                            "runas=root\n"
                                        ]
                                    ]
                                }
                            }
                        },
                        "services": {
                            "systemd": {
                                "httpd": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                },
                                "php-fpm": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                }
                            }
                        }
                    }
                }
            },
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT5M"
                }
            },
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
                "KeyName": {"Ref": "KeyName"},
                "InstanceType": "t3.micro",
                "SecurityGroupIds": [{"Ref": "WebServerSecurityGroup"}],
                "IamInstanceProfile": {"Ref": "LogRoleInstanceProfile"},
                "UserData": {"Fn::Base64": {"Fn::Join": [ "", [
                    "#!/bin/bash\n",
                    "dnf update -y aws-cfn-bootstrap\n",
                    "dnf install -y amazon-cloudwatch-agent\n",
                    "/opt/aws/bin/cfn-init -v --stack ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, "\n",
                    "\n",
                    "# Verify Apache log directory exists and create if needed\n",
                    "mkdir -p /var/log/httpd\n",
                    "\n",
                    "# Start CloudWatch agent\n",
                    "/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json -s\n",
                    "\n",
                    "# Signal success\n",
                    "/opt/aws/bin/cfn-signal -e $? --stack ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, "\n"
                ]]}}
            }
        },
        "WebServerLogGroup": {
            "Type": "AWS::Logs::LogGroup",
            "DeletionPolicy": "Retain",
            "UpdateReplacePolicy": "Retain",
            "Properties": {
                "RetentionInDays": 7
            }
        },
        "404MetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "WebServerLogGroup"},
                "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code = 404, size, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "1",
                        "MetricNamespace": "test/404s",
                        "MetricName": "test404Count"
                    }
                ]
            }
        },
        "BytesTransferredMetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "WebServerLogGroup"},
                "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code, size, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "$size",
                        "MetricNamespace": "test/BytesTransferred",
                        "MetricName": "testBytesTransferred"
                    }
                ]
            }
        },
        "404Alarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The number of 404s is greater than 2 over 2 minutes",
                "MetricName": "test404Count",
                "Namespace": "test/404s",
                "Statistic": "Sum",
                "Period": "60",
                "EvaluationPeriods": "2",
                "Threshold": "2",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "BandwidthAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The average volume of traffic is greater 3500 KB over 10 minutes",
                "MetricName": "testBytesTransferred",
                "Namespace": "test/BytesTransferred",
                "Statistic": "Average",
                "Period": "300",
                "EvaluationPeriods": "2",
                "Threshold": "3500",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "AlarmNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "Subscription": [{"Endpoint": {"Ref": "OperatorEmail"}, "Protocol": "email"}]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Description": "The instance ID of the web server",
            "Value": {"Ref": "WebServerHost"}
        },
        "WebsiteURL": {
            "Value": {"Fn::Sub": "http://${WebServerHost.PublicDnsName}"},
            "Description": "URL for the web server"
        },
        "PublicIP": {
            "Description": "Public IP address of the web server",
            "Value": {"Fn::GetAtt": ["WebServerHost","PublicIp"]
            }
        },
        "CloudWatchLogGroupName": {
            "Description": "The name of the CloudWatch log group",
            "Value": {"Ref": "WebServerLogGroup"}
        }
    }
}
```

### YAML
<a name="quickref-cloudwatchlogs-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: Sample template that sets up and configures CloudWatch Logs on Amazon Linux 2023 instance.
Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  OperatorEmail:
    Description: Email address to notify when CloudWatch alarms are triggered (404 errors or high bandwidth usage)
    Type: String
Resources:
  LogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: LogRolePolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:PutLogEvents'
                  - 'logs:DescribeLogStreams'
                  - 'logs:DescribeLogGroups'
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                Resource: '*'
  LogRoleInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref LogRole
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
  WebServerHost:
    Type: AWS::EC2::Instance
    Metadata:
      Comment: Install a simple PHP application on Amazon Linux 2023
      'AWS::CloudFormation::Init':
        config:
          packages:
            dnf:
              httpd: []
              php: []
              php-fpm: []
          files:
            /etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json:
              content: !Sub |
                {
                  "logs": {
                    "logs_collected": {
                      "files": {
                        "collect_list": [
                          {
                            "file_path": "/var/log/httpd/access_log",
                            "log_group_name": "${WebServerLogGroup}",
                            "log_stream_name": "{instance_id}/apache.log",
                            "timestamp_format": "%d/%b/%Y:%H:%M:%S %z"
                          }
                        ]
                      }
                    }
                  }
                }
              mode: '000644'
              owner: root
              group: root
            /var/www/html/index.php:
              content: |
                <?php echo '<h1>AWS CloudFormation sample PHP application on Amazon Linux 2023</h1>';
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerHost.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerHost --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              php-fpm:
                enabled: 'true'
                ensureRunning: 'true'
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      KeyName: !Ref KeyName
      InstanceType: t3.micro
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      IamInstanceProfile: !Ref LogRoleInstanceProfile
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash
          dnf update -y aws-cfn-bootstrap
          dnf install -y amazon-cloudwatch-agent
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerHost --region ${AWS::Region}
          
          # Verify Apache log directory exists and create if needed
          mkdir -p /var/log/httpd
          
          # Start CloudWatch agent
          /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json -s
          
          # Signal success
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerHost --region ${AWS::Region}
          echo "Done"
  WebServerLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      RetentionInDays: 7
  404MetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref WebServerLogGroup
      FilterPattern: >-
        [ip, identity, user_id, timestamp, request, status_code = 404, size, ...]
      MetricTransformations:
        - MetricValue: '1'
          MetricNamespace: test/404s
          MetricName: test404Count
  BytesTransferredMetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref WebServerLogGroup
      FilterPattern: '[ip, identity, user_id, timestamp, request, status_code, size, ...]'
      MetricTransformations:
        - MetricValue: $size
          MetricNamespace: test/BytesTransferred
          MetricName: testBytesTransferred
  404Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The number of 404s is greater than 2 over 2 minutes
      MetricName: test404Count
      Namespace: test/404s
      Statistic: Sum
      Period: '60'
      EvaluationPeriods: '2'
      Threshold: '2'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  BandwidthAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The average volume of traffic is greater 3500 KB over 10 minutes
      MetricName: testBytesTransferred
      Namespace: test/BytesTransferred
      Statistic: Average
      Period: '300'
      EvaluationPeriods: '2'
      Threshold: '3500'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
Outputs:
  InstanceId:
    Description: The instance ID of the web server
    Value: !Ref WebServerHost
  WebsiteURL:
    Value: !Sub 'http://${WebServerHost.PublicDnsName}'
    Description: URL for the web server
  PublicIP:
    Description: Public IP address of the web server
    Value: !GetAtt WebServerHost.PublicIp
  CloudWatchLogGroupName:
    Description: The name of the CloudWatch log group
    Value: !Ref WebServerLogGroup
```

## Enviar logs para o CloudWatch Logs de uma instância do Windows
<a name="quickref-cloudwatchlogs-example2"></a>

O modelo a seguir configura o CloudWatch Logs para uma instância do Windows 2012R2.

O agente do CloudWatch Logs no Windows (agente SSM em AMIs do Windows 2012R2 e Windows 2016) só envia os logs depois que ele é iniciado, de maneira que os logs gerados antes da inicialização não são enviados. Para resolver isso, o modelo ajuda a garantir que o agente inicie antes que qualquer log seja gravado ao:
+ Configurar o agente como o primeiro item `config` no `configSets` do cfn-init.
+ Usar o `waitAfterCompletion` para inserir uma pausa depois do comando que inicia o agente.

### JSON
<a name="quickref-cloudwatchlogs-example2.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Sample template that sets up and configures CloudWatch Logs on Windows 2012R2 instance.",
    "Parameters": {
        "KeyPair": {
            "Description": "Name of an existing EC2 KeyPair to enable RDP access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "RDPLocation": {
            "Description": "The IP address range that can be used to RDP to the EC2 instances",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        },
        "OperatorEmail": {
            "Description": "Email address to notify when CloudWatch alarms are triggered (404 errors)",
            "Type": "String"
        }
    },
    "Resources": {
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 and RDP access via port 3389",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "80",
                        "ToPort": "80",
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {"Ref": "RDPLocation"}
                    }
                ]
            }
        },
        "LogRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
                ],
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "LogRolePolicy",
                        "PolicyDocument": {
                            "Version": "2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:Create*",
                                        "logs:PutLogEvents",
                                        "s3:GetObject"
                                    ],
                                    "Resource": [
                                        "arn:aws:logs:*:*:*",
                                        "arn:aws:s3:::*"
                                    ]
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "LogRoleInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Path": "/",
                "Roles": [{"Ref": "LogRole"}]
            }
        },
        "WebServerHost": {
            "Type": "AWS::EC2::Instance",
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT15M"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "config": [
                            "00-ConfigureCWLogs",
                            "01-InstallWebServer",
                            "02-ConfigureApplication",
                            "03-Finalize"
                        ]
                    },
                    "00-ConfigureCWLogs": {
                        "files": {
                            "C:\\Program Files\\Amazon\\SSM\\Plugins\\awsCloudWatch\\AWS.EC2.Windows.CloudWatch.json": {
                                "content": {
                                    "EngineConfiguration": {
                                        "Components": [
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "ApplicationEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "Application"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "SystemEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "System"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "SecurityEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "Security"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "EC2ConfigLog",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "ASCII",
                                                    "Filter": "EC2ConfigLog.txt",
                                                    "LogDirectoryPath": "C:\\Program Files\\Amazon\\Ec2ConfigService\\Logs",
                                                    "TimeZoneKind": "UTC",
                                                    "TimestampFormat": "yyyy-MM-ddTHH:mm:ss.fffZ:"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CfnInitLog",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "ASCII",
                                                    "Filter": "cfn-init.log",
                                                    "LogDirectoryPath": "C:\\cfn\\log",
                                                    "TimeZoneKind": "Local",
                                                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss,fff"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "IISLogs",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "UTF-8",
                                                    "Filter": "",
                                                    "LineCount": "3",
                                                    "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
                                                    "TimeZoneKind": "UTC",
                                                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "MemoryPerformanceCounter",
                                                "Parameters": {
                                                    "CategoryName": "Memory",
                                                    "CounterName": "Available MBytes",
                                                    "DimensionName": "",
                                                    "DimensionValue": "",
                                                    "InstanceName": "",
                                                    "MetricName": "Memory",
                                                    "Unit": "Megabytes"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchApplicationEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/ApplicationEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchSystemEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/SystemEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchSecurityEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/SecurityEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchEC2ConfigLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/EC2ConfigLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchCfnInitLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/CfnInitLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchIISLogs",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/IISLogs",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatch",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "NameSpace": "Windows/Default",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            }
                                        ],
                                        "Flows": {
                                            "Flows": [
                                                "ApplicationEventLog,CloudWatchApplicationEventLog",
                                                "SystemEventLog,CloudWatchSystemEventLog",
                                                "SecurityEventLog,CloudWatchSecurityEventLog",
                                                "EC2ConfigLog,CloudWatchEC2ConfigLog",
                                                "CfnInitLog,CloudWatchCfnInitLog",
                                                "IISLogs,CloudWatchIISLogs",
                                                "MemoryPerformanceCounter,CloudWatch"
                                            ]
                                        },
                                        "PollInterval": "00:00:05"
                                    },
                                    "IsEnabled": true
                                }
                            }
                        },
                        "commands": {
                            "0-enableSSM": {
                                "command": "powershell.exe -Command \"Set-Service -Name AmazonSSMAgent -StartupType Automatic\" ",
                                "waitAfterCompletion": "0"
                            },
                            "1-restartSSM": {
                                "command": "powershell.exe -Command \"Restart-Service AmazonSSMAgent \"",
                                "waitAfterCompletion": "30"
                            }
                        }
                    },
                    "01-InstallWebServer": {
                        "commands": {
                            "01_install_webserver": {
                                "command": "powershell.exe -Command \"Install-WindowsFeature Web-Server  -IncludeAllSubFeature\"",
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "02-ConfigureApplication": {
                        "files": {
                            "c:\\Inetpub\\wwwroot\\index.htm": {
                                "content": "<html> <head> <title>Test Application Page</title> </head> <body> <h1>Congratulations!! Your IIS server is configured.</h1> </body> </html>"
                            }
                        }
                    },
                    "03-Finalize": {
                        "commands": {
                            "00_signal_success": {
                                "command": {
                                    "Fn::Sub": "cfn-signal.exe -e 0 --resource WebServerHost --stack ${AWS::StackName} --region ${AWS::Region}"
                                },
                                "waitAfterCompletion": "0"
                            }
                        }
                    }
                }
            },
            "Properties": {
                "KeyName": {
                    "Ref": "KeyPair"
                },
                "ImageId": "{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-English-64Bit-Base}}",
                "InstanceType": "t2.xlarge",
                "SecurityGroupIds": [{"Ref": "WebServerSecurityGroup"}],
                "IamInstanceProfile": {"Ref": "LogRoleInstanceProfile"},
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "<script>\n",
                                "wmic product where \"description='Amazon SSM Agent' \" uninstall\n",
                                "wmic product where \"description='aws-cfn-bootstrap' \" uninstall \n",
                                "start /wait c:\\Windows\\system32\\msiexec /passive /qn /i https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-win64-latest.msi\n",
                                "powershell.exe -Command \"iwr https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe  -UseBasicParsing -OutFile C:\\AmazonSSMAgentSetup.exe\"\n",
                                "start /wait C:\\AmazonSSMAgentSetup.exe /install /quiet\n",
                                "cfn-init.exe -v -c config -s ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, " \n",
                                "</script>\n"
                            ]
                        ]
                    }
                }
            }
        },
        "LogGroup": {
            "Type": "AWS::Logs::LogGroup",
            "Properties": {
                "RetentionInDays": 7
            }
        },
        "404MetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "LogGroup"},
                "FilterPattern": "[timestamps, serverip, method, uri, query, port, dash, clientip, useragent, status_code = 404, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "1",
                        "MetricNamespace": "test/404s",
                        "MetricName": "test404Count"
                    }
                ]
            }
        },
        "404Alarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The number of 404s is greater than 2 over 2 minutes",
                "MetricName": "test404Count",
                "Namespace": "test/404s",
                "Statistic": "Sum",
                "Period": "60",
                "EvaluationPeriods": "2",
                "Threshold": "2",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "AlarmNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "Subscription": [{"Endpoint": {"Ref": "OperatorEmail"}, "Protocol": "email"}]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Description": "The instance ID of the web server",
            "Value": {"Ref": "WebServerHost"}
        },
        "WebsiteURL": {
            "Value": {"Fn::Sub": "http://${WebServerHost.PublicDnsName}"},
            "Description": "URL for the web server"
        },
        "PublicIP": {
            "Description": "Public IP address of the web server",
            "Value": {"Fn::GetAtt": ["WebServerHost","PublicIp"]}
        },
        "CloudWatchLogGroupName": {
            "Description": "The name of the CloudWatch log group",
            "Value": {"Ref": "LogGroup"}
        }
    }
}
```

### YAML
<a name="quickref-cloudwatchlogs-example2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: >-
  Sample template that sets up and configures CloudWatch Logs on Windows 2012R2 instance.
Parameters:
  KeyPair:
    Description: Name of an existing EC2 KeyPair to enable RDP access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  RDPLocation:
    Description: The IP address range that can be used to RDP to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  OperatorEmail:
    Description: Email address to notify when CloudWatch alarms are triggered (404 errors)
    Type: String
Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and RDP access via port 3389
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: '3389'
          ToPort: '3389'
          CidrIp: !Ref RDPLocation
  LogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore'
      Path: /
      Policies:
        - PolicyName: LogRolePolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:Create*'
                  - 'logs:PutLogEvents'
                  - 's3:GetObject'
                Resource:
                  - 'arn:aws:logs:*:*:*'
                  - 'arn:aws:s3:::*'
  LogRoleInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref LogRole
  WebServerHost:
    Type: AWS::EC2::Instance
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
    Metadata:
      'AWS::CloudFormation::Init':
        configSets:
          config:
            - 00-ConfigureCWLogs
            - 01-InstallWebServer
            - 02-ConfigureApplication
            - 03-Finalize
        00-ConfigureCWLogs:
          files:
            'C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\AWS.EC2.Windows.CloudWatch.json':
              content: !Sub |
                {
                  "EngineConfiguration": {
                      "Components": [
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "ApplicationEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "Application"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "SystemEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "System"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "SecurityEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "Security"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "EC2ConfigLog",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "ASCII",
                                  "Filter": "EC2ConfigLog.txt",
                                  "LogDirectoryPath": "C:\\Program Files\\Amazon\\Ec2ConfigService\\Logs",
                                  "TimeZoneKind": "UTC",
                                  "TimestampFormat": "yyyy-MM-ddTHH:mm:ss.fffZ:"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "CfnInitLog",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "ASCII",
                                  "Filter": "cfn-init.log",
                                  "LogDirectoryPath": "C:\\cfn\\log",
                                  "TimeZoneKind": "Local",
                                  "TimestampFormat": "yyyy-MM-dd HH:mm:ss,fff"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "IISLogs",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "UTF-8",
                                  "Filter": "",
                                  "LineCount": "3",
                                  "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
                                  "TimeZoneKind": "UTC",
                                  "TimestampFormat": "yyyy-MM-dd HH:mm:ss"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "MemoryPerformanceCounter",
                              "Parameters": {
                                  "CategoryName": "Memory",
                                  "CounterName": "Available MBytes",
                                  "DimensionName": "",
                                  "DimensionValue": "",
                                  "InstanceName": "",
                                  "MetricName": "Memory",
                                  "Unit": "Megabytes"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchApplicationEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/ApplicationEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchSystemEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/SystemEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchSecurityEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/SecurityEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchEC2ConfigLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/EC2ConfigLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchCfnInitLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/CfnInitLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchIISLogs",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/IISLogs",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatch",
                              "Parameters": {
                                  "AccessKey": "",
                                  "NameSpace": "Windows/Default",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          }
                      ],
                      "Flows": {
                          "Flows": [
                              "ApplicationEventLog,CloudWatchApplicationEventLog",
                              "SystemEventLog,CloudWatchSystemEventLog",
                              "SecurityEventLog,CloudWatchSecurityEventLog",
                              "EC2ConfigLog,CloudWatchEC2ConfigLog",
                              "CfnInitLog,CloudWatchCfnInitLog",
                              "IISLogs,CloudWatchIISLogs",
                              "MemoryPerformanceCounter,CloudWatch"
                          ]
                      },
                      "PollInterval": "00:00:05"
                  },
                  "IsEnabled": true
                }
          commands:
            0-enableSSM:
              command: >-
                powershell.exe -Command "Set-Service -Name AmazonSSMAgent
                -StartupType Automatic" 
              waitAfterCompletion: '0'
            1-restartSSM:
              command: powershell.exe -Command "Restart-Service AmazonSSMAgent "
              waitAfterCompletion: '30'
        01-InstallWebServer:
          commands:
            01_install_webserver:
              command: >-
                powershell.exe -Command "Install-WindowsFeature Web-Server 
                -IncludeAllSubFeature"
              waitAfterCompletion: '0'
        02-ConfigureApplication:
          files:
            'c:\Inetpub\wwwroot\index.htm':
              content: >-
                <html> <head> <title>Test Application Page</title> </head>
                <body> <h1>Congratulations !! Your IIS server is
                configured.</h1> </body> </html>
        03-Finalize:
          commands:
            00_signal_success:
              command: !Sub >-
                cfn-signal.exe -e 0 --resource WebServerHost --stack
                ${AWS::StackName} --region ${AWS::Region}
              waitAfterCompletion: '0'
    Properties:
      KeyName: !Ref KeyPair
      ImageId: "{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-English-64Bit-Base}}"
      InstanceType: t2.xlarge
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      IamInstanceProfile: !Ref LogRoleInstanceProfile
      UserData: !Base64 
        'Fn::Sub': >
          <script>

          wmic product where "description='Amazon SSM Agent' " uninstall

          wmic product where "description='aws-cfn-bootstrap' " uninstall 

          start /wait c:\\Windows\\system32\\msiexec /passive /qn /i
          https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-win64-latest.msi

          powershell.exe -Command "iwr
          https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe 
          -UseBasicParsing -OutFile C:\\AmazonSSMAgentSetup.exe"

          start /wait C:\\AmazonSSMAgentSetup.exe /install /quiet

          cfn-init.exe -v -c config -s ${AWS::StackName} --resource
          WebServerHost --region ${AWS::Region} 

          </script>
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      RetentionInDays: 7
  404MetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref LogGroup
      FilterPattern: >-
        [timestamps, serverip, method, uri, query, port, dash, clientip,
        useragent, status_code = 404, ...]
      MetricTransformations:
        - MetricValue: '1'
          MetricNamespace: test/404s
          MetricName: test404Count
  404Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The number of 404s is greater than 2 over 2 minutes
      MetricName: test404Count
      Namespace: test/404s
      Statistic: Sum
      Period: '60'
      EvaluationPeriods: '2'
      Threshold: '2'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
Outputs:
  InstanceId:
    Description: The instance ID of the web server
    Value: !Ref WebServerHost
  WebsiteURL:
    Value: !Sub 'http://${WebServerHost.PublicDnsName}'
    Description: URL for the web server
  PublicIP:
    Description: Public IP address of the web server
    Value: !GetAtt 
      - WebServerHost
      - PublicIp
  CloudWatchLogGroupName:
    Description: The name of the CloudWatch log group
    Value: !Ref LogGroup
```

## Consulte também
<a name="w2aac11c41c35c11"></a>

Para obter mais informações sobre recursos CloudWatch Logs, consulte [AWS::Logs::LogGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-loggroup.html) e [AWS::Logs::MetricFilter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-metricfilter.html).

# Trechos de modelo do Amazon DynamoDB
<a name="quickref-dynamodb"></a>

**Topics**
+ [Aplicativo Auto Scaling com uma tabela do Amazon DynamoDB](#quickref-dynamodb-application-autoscaling)
+ [Consulte também](#w2aac11c41c39b7)

## Aplicativo Auto Scaling com uma tabela do Amazon DynamoDB
<a name="quickref-dynamodb-application-autoscaling"></a>

Este exemplo configura o Application Auto Scaling para um recurso `AWS::DynamoDB::Table`. O modelo define uma política de escalabilidade `TargetTrackingScaling` que aumenta o throughput de `WriteCapacityUnits` para a tabela.

### JSON
<a name="quickref-dynamodb-example.json"></a>

```
{
    "Resources": {
        "DDBTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "AttributeDefinitions": [
                    {
                        "AttributeName": "ArtistId",
                        "AttributeType": "S"
                    },
                    {
                        "AttributeName": "Concert",
                        "AttributeType": "S"
                    },
                    {
                        "AttributeName": "TicketSales",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "ArtistId",
                        "KeyType": "HASH"
                    },
                    {
                        "AttributeName": "Concert",
                        "KeyType": "RANGE"
                    }
                ],
                "GlobalSecondaryIndexes": [
                    {
                        "IndexName": "GSI",
                        "KeySchema": [
                            {
                                "AttributeName": "TicketSales",
                                "KeyType": "HASH"
                            }
                        ],
                        "Projection": {
                            "ProjectionType": "KEYS_ONLY"
                        },
                        "ProvisionedThroughput": {
                            "ReadCapacityUnits": 5,
                            "WriteCapacityUnits": 5
                        }
                    }
                ],
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 5
                }
            }
        },
        "WriteCapacityScalableTarget": {
            "Type": "AWS::ApplicationAutoScaling::ScalableTarget",
            "Properties": {
                "MaxCapacity": 15,
                "MinCapacity": 5,
                "ResourceId": {
                    "Fn::Join": [
                        "/",
                        [
                            "table",
                            {
                                "Ref": "DDBTable"
                            }
                        ]
                    ]
                },
                "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" },
                "ScalableDimension": "dynamodb:table:WriteCapacityUnits",
                "ServiceNamespace": "dynamodb"
            }
        },
        "WriteScalingPolicy": {
            "Type": "AWS::ApplicationAutoScaling::ScalingPolicy",
            "Properties": {
                "PolicyName": "WriteAutoScalingPolicy",
                "PolicyType": "TargetTrackingScaling",
                "ScalingTargetId": {
                    "Ref": "WriteCapacityScalableTarget"
                },
                "TargetTrackingScalingPolicyConfiguration": {
                    "TargetValue": 50,
                    "ScaleInCooldown": 60,
                    "ScaleOutCooldown": 60,
                    "PredefinedMetricSpecification": {
                        "PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
                    }
                }
            }
        }
    }
}
```

### YAML
<a name="quickref-dynamodb-example.yaml"></a>

```
Resources:
  DDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: "ArtistId"
          AttributeType: "S"
        - AttributeName: "Concert"
          AttributeType: "S"
        - AttributeName: "TicketSales"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "ArtistId"
          KeyType: "HASH"
        - AttributeName: "Concert"
          KeyType: "RANGE"
      GlobalSecondaryIndexes:
        - IndexName: "GSI"
          KeySchema:
            - AttributeName: "TicketSales"
              KeyType: "HASH"
          Projection:
            ProjectionType: "KEYS_ONLY"
          ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 5
  WriteCapacityScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 15
      MinCapacity: 5
      ResourceId: !Join
        - /
        - - table
          - !Ref DDBTable
      RoleARN:
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
      ScalableDimension: dynamodb:table:WriteCapacityUnits
      ServiceNamespace: dynamodb
  WriteScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: WriteAutoScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 50.0
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
```

## Consulte também
<a name="w2aac11c41c39b7"></a>

Consulte mais informações na publicação do blog [How to use CloudFormation to configure auto scaling for DynamoDB tables and indexes](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/) no blog de banco de dados da AWS.

Para obter mais informações sobre recursos DynamoDB, consulte [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html).

# Snippets de modelo do CloudFormation do Amazon EC2
<a name="quickref-ec2"></a>

O Amazon EC2 fornece capacidade de computação escalável na Nuvem AWS. É possível usar o Amazon EC2 para executar quantos servidores virtuais forem necessários, configurar a segurança e as redes e gerenciar o armazenamento. Esses servidores virtuais, conhecidos como instâncias, podem executar uma variedade de sistemas operacionais e aplicações e podem ser personalizados para atender às suas necessidades específicas. O Amazon EC2 permite que você aumente ou reduza a escala verticalmente para lidar com as mudanças nos requisitos ou spikes em uso.

É possível definir e provisionar instâncias do Amazon EC2 como parte de sua infraestrutura usando modelos do CloudFormation. Os modelos facilitam o gerenciamento e a automação da implantação dos recursos do Amazon EC2 de forma consistente e repetível. 

Os snippets de modelos de exemplo a seguir descrevem os recursos ou componentes do CloudFormation para o Amazon EC2. Esses snippets foram projetados para serem integrados a um modelo e não devem ser executados de forma independente.

**Topics**
+ [Configurar instâncias do EC2](quickref-ec2-instance-config.md)
+ [Criar modelos de execução](quickref-ec2-launch-templates.md)
+ [Gerenciar grupos de segurança](quickref-ec2-sg.md)
+ [Alocar IPs elásticos](quickref-ec2-elastic-ip.md)
+ [Configurar os recursos da VPC](quickref-ec2-vpc.md)

# Configurar instâncias do Amazon EC2 com o CloudFormation
<a name="quickref-ec2-instance-config"></a>

Os snippets a seguir demonstram como configurar instâncias do Amazon EC2 usando o CloudFormation.

**Topics**
+ [Configurações gerais do Amazon EC2](#quickref-ec2-instance-config-general)
+ [Especificar os mapeamentos de dispositivos de blocos para uma instância](#scenario-ec2-bdm)

## Configurações gerais do Amazon EC2
<a name="quickref-ec2-instance-config-general"></a>

Os snippets a seguir demonstram as configurações gerais para as instâncias do Amazon EC2 usando o CloudFormation.

**Topics**
+ [Criar uma instância do Amazon EC2 em uma zona de disponibilidade especificada](#scenario-ec2-instance)
+ [Configurar uma instância do Amazon EC2 marcada com um volume do EBS e dados do usuário](#scenario-ec2-instance-with-vol-and-tags)
+ [Definir o nome da tabela do DynamoDB nos dados de usuário para a execução da instância do Amazon EC2](#scenario-ec2-with-sdb-domain)
+ [Criar um volume do Amazon EBS com uma `DeletionPolicy`](#scenario-ec2-volume)

### Criar uma instância do Amazon EC2 em uma zona de disponibilidade especificada
<a name="scenario-ec2-instance"></a>

O snippet a seguir cria uma instância do Amazon EC2 na zona de disponibilidade especificada usando um recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). O código da zona de disponibilidade é o seu código de região seguido por um identificador de letra. Você pode iniciar uma instância em uma zona de disponibilidade única. 

#### JSON
<a name="quickref-ec2-example-6.json"></a>

```
1. "Ec2Instance": {
2.     "Type": "AWS::EC2::Instance",
3.     "Properties": {
4.         "AvailabilityZone": "aa-example-1a",
5.         "ImageId": "ami-1234567890abcdef0"
6.     }
7. }
```

#### YAML
<a name="quickref-ec2-example-6.yaml"></a>

```
1. Ec2Instance:
2.   Type: AWS::EC2::Instance
3.   Properties:
4.     AvailabilityZone: aa-example-1a
5.     ImageId: ami-1234567890abcdef0
```

### Configurar uma instância do Amazon EC2 marcada com um volume do EBS e dados do usuário
<a name="scenario-ec2-instance-with-vol-and-tags"></a>

O snippet a seguir cria uma instância do Amazon EC2 com uma tag, um volume do EBS e dados do usuário. Ele usa um recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). No mesmo modelo, você deve definir um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html), [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) e [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html). Você deve definir o `KeyName` na seção `Parameters` do modelo.

As tags ajudam a categorizar os recursos da AWS com base em suas preferências, como finalidade, proprietário ou ambiente. Os dados do usuário permitem o provisionamento de scripts ou dados personalizados para uma instância durante a execução. Esses dados facilitam a automação de tarefas, a configuração de software, a instalação de pacotes e outras ações em uma instância durante a inicialização. 

Para obter mais informações sobre marcação de recursos com tags, consulte [Marcar recursos do Amazon EC2 com tags](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) no *Guia do usuário do Amazon EC2*. 

Para obter informações sobre dados de usuário, consulte [Usar metadados da instância para gerenciar sua instância do EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) no *Guia do usuário do Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-7.json"></a>

```
 1. "Ec2Instance": {
 2.   "Type": "AWS::EC2::Instance",
 3.   "Properties": {
 4.     "KeyName": { "Ref": "KeyName" },
 5.     "SecurityGroups": [ { "Ref": "Ec2SecurityGroup" } ],
 6.     "UserData": {
 7.       "Fn::Base64": {
 8.         "Fn::Join": [ ":", [
 9.             "PORT=80",
10.             "TOPIC=",
11.             { "Ref": "MySNSTopic" }
12.           ]
13.         ]
14.       }
15.     },
16.     "InstanceType": "aa.size",
17.     "AvailabilityZone": "aa-example-1a",
18.     "ImageId": "ami-1234567890abcdef0",
19.     "Volumes": [
20.       {
21.         "VolumeId": { "Ref": "MyVolumeResource" },
22.         "Device": "/dev/sdk"
23.       }
24.     ],
25.     "Tags": [ { "Key": "Name", "Value": "MyTag" } ]
26.   }
27. }
```

#### YAML
<a name="quickref-ec2-example-7.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     KeyName: !Ref KeyName
 5.     SecurityGroups:
 6.       - !Ref Ec2SecurityGroup
 7.     UserData:
 8.       Fn::Base64:
 9.         Fn::Join:
10.           - ":"
11.           - - "PORT=80"
12.             - "TOPIC="
13.             - !Ref MySNSTopic
14.     InstanceType: aa.size
15.     AvailabilityZone: aa-example-1a
16.     ImageId: ami-1234567890abcdef0
17.     Volumes:
18.       - VolumeId: !Ref MyVolumeResource
19.         Device: "/dev/sdk"
20.     Tags:
21.       - Key: Name
22.         Value: MyTag
```

### Definir o nome da tabela do DynamoDB nos dados de usuário para a execução da instância do Amazon EC2
<a name="scenario-ec2-with-sdb-domain"></a>

O snippet a seguir cria uma instância do Amazon EC2 e define um nome de tabela do DynamoDB nos dados de usuário para transmitir para a instância na execução. Ele usa um recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). Você pode definir parâmetros ou valores dinâmicos nos dados de usuário para transmitir uma instância do EC2 na execução. 

Para obter mais informações sobre dados de usuário, consulte [Usar metadados da instância para gerenciar sua instância do EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) no *Guia do usuário do Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-8.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "UserData": {
 5.             "Fn::Base64": {
 6.                 "Fn::Join": [
 7.                     "",
 8.                     [
 9.                         "TableName=",
10.                         {
11.                             "Ref": "DynamoDBTableName"
12.                         }
13.                     ]
14.                 ]
15.             }
16.         },
17.         "AvailabilityZone": "aa-example-1a",
18.         "ImageId": "ami-1234567890abcdef0"
19.     }
20. }
```

#### YAML
<a name="quickref-ec2-example-8.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     UserData:
 5.       Fn::Base64:
 6.         Fn::Join:
 7.           - ''
 8.           - - 'TableName='
 9.             - Ref: DynamoDBTableName
10.     AvailabilityZone: aa-example-1a
11.     ImageId: ami-1234567890abcdef0
```

### Criar um volume do Amazon EBS com uma `DeletionPolicy`
<a name="scenario-ec2-volume"></a>

Os snippets a seguir criam um volume do Amazon EBS usando um recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) do Amazon EC2. Você pode usar as propriedades `Size` ou `SnapshotID` para definir o volume, mas não ambas. Um atributo `DeletionPolicy` é definido para criar um snapshot do volume quando a pilha é excluída. 

Para obter mais informações sobre o atributo `DeletionPolicy`, consulte [Atributo DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html).

Para obter mais informações sobre criar volumes do Amazon EBS, consulte [Criar um volume do Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-13.json"></a>

Esse snippet cria um volume do Amazon EBS com um **tamanho** especificado. O tamanho está definido como 10, mas você pode ajustá-lo conforme necessário. O recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) permite que você especifique o tamanho ou o ID do snapshot, mas não ambos.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "Size": "10",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

Esse snippet cria um volume do Amazon EBS usando um **ID de snapshot** fornecido. O recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) permite que você especifique o tamanho ou o ID do snapshot, mas não ambos.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "SnapshotId" : "snap-1234567890abcdef0",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

#### YAML
<a name="quickref-ec2-example-13.yaml"></a>

Esse snippet cria um volume do Amazon EBS com um **tamanho** especificado. O tamanho está definido como 10, mas você pode ajustá-lo conforme necessário. O recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) permite que você especifique o tamanho ou o ID do snapshot, mas não ambos.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     Size: 10
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

Esse snippet cria um volume do Amazon EBS usando um **ID de snapshot** fornecido. O recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) permite que você especifique o tamanho ou o ID do snapshot, mas não ambos.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     SnapshotId: snap-1234567890abcdef0
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

## Especificar os mapeamentos de dispositivos de blocos para uma instância
<a name="scenario-ec2-bdm"></a>

Um mapeamento de dispositivos de blocos define os dispositivos de blocos, que inclui volumes de armazenamento de instâncias e volumes do EBS, para anexar a uma instância. Você pode especificar um mapeamento de dispositivos de blocos ao criar uma AMI para que o mapeamento seja usado por todas as instâncias executadas da AMI. Como alternativa, você pode especificar um mapeamento de dispositivos de blocos ao executar uma instância para que o mapeamento substitua o especificado na AMI do qual a instância. foi executada.

Você pode usar os snippets de modelo a seguir para especificar os mapeamentos de dispositivos de blocos para seu EBS ou volumes de armazenamento de instâncias usando a propriedade `BlockDeviceMappings` de um recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). 

Para obter mais informações sobre mapeamento de dispositivos de blocos, consulte [Mapeamento de dispositivos de blocos para volumes em instâncias do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html) no *Guia do usuário do Amazon EC2*.

**Topics**
+ [Especificar os mapeamentos de dispositivos de blocos para dois volumes do EBS](#w2aac11c41c43c13b9c11)
+ [Especificar os mapeamentos de dispositivos de blocos para um volume de armazenamento de instância](#w2aac11c41c43c13b9c13)

### Especificar os mapeamentos de dispositivos de blocos para dois volumes do EBS
<a name="w2aac11c41c43c13b9c11"></a>

#### JSON
<a name="quickref-ec2-example-1.json"></a>

```
"Ec2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
      "KeyName": { "Ref": "KeyName" },
      "InstanceType": { "Ref": "InstanceType" },
      "SecurityGroups": [{ "Ref": "Ec2SecurityGroup" }],
      "BlockDeviceMappings": [
        {
          "DeviceName": "/dev/sda1",
          "Ebs": { "VolumeSize": "50" }
        },
        {
          "DeviceName": "/dev/sdm",
          "Ebs": { "VolumeSize": "100" }
        }
      ]
    }
  }
}
```

#### YAML
<a name="quickref-ec2-example-1.yaml"></a>

```
EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      KeyName: !Ref KeyName
      InstanceType: !Ref InstanceType
      SecurityGroups:
        - !Ref Ec2SecurityGroup
      BlockDeviceMappings:
        -
          DeviceName: /dev/sda1
          Ebs:
            VolumeSize: 50
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeSize: 100
```

### Especificar os mapeamentos de dispositivos de blocos para um volume de armazenamento de instância
<a name="w2aac11c41c43c13b9c13"></a>

#### JSON
<a name="quickref-ec2-example-2.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance", 
  "Properties" : {
    "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
    "KeyName" : { "Ref" : "KeyName" },
    "InstanceType": { "Ref": "InstanceType" },
    "SecurityGroups" : [{ "Ref" : "Ec2SecurityGroup" }],
    "BlockDeviceMappings" : [
      {
        "DeviceName"  : "/dev/sdc",
        "VirtualName" : "ephemeral0"
      }
    ]
  }
}
```

#### YAML
<a name="quickref-ec2-example-2.yaml"></a>

```
EC2Instance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    KeyName: !Ref KeyName
    InstanceType: !Ref InstanceType
    SecurityGroups:
      - !Ref Ec2SecurityGroup
    BlockDeviceMappings:
      - DeviceName: /dev/sdc
        VirtualName: ephemeral0
```

# Criar modelos de execução com o CloudFormation
<a name="quickref-ec2-launch-templates"></a>

Esta seção fornece um exemplo de como criar um modelo de execução do Amazon EC2 usando o CloudFormation. Os modelos de execução permitem que você crie modelos para configurar e provisionar instâncias do Amazon EC2 na AWS. Com os modelos de execução, é possível armazenar parâmetros de inicialização de modo que você não precise especificá-los toda vez que iniciar uma instância. Para obter mais exemplos, consulte a seção [Exemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) no recurso `AWS::EC2::LaunchTemplate`.

Para obter mais informações sobre como criar um modelo de execução, consulte [Armazenar os parâmetros de execução de instâncias nos modelos de execução do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) no *Guia do usuário do Amazon EC2*. 

Para obter mais informações sobre como criar modelos de execução para usar com grupos do Auto Scaling, consulte [Modelos de execução do Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-templates.html) no *Guia do usuário do Amazon EC2 Auto Scaling*.

**Topics**
+ [Crie um modelo de execução que especifique grupos de segurança, tags, dados do usuário e um perfil do IAM](#scenario-as-launch-template)

## Crie um modelo de execução que especifique grupos de segurança, tags, dados do usuário e um perfil do IAM
<a name="scenario-as-launch-template"></a>

Este snippet mostra um recurso [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) que contém as informações de configuração para iniciar uma instância. Você especifica os valores para as propriedades `ImageId`, `InstanceType`, `SecurityGroups`, `UserData` e `TagSpecifications`. A propriedade `SecurityGroups` especifica um grupo de segurança do EC2 existente, bem como um novo grupo de segurança. A função `Ref` recebe o ID do `myNewEC2SecurityGroup` do recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) que é declarado em outro lugar no modelo da pilha. 

O modelo de execução contém uma seção para dados de usuário personalizados. É possível transmitir tarefas de configuração e scripts que são executados quando uma instância é iniciada nessa seção. Neste exemplo, os dados do usuário instalam o AWS Systems Manager Agent e iniciam o agente.

O modelo de execução também inclui um perfil do IAM que permite que aplicações em execução em instâncias executem ações em seu nome. Este exemplo mostra um recurso [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html) para o modelo de inicialização, que usa a propriedade `IamInstanceProfile` para especificar o perfil do IAM. A função `Ref` recebe o nome do `myInstanceProfile` do recurso [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html). Para configurar as permissões do perfil do IAM, especifique um valor para a propriedade `ManagedPolicyArns`.

### JSON
<a name="quickref-launch-template-example-1.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "myLaunchTemplate":{
 4.       "Type":"AWS::EC2::LaunchTemplate",
 5.       "Properties":{
 6.         "LaunchTemplateName":{ "Fn::Sub": "${AWS::StackName}-launch-template" },
 7.         "LaunchTemplateData":{
 8.           "ImageId":"ami-02354e95b3example",
 9.           "InstanceType":"t3.micro",
10.           "IamInstanceProfile":{
11.             "Name":{
12.               "Ref":"myInstanceProfile"
13.             }
14.           },
15.           "SecurityGroupIds":[
16.             {
17.               "Ref":"myNewEC2SecurityGroup"
18.             },
19.             "sg-083cd3bfb8example"
20.           ],
21.           "UserData":{
22.             "Fn::Base64":{
23.               "Fn::Join": [
24.                 "", [
25.                   "#!/bin/bash\n",
26.                   "cd /tmp\n",
27.                   "yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm\n",
28.                   "systemctl enable amazon-ssm-agent\n",
29.                   "systemctl start amazon-ssm-agent\n"
30.                 ]
31.               ]
32.             }
33.           },
34.           "TagSpecifications":[
35.             {
36.               "ResourceType":"instance",
37.               "Tags":[
38.                 {
39.                   "Key":"environment",
40.                   "Value":"development"
41.                 }
42.               ]
43.             },
44.             {
45.               "ResourceType":"volume",
46.               "Tags":[
47.                 {
48.                   "Key":"environment",
49.                   "Value":"development"
50.                 }
51.               ]
52.             }
53.           ]
54.         }
55.       }
56.     },
57.     "myInstanceRole":{
58.       "Type":"AWS::IAM::Role",
59.       "Properties":{
60.         "RoleName":"InstanceRole",
61.         "AssumeRolePolicyDocument":{
62.           "Version": "2012-10-17",		 	 	 
63.           "Statement":[
64.             {
65.               "Effect":"Allow",
66.               "Principal":{
67.                 "Service":[
68.                   "ec2.amazonaws.com"
69.                 ]
70.               },
71.               "Action":[
72.                 "sts:AssumeRole"
73.               ]
74.             }
75.           ]
76.         },
77.         "ManagedPolicyArns":[
78.           "arn:aws:iam::aws:policy/myCustomerManagedPolicy"
79.         ]
80.       }
81.     },
82.     "myInstanceProfile":{
83.       "Type":"AWS::IAM::InstanceProfile",
84.       "Properties":{
85.         "Path":"/",
86.         "Roles":[
87.           {
88.             "Ref":"myInstanceRole"
89.           }
90.         ]
91.       }
92.     }
93.   }
94. }
```

### YAML
<a name="quickref-launch-template-example-1.yaml"></a>

```
 1. ---
 2. Resources:
 3.   myLaunchTemplate:
 4.     Type: AWS::EC2::LaunchTemplate
 5.     Properties:
 6.       LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
 7.       LaunchTemplateData:
 8.         ImageId: ami-02354e95b3example
 9.         InstanceType: t3.micro
10.         IamInstanceProfile:
11.           Name: !Ref myInstanceProfile
12.         SecurityGroupIds:
13.         - !Ref myNewEC2SecurityGroup
14.         - sg-083cd3bfb8example
15.         UserData:
16.           Fn::Base64: !Sub |
17.             #!/bin/bash
18.             cd /tmp
19.             yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
20.             systemctl enable amazon-ssm-agent
21.             systemctl start amazon-ssm-agent
22.         TagSpecifications:
23.         - ResourceType: instance
24.           Tags:
25.           - Key: environment
26.             Value: development
27.         - ResourceType: volume
28.           Tags:
29.           - Key: environment
30.             Value: development
31.   myInstanceRole:
32.     Type: AWS::IAM::Role
33.     Properties:
34.       RoleName: InstanceRole
35.       AssumeRolePolicyDocument:
36.         Version: '2012-10-17'
37.         Statement:
38.         - Effect: 'Allow'
39.           Principal:
40.             Service:
41.             - 'ec2.amazonaws.com'
42.           Action:
43.           - 'sts:AssumeRole'
44.       ManagedPolicyArns:
45.         - 'arn:aws:iam::aws:policy/myCustomerManagedPolicy'
46.   myInstanceProfile:
47.     Type: AWS::IAM::InstanceProfile
48.     Properties:
49.       Path: '/'
50.       Roles:
51.       - !Ref myInstanceRole
```

# Gerenciar grupos de segurança com o CloudFormation
<a name="quickref-ec2-sg"></a>

Os snippets a seguir demonstram como usar o CloudFormation para gerenciar grupos de segurança e instâncias do Amazon EC2 para controlar o acesso aos seus recursos da AWS.

**Topics**
+ [Associar uma instância do Amazon EC2 com um grupo de segurança](#quickref-ec2-instances-associate-security-group)
+ [Criar grupo de segurança com regras de entrada](#quickref-ec2-instances-ingress)
+ [Criar um Elastic Load Balancer com uma regra de entrada de grupos de segurança](#scenario-ec2-security-group-elbingress)

## Associar uma instância do Amazon EC2 com um grupo de segurança
<a name="quickref-ec2-instances-associate-security-group"></a>

Os snippets de exemplo a seguir demonstram como associar uma instância do Amazon EC2 a um grupo de segurança padrão da Amazon VPC usando o CloudFormation.

**Topics**
+ [Associar uma instância do Amazon EC2 a um grupo de segurança padrão da VPC](#using-cfn-getatt-default-values)
+ [Criar uma instância do Amazon EC2 com um grupo de segurança e um volume anexado](#scenario-ec2-volumeattachment)

### Associar uma instância do Amazon EC2 a um grupo de segurança padrão da VPC
<a name="using-cfn-getatt-default-values"></a>

O snippet a seguir cria uma Amazon VPC, uma sub-rede dentro da VPC e uma instância do Amazon EC2. A VPC é criada usando um recurso [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html). O intervalo de endereços IP da VPC é definido no modelo maior e é referenciado pelo parâmetro `MyVPCCIDRRange`.

Uma sub-rede é criada dentro da VPC usando um recurso [AWS::EC2:: Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html). A sub-rede está associada à VPC, que é referenciada como `MyVPC`.

Uma instância do EC2 é executada dentro da VPC e na sub-rede usando um recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). Esse recurso especifica a imagem de máquina da Amazon (AMI) a ser usada para executar a instância, a sub-rede em que a instância será executada e o grupo de segurança a ser associado à instância. O `ImageId` usa um parâmetro do Systems Manager para recuperar dinamicamente a AMI mais recente do Amazon Linux 2. 

O ID do grupo de segurança é obtido usando a função `Fn::GetAtt`, que recupera o grupo de segurança padrão do recurso `MyVPC`. 

A instância é colocada no recurso `MySubnet` definido no snippet. 

Quando você cria uma VPC usando o CloudFormation, a AWS cria automaticamente recursos padrão dentro da VPC, incluindo um grupo de segurança padrão. No entanto, ao definir uma VPC em um modelo do CloudFormation, você talvez não tenha acesso aos IDs desses recursos padrão ao criar o modelo. Para acessar e usar os recursos padrão especificados no modelo, você pode usar funções intrínsecas, como `Fn::GetAtt`. Essa função permite que você trabalhe com os recursos padrão que são criados automaticamente pelo CloudFormation.

#### JSON
<a name="quickref-ec2-example-15.json"></a>

```
"MyVPC": {
    "Type": "AWS::EC2::VPC",
    "Properties": {
        "CidrBlock": {
            "Ref": "MyVPCCIDRRange"
        },
        "EnableDnsSupport": false,
        "EnableDnsHostnames": false,
        "InstanceTenancy": "default"
    }
},
"MySubnet": {
    "Type": "AWS::EC2::Subnet",
    "Properties": {
        "CidrBlock": {
            "Ref": "MyVPCCIDRRange"
        },
        "VpcId": {
            "Ref": "MyVPC"
        }
    }
},
"MyInstance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
        "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "SecurityGroupIds": [
            {
                "Fn::GetAtt": [
                    "MyVPC",
                    "DefaultSecurityGroup"
                ]
            }
        ],
        "SubnetId": {
            "Ref": "MySubnet"
        }
    }
}
```

#### YAML
<a name="quickref-ec2-example-15.yaml"></a>

```
MyVPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock:
      Ref: MyVPCCIDRRange
    EnableDnsSupport: false
    EnableDnsHostnames: false
    InstanceTenancy: default
MySubnet:
  Type: AWS::EC2::Subnet
  Properties:
    CidrBlock:
      Ref: MyVPCCIDRRange
    VpcId:
      Ref: MyVPC
MyInstance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    SecurityGroupIds:
      - Fn::GetAtt:
          - MyVPC
          - DefaultSecurityGroup
    SubnetId:
      Ref: MySubnet
```

### Criar uma instância do Amazon EC2 com um grupo de segurança e um volume anexado
<a name="scenario-ec2-volumeattachment"></a>

O snippet a seguir cria uma instância do Amazon EC2 usando um recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html), que é executado de uma AMI designada. A instância está associada a um grupo de segurança que permite a entrada de tráfego SSH na porta 22 de um endereço IP especificado, usando um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html). Ele cria um volume do Amazon EBS de 100 GB usando um recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html). O volume é criado na mesma zona de disponibilidade da instância, conforme especificado pela função `GetAtt`, e é montado na instância no dispositivo `/dev/sdh`.

Para obter mais informações sobre criar volumes do Amazon EBS, consulte [Criar um volume do Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-14.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "SecurityGroups": [
 5.             {
 6.                 "Ref": "InstanceSecurityGroup"
 7.             }
 8.         ],
 9.         "ImageId": "ami-1234567890abcdef0"
10.     }
11. },
12. "InstanceSecurityGroup": {
13.     "Type": "AWS::EC2::SecurityGroup",
14.     "Properties": {
15.         "GroupDescription": "Enable SSH access via port 22",
16.         "SecurityGroupIngress": [
17.             {
18.                 "IpProtocol": "tcp",
19.                 "FromPort": "22",
20.                 "ToPort": "22",
21.                 "CidrIp": "192.0.2.0/24"
22.             }
23.         ]
24.     }
25. },
26. "NewVolume": {
27.     "Type": "AWS::EC2::Volume",
28.     "Properties": {
29.         "Size": "100",
30.         "AvailabilityZone": {
31.             "Fn::GetAtt": [
32.                 "Ec2Instance",
33.                 "AvailabilityZone"
34.             ]
35.         }
36.     }
37. },
38. "MountPoint": {
39.     "Type": "AWS::EC2::VolumeAttachment",
40.     "Properties": {
41.         "InstanceId": {
42.             "Ref": "Ec2Instance"
43.         },
44.         "VolumeId": {
45.             "Ref": "NewVolume"
46.         },
47.         "Device": "/dev/sdh"
48.     }
49. }
```

#### YAML
<a name="quickref-ec2-example-14.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     SecurityGroups:
 5.       - !Ref InstanceSecurityGroup
 6.     ImageId: ami-1234567890abcdef0
 7. InstanceSecurityGroup:
 8.   Type: AWS::EC2::SecurityGroup
 9.   Properties:
10.     GroupDescription: Enable SSH access via port 22
11.     SecurityGroupIngress:
12.       - IpProtocol: tcp
13.         FromPort: 22
14.         ToPort: 22
15.         CidrIp: 192.0.2.0/24
16. NewVolume:
17.   Type: AWS::EC2::Volume
18.   Properties:
19.     Size: 100
20.     AvailabilityZone: !GetAtt [Ec2Instance, AvailabilityZone]
21. MountPoint:
22.   Type: AWS::EC2::VolumeAttachment
23.   Properties:
24.     InstanceId: !Ref Ec2Instance
25.     VolumeId: !Ref NewVolume
26.     Device: /dev/sdh
```

## Criar grupo de segurança com regras de entrada
<a name="quickref-ec2-instances-ingress"></a>

Os snippets de exemplo a seguir demonstram como configurar grupos de segurança com regras de entrada específicas usando o CloudFormation.

**Topics**
+ [Criar um grupo de segurança com regras de entrada para acesso SSH e HTTP](#scenario-ec2-security-group-rule)
+ [Criar um grupo de segurança com regras de entrada para acesso HTTP e SSH de intervalos CIDR especificados](#scenario-ec2-security-group-two-ports)
+ [Criar grupos de segurança de referência cruzada com regras de entrada](#scenario-ec2-security-group-ingress)

### Criar um grupo de segurança com regras de entrada para acesso SSH e HTTP
<a name="scenario-ec2-security-group-rule"></a>

Esse snippet descreve duas regras de entrada do grupo de segurança usando um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html). A primeira regra de entrada permite o acesso SSH (porta 22) de um grupo de segurança existente chamado `MyAdminSecurityGroup`, que pertence à conta da AWS com o número de conta `1111-2222-3333`. A segunda regra de entrada permite o acesso HTTP (porta 80) de outro grupo de segurança chamado`MySecurityGroupCreatedInCFN`, que é criado no mesmo modelo. A função `Ref` é usada para fazer referência ao nome lógico do grupo de segurança criado no mesmo modelo. 

Na primeira regra de entrada, você deve adicionar um valor para as propriedades `SourceSecurityGroupOwnerId` e `SourceSecurityGroupName`. Na segunda regra de entrada, `MySecurityGroupCreatedInCFNTemplate` faz referência a outro grupo de segurança criado no mesmo modelo. Verifique se o nome lógico `MySecurityGroupCreatedInCFNTemplate` corresponde ao nome lógico real do recurso do grupo de segurança que você especifica no modelo maior. 

Para obter mais informações sobre grupos de segurança, consulte [Grupos de segurança do Amazon EC2 para suas instâncias do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) no *Guia do usuário do Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-10.json"></a>

```
 1. "SecurityGroup": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "Allow connections from specified source security group",
 5.         "SecurityGroupIngress": [
 6.             {
 7.                 "IpProtocol": "tcp",
 8.                 "FromPort": "22",
 9.                 "ToPort": "22",
10.                 "SourceSecurityGroupName": "MyAdminSecurityGroup",
11.                 "SourceSecurityGroupOwnerId": "1111-2222-3333"
12.             },
13.             {
14.                 "IpProtocol": "tcp",
15.                 "FromPort": "80",
16.                 "ToPort": "80",
17.                 "SourceSecurityGroupName": {
18.                     "Ref": "MySecurityGroupCreatedInCFNTemplate"
19.                 }
20.             }
21.         ]
22.     }
23. }
```

#### YAML
<a name="quickref-ec2-example-10.yaml"></a>

```
 1. SecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified source security group
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: '22'
 8.         ToPort: '22'
 9.         SourceSecurityGroupName: MyAdminSecurityGroup
10.         SourceSecurityGroupOwnerId: '1111-2222-3333'
11.       - IpProtocol: tcp
12.         FromPort: '80'
13.         ToPort: '80'
14.         SourceSecurityGroupName:
15.           Ref: MySecurityGroupCreatedInCFNTemplate
```

### Criar um grupo de segurança com regras de entrada para acesso HTTP e SSH de intervalos CIDR especificados
<a name="scenario-ec2-security-group-two-ports"></a>

O snippet a seguir cria um grupo de segurança para uma instância do Amazon EC2 com duas regras de entrada. As regras de entrada permitem o tráfego TCP de entrada nas portas especificadas dos intervalos CIDR designados. Um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) é usado para especificar as regras. Você deve especificar um protocolo para cada regra. Para TCP, você deve especificar uma porta ou um intervalo de portas. Se você não especificar um grupo de segurança de origem ou um intervalo CIDR, a pilha será executada com êxito, mas a regra não será aplicada ao grupo de segurança. 

Para obter mais informações sobre grupos de segurança, consulte [Grupos de segurança do Amazon EC2 para suas instâncias do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) no *Guia do usuário do Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-9.json"></a>

```
 1. "ServerSecurityGroup": {
 2.   "Type": "AWS::EC2::SecurityGroup",
 3.   "Properties": {
 4.     "GroupDescription": "Allow connections from specified CIDR ranges",
 5.     "SecurityGroupIngress": [
 6.       {
 7.         "IpProtocol": "tcp",
 8.         "FromPort": "80",
 9.         "ToPort": "80",
10.         "CidrIp": "192.0.2.0/24"
11.       },
12.       {
13.         "IpProtocol": "tcp",
14.         "FromPort": "22",
15.         "ToPort": "22",
16.         "CidrIp": "192.0.2.0/24"
17.       }
18.     ]
19.   }
20. }
```

#### YAML
<a name="quickref-ec2-example-9.yaml"></a>

```
 1. ServerSecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified CIDR ranges
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: 80
 8.         ToPort: 80
 9.         CidrIp: 192.0.2.0/24
10.       - IpProtocol: tcp
11.         FromPort: 22
12.         ToPort: 22
13.         CidrIp: 192.0.2.0/24
```

### Criar grupos de segurança de referência cruzada com regras de entrada
<a name="scenario-ec2-security-group-ingress"></a>

O snippet a seguir usa o recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) para criar dois grupos de segurança do Amazon EC2: `SGroup1` e `SGroup2`. As regras de entrada que permitem a comunicação entre os dois grupos de segurança são criadas usando o recurso [AWS::EC2::SecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroupingress.html). `SGroup1Ingress` estabelece uma regra de entrada para `SGroup1` que permite o tráfego TCP de entrada na porta 80 do grupo de segurança de origem, `SGroup2`. `SGroup2Ingress` estabelece uma regra de entrada para `SGroup2` que permite o tráfego TCP de entrada na porta 80 do grupo de segurança de origem, `SGroup1`. 

#### JSON
<a name="quickref-ec2-example-12.json"></a>

```
 1. "SGroup1": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "EC2 instance access"
 5.     }
 6. },
 7. "SGroup2": {
 8.     "Type": "AWS::EC2::SecurityGroup",
 9.     "Properties": {
10.         "GroupDescription": "EC2 instance access"
11.     }
12. },
13. "SGroup1Ingress": {
14.     "Type": "AWS::EC2::SecurityGroupIngress",
15.     "Properties": {
16.         "GroupName": {
17.             "Ref": "SGroup1"
18.         },
19.         "IpProtocol": "tcp",
20.         "ToPort": "80",
21.         "FromPort": "80",
22.         "SourceSecurityGroupName": {
23.             "Ref": "SGroup2"
24.         }
25.     }
26. },
27. "SGroup2Ingress": {
28.     "Type": "AWS::EC2::SecurityGroupIngress",
29.     "Properties": {
30.         "GroupName": {
31.             "Ref": "SGroup2"
32.         },
33.         "IpProtocol": "tcp",
34.         "ToPort": "80",
35.         "FromPort": "80",
36.         "SourceSecurityGroupName": {
37.             "Ref": "SGroup1"
38.         }
39.     }
40. }
```

#### YAML
<a name="quickref-ec2-example-12.yaml"></a>

```
 1. SGroup1:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: EC2 Instance access
 5. SGroup2:
 6.   Type: AWS::EC2::SecurityGroup
 7.   Properties:
 8.     GroupDescription: EC2 Instance access
 9. SGroup1Ingress:
10.   Type: AWS::EC2::SecurityGroupIngress
11.   Properties:
12.     GroupName: !Ref SGroup1
13.     IpProtocol: tcp
14.     ToPort: 80
15.     FromPort: 80
16.     SourceSecurityGroupName: !Ref SGroup2
17. SGroup2Ingress:
18.   Type: AWS::EC2::SecurityGroupIngress
19.   Properties:
20.     GroupName: !Ref SGroup2
21.     IpProtocol: tcp
22.     ToPort: 80
23.     FromPort: 80
24.     SourceSecurityGroupName: !Ref SGroup1
```

## Criar um Elastic Load Balancer com uma regra de entrada de grupos de segurança
<a name="scenario-ec2-security-group-elbingress"></a>

O modelo a seguir cria um recurso [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html) na zona de disponibilidade especificada. O recurso [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html) está configurado para receber tráfego HTTP na porta 80 e direcionar solicitações para instâncias também na porta 80. O Elastic Load Balancer é responsável pelo balanceamento de carga do tráfego HTTP de entrada entre as instâncias.

 Além disso, esse modelo gera um recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) associado ao balanceador de carga. Esse grupo de segurança é criado com uma única regra de entrada, descrita como `ELB ingress group`, que permite o tráfego TCP de entrada na porta 80. A origem dessa regra de entrada é definida usando a função `Fn::GetAtt` para recuperar atributos do recurso do balanceador de carga. `SourceSecurityGroupOwnerId` usa `Fn::GetAtt` para obter o `OwnerAlias` do grupo de segurança de origem do balanceador de carga. `SourceSecurityGroupName` usa `Fn::Getatt` para obter o `GroupName` do grupo de segurança de origem do ELB. 

Essa configuração garante uma comunicação segura entre o ELB e as instâncias. 

Para mais informações sobre balanceamento de carga consulte o [Manual do usuário do Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/).

### JSON
<a name="quickref-ec2-example-11.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MyELB": {
            "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
            "Properties": {
                "AvailabilityZones": [
                    "aa-example-1a"
                ],
                "Listeners": [
                    {
                        "LoadBalancerPort": "80",
                        "InstancePort": "80",
                        "Protocol": "HTTP"
                    }
                ]
            }
        },
        "MyELBIngressGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "ELB ingress group",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "SourceSecurityGroupOwnerId": {
                            "Fn::GetAtt": [
                                "MyELB",
                                "SourceSecurityGroup.OwnerAlias"
                            ]
                        },
                        "SourceSecurityGroupName": {
                            "Fn::GetAtt": [
                                "MyELB",
                                "SourceSecurityGroup.GroupName"
                            ]
                        }
                    }
                ]
            }
        }
    }
}
```

### YAML
<a name="quickref-ec2-example-11.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyELB:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      AvailabilityZones:
        - aa-example-1a
      Listeners:
        - LoadBalancerPort: '80'
          InstancePort: '80'
          Protocol: HTTP
  MyELBIngressGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB ingress group
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          SourceSecurityGroupOwnerId:
            Fn::GetAtt:
              - MyELB
              - SourceSecurityGroup.OwnerAlias
          SourceSecurityGroupName:
            Fn::GetAtt:
              - MyELB
              - SourceSecurityGroup.GroupName
```

# Alocar e associar endereços IP elásticos com o CloudFormation
<a name="quickref-ec2-elastic-ip"></a>

Os snippets de modelos a seguir são exemplos relacionados a endereços IP elásticos (EIPs) no Amazon EC2. Esses exemplos abrangem alocação, associação e gerenciamento de EIPs para suas instâncias.

**Topics**
+ [Alocar um endereço IP elástico e associá-lo a uma instância do Amazon EC2](#scenario-ec2-eip)
+ [Associar um endereço IP elástico a uma instância do Amazon EC2 especificando o endereço IP](#scenario-ec2-eip-association)
+ [Associar um endereço IP elástico a uma instância do Amazon EC2 especificando o ID de alocação do endereço IP](#scenario-ec2-eip-association-vpc)

## Alocar um endereço IP elástico e associá-lo a uma instância do Amazon EC2
<a name="scenario-ec2-eip"></a>

O snippet a seguir aloca um endereço IP elástico (EIP) do Amazon EC2 e o associa a uma instância do Amazon EC2 usando um recurso [AWS::EC2::EIP](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html). Você pode alocar um endereço EIP de um grupo de endereços de propriedade da AWS ou de um grupo de endereços criados em um intervalo de endereços IPv4 públicos que você trouxe para a AWS para uso com seus recursos da AWS, usando a opção [traga seus próprios endereços IP (BYOIP)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html). Neste exemplo, o EIP é alocado de um grupo de endereços de propriedade da AWS.

Para obter mais informações sobre endereços IP elásticos, consulte [Endereços IP elásticos](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) no *Guia do usuário do Amazon EC2*.

### JSON
<a name="quickref-ec2-example-3.json"></a>

```
1. "ElasticIP": {
2.     "Type": "AWS::EC2::EIP",
3.     "Properties": {
4.         "InstanceId": {
5.             "Ref": "Ec2Instance"
6.         }
7.     }
8. }
```

### YAML
<a name="quickref-ec2-example-3.yaml"></a>

```
1. ElasticIP:
2.   Type: AWS::EC2::EIP
3.   Properties:
4.     InstanceId: !Ref EC2Instance
```

## Associar um endereço IP elástico a uma instância do Amazon EC2 especificando o endereço IP
<a name="scenario-ec2-eip-association"></a>

O snippet a seguir associa um endereço IP elástico existente do Amazon EC2 a uma instância do EC2 usando um recurso [AWS::EC2::EIPAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html). Você deve primeiro alocar um endereço IP elástico para usar em sua conta. Um endereço IP elástico pode ser associado a uma instância única.

### JSON
<a name="quickref-ec2-example-4.json"></a>

```
1. "IPAssoc": {
2.   "Type": "AWS::EC2::EIPAssociation",
3.   "Properties": {
4.     "InstanceId": {
5.       "Ref": "Ec2Instance"
6.     },
7.     "EIP": "192.0.2.0"
8.   }
9. }
```

### YAML
<a name="quickref-ec2-example-4.yaml"></a>

```
1. IPAssoc:
2.   Type: AWS::EC2::EIPAssociation
3.   Properties:
4.     InstanceId: !Ref EC2Instance
5.     EIP: 192.0.2.0
```

## Associar um endereço IP elástico a uma instância do Amazon EC2 especificando o ID de alocação do endereço IP
<a name="scenario-ec2-eip-association-vpc"></a>

O snippet a seguir associa um endereço IP elástico existente a uma instância do Amazon EC2 especificando o ID de alocação usando um recurso [AWS::EC2::EIPAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html). Um ID de alocação é atribuído a um endereço IP elástico na alocação deste. 

### JSON
<a name="quickref-ec2-example-5.json"></a>

```
1. "IPAssoc": {
2.     "Type": "AWS::EC2::EIPAssociation",
3.     "Properties": {
4.         "InstanceId": {
5.             "Ref": "Ec2Instance"
6.         },
7.         "AllocationId": "eipalloc-1234567890abcdef0"
8.     }
9. }
```

### YAML
<a name="quickref-ec2-example-5.yaml"></a>

```
1. IPAssoc:
2.   Type: AWS::EC2::EIPAssociation
3.   Properties:
4.     InstanceId: !Ref EC2Instance
5.     AllocationId: eipalloc-1234567890abcdef0
```

# Configurar os recursos da Amazon VPC com o CloudFormation
<a name="quickref-ec2-vpc"></a>

Esta seção fornece exemplos de como configurar os recursos da Amazon VPC usando o CloudFormation. As VPCs permitem que você crie uma rede virtual na AWS, e esses snippets mostram como configurar aspectos das VPCs para atender aos seus requisitos de rede. 

**Topics**
+ [Habilitar o acesso à Internet IPv6 somente de saída em uma VPC](#quickref-ec2-route-egressonlyinternetgateway)
+ [Trechos do modelo da interface de rede elástica (ENI)](#cfn-template-snippets-eni)

## Habilitar o acesso à Internet IPv6 somente de saída em uma VPC
<a name="quickref-ec2-route-egressonlyinternetgateway"></a>

Um gateway da Internet somente de saída permite que instâncias dentro de uma VPC acessem a Internet e impeçam que recursos na Internet se comuniquem com as instâncias. O snippet a seguir permite o acesso à Internet IPv6 somente de saída de dentro de uma VPC. Ele cria uma VPC com um intervalo de endereços IPv4 de `10.0.0/16`usando um recurso [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html). Uma tabela de rotas é associada a esse recurso da VPC usando um recurso [AWS::EC2::RouteTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-routetable.html). A tabela de rotas gerencia rotas para instâncias dentro da VPC. Um [AWS::EC2::EgressOnlyInternetGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-egressonlyinternetgateway.html) é usado para criar um gateway da Internet somente de saída para permitir a comunicação IPv6 para tráfego de saída de instâncias dentro da VPC, evitando o tráfego de entrada. Um recurso [AWS::EC2::Route](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-route.html) é especificado para criar uma rota IPv6 na tabela de rotas que direciona todo o tráfego IPv6 de saída (`::/0`) para o gateway da Internet somente de saída. 

Para obter mais informações sobre gateways da Internet somente de saída, consulte [Habilitar o tráfego IPv6 de saída usando gateways da Internet somente de saída](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html) no *Guia do usuário da Amazon VPC*.

### JSON
<a name="quickref-ec2-example-16.json"></a>

```
"DefaultIpv6Route": {
    "Type": "AWS::EC2::Route",
    "Properties": {
        "DestinationIpv6CidrBlock": "::/0",
        "EgressOnlyInternetGatewayId": {
            "Ref": "EgressOnlyInternetGateway"
        },
        "RouteTableId": {
            "Ref": "RouteTable"
        }
    }
},
"EgressOnlyInternetGateway": {
    "Type": "AWS::EC2::EgressOnlyInternetGateway",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        }
    }
},
"RouteTable": {
    "Type": "AWS::EC2::RouteTable",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        }
    }
},
"VPC": {
    "Type": "AWS::EC2::VPC",
    "Properties": {
        "CidrBlock": "10.0.0.0/16"
    }
}
```

### YAML
<a name="quickref-ec2-example-16.yaml"></a>

```
DefaultIpv6Route:
  Type: AWS::EC2::Route
  Properties:
    DestinationIpv6CidrBlock: "::/0"
    EgressOnlyInternetGatewayId:
      Ref: "EgressOnlyInternetGateway"
    RouteTableId:
      Ref: "RouteTable"
EgressOnlyInternetGateway:
  Type: AWS::EC2::EgressOnlyInternetGateway
  Properties:
    VpcId:
      Ref: "VPC"
RouteTable:
  Type: AWS::EC2::RouteTable
  Properties:
    VpcId:
      Ref: "VPC"
VPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock: "10.0.0.0/16"
```

## Trechos do modelo da interface de rede elástica (ENI)
<a name="cfn-template-snippets-eni"></a>

### Criar uma instância do Amazon EC2 com interfaces de rede elástica (ENIs) anexadas
<a name="cfn-template-snippets-eni-template"></a>

O trecho de exemplo a seguir cria uma instância do Amazon EC2 usando um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) na sub-rede e na Amazon VPC especificada. Ele anexa duas interfaces de rede (ENIs) à instância, associa endereços IP elásticos às instâncias por meio dos ENIs anexados e configura o grupo de segurança para acesso SSH e HTTP. Os dados de usuário são fornecidos à instância como parte da configuração de execução quando a instância é criada. Os dados de usuário incluem um script codificado no formato `base64` para garantir que sejam transmitidos para a instância. Quando a instância é executada, o script é executado automaticamente como parte do processo de bootstrapping. Ele instala `ec2-net-utils`, configura as interfaces de rede e inicia o serviço HTTP. 

Para determinar a imagem de máquina da Amazon (AMI) apropriada com base na região selecionada, o snippet usa uma função `Fn::FindInMap` que pesquisa valores em um mapeamento `RegionMap`. Esse mapeamento deve ser definido no modelo maior. As duas interfaces de rede são criadas usando recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-networkinterface.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-networkinterface.html). Os endereços IP elásticos são especificados usando os recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html) alocados ao domínio `vpc`. Esses endereços IP elásticos são associados às interfaces de rede usando os recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html). 

A seção `Outputs` define os valores ou recursos que você deseja acessar depois que a pilha é criada. Nesse snippet, a saída definida é `InstancePublicIp`, que representa o endereço IP público da instância do EC2 criada pela pilha. É possível recuperar essa saída na guia **Saída** no console do CloudFormation ou usando o comando [describe-stacks](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html). 

Para obter mais informações sobre interfaces de rede elástica, consulte [Interfaces de rede elástica](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html).

#### JSON
<a name="cfn-template-snippets-eni-example-1.json"></a>

```
"Resources": {
    "ControlPortAddress": {
        "Type": "AWS::EC2::EIP",
        "Properties": {
            "Domain": "vpc"
        }
    },
    "AssociateControlPort": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
            "AllocationId": {
                "Fn::GetAtt": [
                    "ControlPortAddress",
                    "AllocationId"
                ]
            },
            "NetworkInterfaceId": {
                "Ref": "controlXface"
            }
        }
    },
    "WebPortAddress": {
        "Type": "AWS::EC2::EIP",
        "Properties": {
            "Domain": "vpc"
        }
    },
    "AssociateWebPort": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
            "AllocationId": {
                "Fn::GetAtt": [
                    "WebPortAddress",
                    "AllocationId"
                ]
            },
            "NetworkInterfaceId": {
                "Ref": "webXface"
            }
        }
    },
    "SSHSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "VpcId": {
                "Ref": "VpcId"
            },
            "GroupDescription": "Enable SSH access via port 22",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": 22,
                    "IpProtocol": "tcp",
                    "ToPort": 22
                }
            ]
        }
    },
    "WebSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "VpcId": {
                "Ref": "VpcId"
            },
            "GroupDescription": "Enable HTTP access via user-defined port",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": 80,
                    "IpProtocol": "tcp",
                    "ToPort": 80
                }
            ]
        }
    },
    "controlXface": {
        "Type": "AWS::EC2::NetworkInterface",
        "Properties": {
            "SubnetId": {
                "Ref": "SubnetId"
            },
            "Description": "Interface for controlling traffic such as SSH",
            "GroupSet": [
                {
                    "Fn::GetAtt": [
                        "SSHSecurityGroup",
                        "GroupId"
                    ]
                }
            ],
            "SourceDestCheck": true,
            "Tags": [
                {
                    "Key": "Network",
                    "Value": "Control"
                }
            ]
        }
    },
    "webXface": {
        "Type": "AWS::EC2::NetworkInterface",
        "Properties": {
            "SubnetId": {
                "Ref": "SubnetId"
            },
            "Description": "Interface for web traffic",
            "GroupSet": [
                {
                    "Fn::GetAtt": [
                        "WebSecurityGroup",
                        "GroupId"
                    ]
                }
            ],
            "SourceDestCheck": true,
            "Tags": [
                {
                    "Key": "Network",
                    "Value": "Web"
                }
            ]
        }
    },
    "Ec2Instance": {
        "Type": "AWS::EC2::Instance",
        "Properties": {
            "ImageId": {
                "Fn::FindInMap": [
                    "RegionMap",
                    {
                        "Ref": "AWS::Region"
                    },
                    "AMI"
                ]
            },
            "KeyName": {
                "Ref": "KeyName"
            },
            "NetworkInterfaces": [
                {
                    "NetworkInterfaceId": {
                        "Ref": "controlXface"
                    },
                    "DeviceIndex": "0"
                },
                {
                    "NetworkInterfaceId": {
                        "Ref": "webXface"
                    },
                    "DeviceIndex": "1"
                }
            ],
            "Tags": [
                {
                    "Key": "Role",
                    "Value": "Test Instance"
                }
            ],
            "UserData": {
                "Fn::Base64": {
                    "Fn::Sub": "#!/bin/bash -xe\nyum install ec2-net-utils -y\nec2ifup eth1\nservice httpd start\n"
                }
            }
        }
    }
},
"Outputs": {
    "InstancePublicIp": {
        "Description": "Public IP Address of the EC2 Instance",
        "Value": {
            "Fn::GetAtt": [
                "Ec2Instance",
                "PublicIp"
            ]
        }
    }
}
```

#### YAML
<a name="cfn-template-snippets-eni-example.yaml"></a>

```
Resources:
  ControlPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  AssociateControlPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId:
        Fn::GetAtt:
          - ControlPortAddress
          - AllocationId
      NetworkInterfaceId:
        Ref: controlXface
  WebPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  AssociateWebPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId:
        Fn::GetAtt:
          - WebPortAddress
          - AllocationId
      NetworkInterfaceId:
        Ref: webXface
  SSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          FromPort: 22
          IpProtocol: tcp
          ToPort: 22
  WebSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      GroupDescription: Enable HTTP access via user-defined port
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          FromPort: 80
          IpProtocol: tcp
          ToPort: 80
  controlXface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId:
        Ref: SubnetId
      Description: Interface for controlling traffic such as SSH
      GroupSet:
        - Fn::GetAtt:
            - SSHSecurityGroup
            - GroupId
      SourceDestCheck: true
      Tags:
        - Key: Network
          Value: Control
  webXface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId:
        Ref: SubnetId
      Description: Interface for web traffic
      GroupSet:
        - Fn::GetAtt:
            - WebSecurityGroup
            - GroupId
      SourceDestCheck: true
      Tags:
        - Key: Network
          Value: Web
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId:
        Fn::FindInMap:
          - RegionMap
          - Ref: AWS::Region
          - AMI
      KeyName:
        Ref: KeyName
      NetworkInterfaces:
        - NetworkInterfaceId:
            Ref: controlXface
          DeviceIndex: "0"
        - NetworkInterfaceId:
            Ref: webXface
          DeviceIndex: "1"
      Tags:
        - Key: Role
          Value: Test Instance
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum install ec2-net-utils -y
          ec2ifup eth1
          service httpd start
Outputs:
  InstancePublicIp:
    Description: Public IP Address of the EC2 Instance
    Value:
      Fn::GetAtt:
        - Ec2Instance
        - PublicIp
```

# Modelos de exemplo do Amazon Elastic Container Service
<a name="quickref-ecs"></a>

O Amazon Elastic Container Service (Amazon ECS) é um serviço de gerenciamento de contêineres que facilita a execução, a interrupção e o gerenciamento de contêineres do Docker em um cluster de instâncias do Amazon Elastic Compute Cloud (Amazon EC2).

## Criar um cluster com a AMI otimizada para Amazon ECS para AL2023
<a name="create-cluster-al2023"></a>

Defina um cluster que usa um provedor de capacidade que executa instâncias AL2023 no Amazon EC2.

**Importante**  
Para os IDs da AMI mais recente, consulte [AMI otimizada pelo Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html), no *Amazon Elastic Container Service Developer Guide*.

### JSON
<a name="quickref-ecs-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "EC2 ECS cluster that starts out empty, with no EC2 instances yet. An ECS capacity provider automatically launches more EC2 instances as required on the fly when you request ECS to launch services or standalone tasks.",
  "Parameters": {
      "InstanceType": {
          "Type": "String",
          "Description": "EC2 instance type",
          "Default": "t2.medium",
          "AllowedValues": [
              "t1.micro",
              "t2.2xlarge",
              "t2.large",
              "t2.medium",
              "t2.micro",
              "t2.nano",
              "t2.small",
              "t2.xlarge",
              "t3.2xlarge",
              "t3.large",
              "t3.medium",
              "t3.micro",
              "t3.nano",
              "t3.small",
              "t3.xlarge"
          ]
      },
      "DesiredCapacity": {
          "Type": "Number",
          "Default": "0",
          "Description": "Number of EC2 instances to launch in your ECS cluster."
      },
      "MaxSize": {
          "Type": "Number",
          "Default": "100",
          "Description": "Maximum number of EC2 instances that can be launched in your ECS cluster."
      },
      "ECSAMI": {
          "Description": "The Amazon Machine Image ID used for the cluster",
          "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
          "Default": "/aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id"
      },
      "VpcId": {
          "Type": "AWS::EC2::VPC::Id",
          "Description": "VPC ID where the ECS cluster is launched",
          "Default": "vpc-1234567890abcdef0"
      },
      "SubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of subnet IDs where the EC2 instances will be launched",
          "Default": "subnet-021345abcdef67890"
      }
  },
  "Resources": {
      "ECSCluster": {
          "Type": "AWS::ECS::Cluster",
          "Properties": {
              "ClusterSettings": [
                  {
                      "Name": "containerInsights",
                      "Value": "enabled"
                  }
              ]
          }
      },
      "ECSAutoScalingGroup": {
          "Type": "AWS::AutoScaling::AutoScalingGroup",
          "DependsOn": [
              "ECSCluster",
              "EC2Role"
          ],
          "Properties": {
              "VPCZoneIdentifier": {
                  "Ref": "SubnetIds"
              },
              "LaunchTemplate": {
                  "LaunchTemplateId": {
                      "Ref": "ContainerInstances"
                  },
                  "Version": {
                      "Fn::GetAtt": [
                          "ContainerInstances",
                          "LatestVersionNumber"
                      ]
                  }
              },
              "MinSize": 0,
              "MaxSize": {
                  "Ref": "MaxSize"
              },
              "DesiredCapacity": {
                  "Ref": "DesiredCapacity"
              },
              "NewInstancesProtectedFromScaleIn": true
          },
          "UpdatePolicy": {
              "AutoScalingReplacingUpdate": {
                  "WillReplace": "true"
              }
          }
      },
      "ContainerInstances": {
          "Type": "AWS::EC2::LaunchTemplate",
          "Properties": {
              "LaunchTemplateName": "asg-launch-template",
              "LaunchTemplateData": {
                  "ImageId": {
                      "Ref": "ECSAMI"
                  },
                  "InstanceType": {
                      "Ref": "InstanceType"
                  },
                  "IamInstanceProfile": {
                      "Name": {
                          "Ref": "EC2InstanceProfile"
                      }
                  },
                  "SecurityGroupIds": [
                      {
                          "Ref": "ContainerHostSecurityGroup"
                      }
                  ],
                  "UserData": {
                      "Fn::Base64": {
                          "Fn::Sub": "#!/bin/bash -xe\n echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config\n yum install -y aws-cfn-bootstrap\n /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource ContainerInstances --configsets full_install --region ${AWS::Region} &\n"
                      }
                  },
                  "MetadataOptions": {
                      "HttpEndpoint": "enabled",
                      "HttpTokens": "required"
                  }
              }
          }
      },
      "EC2InstanceProfile": {
          "Type": "AWS::IAM::InstanceProfile",
          "Properties": {
              "Path": "/",
              "Roles": [
                  {
                      "Ref": "EC2Role"
                  }
              ]
          }
      },
      "CapacityProvider": {
          "Type": "AWS::ECS::CapacityProvider",
          "Properties": {
              "AutoScalingGroupProvider": {
                  "AutoScalingGroupArn": {
                      "Ref": "ECSAutoScalingGroup"
                  },
                  "ManagedScaling": {
                      "InstanceWarmupPeriod": 60,
                      "MinimumScalingStepSize": 1,
                      "MaximumScalingStepSize": 100,
                      "Status": "ENABLED",
                      "TargetCapacity": 100
                  },
                  "ManagedTerminationProtection": "ENABLED"
              }
          }
      },
      "CapacityProviderAssociation": {
          "Type": "AWS::ECS::ClusterCapacityProviderAssociations",
          "Properties": {
              "CapacityProviders": [
                  {
                      "Ref": "CapacityProvider"
                  }
              ],
              "Cluster": {
                  "Ref": "ECSCluster"
              },
              "DefaultCapacityProviderStrategy": [
                  {
                      "Base": 0,
                      "CapacityProvider": {
                          "Ref": "CapacityProvider"
                      },
                      "Weight": 1
                  }
              ]
          }
      },
      "ContainerHostSecurityGroup": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Access to the EC2 hosts that run containers",
              "VpcId": {
                  "Ref": "VpcId"
              }
          }
      },
      "EC2Role": {
          "Type": "AWS::IAM::Role",
          "Properties": {
              "AssumeRolePolicyDocument": {
                  "Statement": [
                      {
                          "Effect": "Allow",
                          "Principal": {
                              "Service": [
                                  "ec2.amazonaws.com"
                              ]
                          },
                          "Action": [
                              "sts:AssumeRole"
                          ]
                      }
                  ]
              },
              "Path": "/",
              "ManagedPolicyArns": [
                  "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role",
                  "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
              ]
          }
      },
      "ECSTaskExecutionRole": {
          "Type": "AWS::IAM::Role",
          "Properties": {
              "AssumeRolePolicyDocument": {
                  "Statement": [
                      {
                          "Effect": "Allow",
                          "Principal": {
                              "Service": [
                                  "ecs-tasks.amazonaws.com"
                              ]
                          },
                          "Action": [
                              "sts:AssumeRole"
                          ],
                          "Condition": {
                              "ArnLike": {
                                  "aws:SourceArn": {
                                      "Fn::Sub": "arn:${AWS::Partition}:ecs:${AWS::Region}:${AWS::AccountId}:*"
                                  }
                              },
                              "StringEquals": {
                                  "aws:SourceAccount": {
                                        "Fn::Sub": "${AWS::AccountId}"
                                    }
                              }
                          }
                      }
                  ]
              },
              "Path": "/",
              "ManagedPolicyArns": [
                  "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
              ]
          }
      }
  },
  "Outputs": {
      "ClusterName": {
          "Description": "The ECS cluster into which to launch resources",
          "Value": "ECSCluster"
      },
      "ECSTaskExecutionRole": {
          "Description": "The role used to start up a task",
          "Value": "ECSTaskExecutionRole"
      },
      "CapacityProvider": {
          "Description": "The cluster capacity provider that the service should use to request capacity when it wants to start up a task",
          "Value": "CapacityProvider"
      }
  }
}
```

### YAML
<a name="quickref-ecs-example-1.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: EC2 ECS cluster that starts out empty, with no EC2 instances yet.
  An ECS capacity provider automatically launches more EC2 instances as required
  on the fly when you request ECS to launch services or standalone tasks.
Parameters:
  InstanceType:
    Type: String
    Description: EC2 instance type
    Default: "t2.medium"
    AllowedValues:
      - t1.micro
      - t2.2xlarge
      - t2.large
      - t2.medium
      - t2.micro
      - t2.nano
      - t2.small
      - t2.xlarge
      - t3.2xlarge
      - t3.large
      - t3.medium
      - t3.micro
      - t3.nano
      - t3.small
      - t3.xlarge
  DesiredCapacity:
    Type: Number
    Default: "0"
    Description: Number of EC2 instances to launch in your ECS cluster.
  MaxSize:
    Type: Number
    Default: "100"
    Description: Maximum number of EC2 instances that can be launched in your ECS cluster.
  ECSAMI:
    Description: The Amazon Machine Image ID used for the cluster
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VPC ID where the ECS cluster is launched
    Default: vpc-1234567890abcdef0
  SubnetIds:
    Type: List<AWS::EC2::Subnet::Id>
    Description: List of subnet IDs where the EC2 instances will be launched
    Default: "subnet-021345abcdef67890"
Resources:
# This is authorizes ECS to manage resources on your
  # account on your behalf. This role is likely already created on your account
  # ECSRole:
  #  Type: AWS::IAM::ServiceLinkedRole
  #  Properties:
  #    AWSServiceName: 'ecs.amazonaws.com'
  
   # ECS Resources
  ECSCluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterSettings:
        - Name: containerInsights
          Value: enabled
  
  # Autoscaling group. This launches the actual EC2 instances that will register
  # themselves as members of the cluster, and run the docker containers.
  ECSAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
      # This is to ensure that the ASG gets deleted first before these
    # resources, when it comes to stack teardown.
      - ECSCluster
      - EC2Role
    Properties:
      VPCZoneIdentifier:
        Ref: SubnetIds
      LaunchTemplate:
        LaunchTemplateId: !Ref ContainerInstances
        Version: !GetAtt ContainerInstances.LatestVersionNumber
      MinSize: 0
      MaxSize:
        Ref: MaxSize
      DesiredCapacity:
        Ref: DesiredCapacity
      NewInstancesProtectedFromScaleIn: true
    UpdatePolicy:
      AutoScalingReplacingUpdate:
        WillReplace: "true"
  # The config for each instance that is added to the cluster
  ContainerInstances:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: "asg-launch-template"
      LaunchTemplateData:
        ImageId:
          Ref: ECSAMI
        InstanceType:
          Ref: InstanceType
        IamInstanceProfile:
          Name: !Ref EC2InstanceProfile
        SecurityGroupIds:
          - !Ref ContainerHostSecurityGroup
        # This injected configuration file is how the EC2 instance
      # knows which ECS cluster on your AWS account it should be joining
        UserData:
          Fn::Base64: !Sub |
           #!/bin/bash -xe
            echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource ContainerInstances --configsets full_install --region ${AWS::Region} &
         # Disable IMDSv1, and require IMDSv2
        MetadataOptions:
          HttpEndpoint: enabled
          HttpTokens: required
  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles: 
      - !Ref EC2Role 
  # Create an ECS capacity provider to attach the ASG to the ECS cluster
  # so that it autoscales as we launch more containers
  CapacityProvider:
    Type: AWS::ECS::CapacityProvider
    Properties:
      AutoScalingGroupProvider:
        AutoScalingGroupArn: !Ref ECSAutoScalingGroup
        ManagedScaling:
          InstanceWarmupPeriod: 60
          MinimumScalingStepSize: 1
          MaximumScalingStepSize: 100
          Status: ENABLED
          # Percentage of cluster reservation to try to maintain
          TargetCapacity: 100
        ManagedTerminationProtection: ENABLED
   # Create a cluster capacity provider assocation so that the cluster
  # will use the capacity provider
  CapacityProviderAssociation:
    Type: AWS::ECS::ClusterCapacityProviderAssociations
    Properties:
      CapacityProviders:
        - !Ref CapacityProvider
      Cluster: !Ref ECSCluster
      DefaultCapacityProviderStrategy:
        - Base: 0
          CapacityProvider: !Ref CapacityProvider
          Weight: 1
  # A security group for the EC2 hosts that will run the containers.
  # This can be used to limit incoming traffic to or outgoing traffic
  # from the container's host EC2 instance.
  ContainerHostSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the EC2 hosts that run containers
      VpcId:
        Ref: VpcId
  # Role for the EC2 hosts. This allows the ECS agent on the EC2 hosts
  # to communciate with the ECS control plane, as well as download the docker
  # images from ECR to run on your host.
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
      # See reference: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role
        - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
      # This managed policy allows us to connect to the instance using SSM
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
  # This is a role which is used within Fargate to allow the Fargate agent
  # to download images, and upload logs.
  ECSTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ecs-tasks.amazonaws.com
            Action:
              - sts:AssumeRole
            Condition:
              ArnLike:
                aws:SourceArn: !Sub arn:${AWS::Partition}:ecs:${AWS::Region}:${AWS::AccountId}:*
              StringEquals:
                aws:SourceAccount: !Sub ${AWS::AccountId}
      Path: /
      # This role enables all features of ECS. See reference:
    # https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonECSTaskExecutionRolePolicy
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
Outputs:
  ClusterName:
    Description: The ECS cluster into which to launch resources
    Value: ECSCluster
  ECSTaskExecutionRole:
    Description: The role used to start up a task
    Value: ECSTaskExecutionRole
  CapacityProvider:
    Description: The cluster capacity provider that the service should use to
      request capacity when it wants to start up a task
    Value: CapacityProvider
```

## Implantar um serviço.
<a name="create-service"></a>

O modelo a seguir define um serviço que usa o provedor de capacidade para solicitar capacidade do AL2023 para execução. Os contêineres serão lançados nas instâncias do AL2023 assim que se tornarem online:

### JSON
<a name="quickref-ecs-example-2.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "An example service that deploys in AWS VPC networking mode on EC2 capacity. Service uses a capacity provider to request EC2 instances to run on. Service runs with networking in private subnets, but still accessible to the internet via a load balancer hosted in public subnets.",
  "Parameters": {
      "VpcId": {
          "Type": "String",
          "Description": "The VPC that the service is running inside of"
      },
      "PublicSubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of public subnet ID's to put the load balancer in"
      },
      "PrivateSubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of private subnet ID's that the AWS VPC tasks are in"
      },
      "ClusterName": {
          "Type": "String",
          "Description": "The name of the ECS cluster into which to launch capacity."
      },
      "ECSTaskExecutionRole": {
          "Type": "String",
          "Description": "The role used to start up an ECS task"
      },
      "CapacityProvider": {
          "Type": "String",
          "Description": "The cluster capacity provider that the service should use to request capacity when it wants to start up a task"
      },
      "ServiceName": {
          "Type": "String",
          "Default": "web",
          "Description": "A name for the service"
      },
      "ImageUrl": {
          "Type": "String",
          "Default": "public.ecr.aws/docker/library/nginx:latest",
          "Description": "The url of a docker image that contains the application process that will handle the traffic for this service"
      },
      "ContainerCpu": {
          "Type": "Number",
          "Default": 256,
          "Description": "How much CPU to give the container. 1024 is 1 CPU"
      },
      "ContainerMemory": {
          "Type": "Number",
          "Default": 512,
          "Description": "How much memory in megabytes to give the container"
      },
      "ContainerPort": {
          "Type": "Number",
          "Default": 80,
          "Description": "What port that the application expects traffic on"
      },
      "DesiredCount": {
          "Type": "Number",
          "Default": 2,
          "Description": "How many copies of the service task to run"
      }
  },
  "Resources": {
      "TaskDefinition": {
          "Type": "AWS::ECS::TaskDefinition",
          "Properties": {
              "Family": {
                  "Ref": "ServiceName"
              },
              "Cpu": {
                  "Ref": "ContainerCpu"
              },
              "Memory": {
                  "Ref": "ContainerMemory"
              },
              "NetworkMode": "awsvpc",
              "RequiresCompatibilities": [
                  "EC2"
              ],
              "ExecutionRoleArn": {
                  "Ref": "ECSTaskExecutionRole"
              },
              "ContainerDefinitions": [
                  {
                      "Name": {
                          "Ref": "ServiceName"
                      },
                      "Cpu": {
                          "Ref": "ContainerCpu"
                      },
                      "Memory": {
                          "Ref": "ContainerMemory"
                      },
                      "Image": {
                          "Ref": "ImageUrl"
                      },
                      "PortMappings": [
                          {
                              "ContainerPort": {
                                  "Ref": "ContainerPort"
                              },
                              "HostPort": {
                                  "Ref": "ContainerPort"
                              }
                          }
                      ],
                      "LogConfiguration": {
                          "LogDriver": "awslogs",
                          "Options": {
                              "mode": "non-blocking",
                              "max-buffer-size": "25m",
                              "awslogs-group": {
                                  "Ref": "LogGroup"
                              },
                              "awslogs-region": {
                                  "Ref": "AWS::Region"
                              },
                              "awslogs-stream-prefix": {
                                  "Ref": "ServiceName"
                              }
                          }
                      }
                  }
              ]
          }
      },
      "Service": {
          "Type": "AWS::ECS::Service",
          "DependsOn": "PublicLoadBalancerListener",
          "Properties": {
              "ServiceName": {
                  "Ref": "ServiceName"
              },
              "Cluster": {
                  "Ref": "ClusterName"
              },
              "PlacementStrategies": [
                  {
                      "Field": "attribute:ecs.availability-zone",
                      "Type": "spread"
                  },
                  {
                      "Field": "cpu",
                      "Type": "binpack"
                  }
              ],
              "CapacityProviderStrategy": [
                  {
                      "Base": 0,
                      "CapacityProvider": {
                          "Ref": "CapacityProvider"
                      },
                      "Weight": 1
                  }
              ],
              "NetworkConfiguration": {
                  "AwsvpcConfiguration": {
                      "SecurityGroups": [
                          {
                              "Ref": "ServiceSecurityGroup"
                          }
                      ],
                      "Subnets": {
                          "Ref": "PrivateSubnetIds"
                      }
                  }
              },
              "DeploymentConfiguration": {
                  "MaximumPercent": 200,
                  "MinimumHealthyPercent": 75
              },
              "DesiredCount": {
                  "Ref": "DesiredCount"
              },
              "TaskDefinition": {
                  "Ref": "TaskDefinition"
              },
              "LoadBalancers": [
                  {
                      "ContainerName": {
                          "Ref": "ServiceName"
                      },
                      "ContainerPort": {
                          "Ref": "ContainerPort"
                      },
                      "TargetGroupArn": {
                          "Ref": "ServiceTargetGroup"
                      }
                  }
              ]
          }
      },
      "ServiceSecurityGroup": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Security group for service",
              "VpcId": {
                  "Ref": "VpcId"
              }
          }
      },
      "ServiceTargetGroup": {
          "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
          "Properties": {
              "HealthCheckIntervalSeconds": 6,
              "HealthCheckPath": "/",
              "HealthCheckProtocol": "HTTP",
              "HealthCheckTimeoutSeconds": 5,
              "HealthyThresholdCount": 2,
              "TargetType": "ip",
              "Port": {
                  "Ref": "ContainerPort"
              },
              "Protocol": "HTTP",
              "UnhealthyThresholdCount": 10,
              "VpcId": {
                  "Ref": "VpcId"
              },
              "TargetGroupAttributes": [
                  {
                      "Key": "deregistration_delay.timeout_seconds",
                      "Value": 0
                  }
              ]
          }
      },
      "PublicLoadBalancerSG": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Access to the public facing load balancer",
              "VpcId": {
                  "Ref": "VpcId"
              },
              "SecurityGroupIngress": [
                  {
                      "CidrIp": "0.0.0.0/0",
                      "IpProtocol": -1
                  }
              ]
          }
      },
      "PublicLoadBalancer": {
          "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
          "Properties": {
              "Scheme": "internet-facing",
              "LoadBalancerAttributes": [
                  {
                      "Key": "idle_timeout.timeout_seconds",
                      "Value": "30"
                  }
              ],
              "Subnets": {
                  "Ref": "PublicSubnetIds"
              },
              "SecurityGroups": [
                  {
                      "Ref": "PublicLoadBalancerSG"
                  }
              ]
          }
      },
      "PublicLoadBalancerListener": {
          "Type": "AWS::ElasticLoadBalancingV2::Listener",
          "Properties": {
              "DefaultActions": [
                  {
                      "Type": "forward",
                      "ForwardConfig": {
                          "TargetGroups": [
                              {
                                  "TargetGroupArn": {
                                      "Ref": "ServiceTargetGroup"
                                  },
                                  "Weight": 100
                              }
                          ]
                      }
                  }
              ],
              "LoadBalancerArn": {
                  "Ref": "PublicLoadBalancer"
              },
              "Port": 80,
              "Protocol": "HTTP"
          }
      },
      "ServiceIngressfromLoadBalancer": {
          "Type": "AWS::EC2::SecurityGroupIngress",
          "Properties": {
              "Description": "Ingress from the public ALB",
              "GroupId": {
                  "Ref": "ServiceSecurityGroup"
              },
              "IpProtocol": -1,
              "SourceSecurityGroupId": {
                  "Ref": "PublicLoadBalancerSG"
              }
          }
      },
      "LogGroup": {
          "Type": "AWS::Logs::LogGroup"
      }
  }
}
```

### YAML
<a name="quickref-ecs-example-2.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: >-
  An example service that deploys in AWS VPC networking mode on EC2 capacity.
  Service uses a capacity provider to request EC2 instances to run on. Service
  runs with networking in private subnets, but still accessible to the internet
  via a load balancer hosted in public subnets.
Parameters:
  VpcId:
    Type: String
    Description: The VPC that the service is running inside of
  PublicSubnetIds:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: List of public subnet ID's to put the load balancer in
  PrivateSubnetIds:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: List of private subnet ID's that the AWS VPC tasks are in
  ClusterName:
    Type: String
    Description: The name of the ECS cluster into which to launch capacity.
  ECSTaskExecutionRole:
    Type: String
    Description: The role used to start up an ECS task
  CapacityProvider:
    Type: String
    Description: >-
      The cluster capacity provider that the service should use to request
      capacity when it wants to start up a task
  ServiceName:
    Type: String
    Default: web
    Description: A name for the service
  ImageUrl:
    Type: String
    Default: 'public.ecr.aws/docker/library/nginx:latest'
    Description: >-
      The url of a docker image that contains the application process that will
      handle the traffic for this service
  ContainerCpu:
    Type: Number
    Default: 256
    Description: How much CPU to give the container. 1024 is 1 CPU
  ContainerMemory:
    Type: Number
    Default: 512
    Description: How much memory in megabytes to give the container
  ContainerPort:
    Type: Number
    Default: 80
    Description: What port that the application expects traffic on
  DesiredCount:
    Type: Number
    Default: 2
    Description: How many copies of the service task to run
Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Ref ServiceName
      Cpu: !Ref ContainerCpu
      Memory: !Ref ContainerMemory
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - EC2
      ExecutionRoleArn: !Ref ECSTaskExecutionRole
      ContainerDefinitions:
        - Name: !Ref ServiceName
          Cpu: !Ref ContainerCpu
          Memory: !Ref ContainerMemory
          Image: !Ref ImageUrl
          PortMappings:
            - ContainerPort: !Ref ContainerPort
              HostPort: !Ref ContainerPort
          LogConfiguration:
            LogDriver: awslogs
            Options:
              mode: non-blocking
              max-buffer-size: 25m
              awslogs-group: !Ref LogGroup
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: !Ref ServiceName
  Service:
    Type: AWS::ECS::Service
    DependsOn: PublicLoadBalancerListener
    Properties:
      ServiceName: !Ref ServiceName
      Cluster: !Ref ClusterName
      PlacementStrategies:
        - Field: 'attribute:ecs.availability-zone'
          Type: spread
        - Field: cpu
          Type: binpack
      CapacityProviderStrategy:
        - Base: 0
          CapacityProvider: !Ref CapacityProvider
          Weight: 1
      NetworkConfiguration:
        AwsvpcConfiguration:
          SecurityGroups:
            - !Ref ServiceSecurityGroup
          Subnets: !Ref PrivateSubnetIds
      DeploymentConfiguration:
        MaximumPercent: 200
        MinimumHealthyPercent: 75
      DesiredCount: !Ref DesiredCount
      TaskDefinition: !Ref TaskDefinition
      LoadBalancers:
        - ContainerName: !Ref ServiceName
          ContainerPort: !Ref ContainerPort
          TargetGroupArn: !Ref ServiceTargetGroup
  ServiceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for service
      VpcId: !Ref VpcId
  ServiceTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 6
      HealthCheckPath: /
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 2
      TargetType: ip
      Port: !Ref ContainerPort
      Protocol: HTTP
      UnhealthyThresholdCount: 10
      VpcId: !Ref VpcId
      TargetGroupAttributes:
        - Key: deregistration_delay.timeout_seconds
          Value: 0
  PublicLoadBalancerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the public facing load balancer
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          IpProtocol: -1
  PublicLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      LoadBalancerAttributes:
        - Key: idle_timeout.timeout_seconds
          Value: '30'
      Subnets: !Ref PublicSubnetIds
      SecurityGroups:
        - !Ref PublicLoadBalancerSG
  PublicLoadBalancerListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ServiceTargetGroup
                Weight: 100
      LoadBalancerArn: !Ref PublicLoadBalancer
      Port: 80
      Protocol: HTTP
  ServiceIngressfromLoadBalancer:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      Description: Ingress from the public ALB
      GroupId: !Ref ServiceSecurityGroup
      IpProtocol: -1
      SourceSecurityGroupId: !Ref PublicLoadBalancerSG
  LogGroup:
    Type: AWS::Logs::LogGroup
```

# Modelo de exemplo do Amazon Elastic File System
<a name="quickref-efs"></a>

O Amazon Elastic File System (Amazon EFS) é um serviço de armazenamento de arquivos para instâncias do Amazon Elastic Compute Cloud (Amazon EC2). Com o Amazon EFS, seus aplicativos têm storage quando precisam dela porque a capacidade de storage cresce e diminui automaticamente à medida que arquivos são adicionados e removidos.

O modelo de exemplo a seguir implanta instâncias do EC2 (em um grupo do Auto Scaling) que estão associadas a um sistema de arquivos do Amazon EFS. Para associar as instâncias ao sistema de arquivos, as instâncias executam o script auxiliar cfn-init, que faz download e instala o pacote yum do `nfs-utils`, cria um novo diretório e, em seguida, usa o nome DNS do sistema de arquivos para montar o sistema de arquivos no diretório. O nome DNS do sistema de arquivos é resolvido para um endereço IP de destino de montagem na Zona de disponibilidade da instância Amazon EC2. Para obter mais informações sobre a estrutura de nome DNS, consulte [Como montar sistemas de arquivos](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html) no *Guia do usuário do Amazon Elastic File System*.

Para medir a atividade do Network File System, o modelo inclui métricas personalizadas do Amazon CloudWatch. O modelo também cria uma VPC, uma sub-rede e security groups. Para permitir que as instâncias se comuniquem com o sistema de arquivos, a VPC deve ter o DNS habilitado, e o destino de montagem e as instâncias EC2 devem estar na mesma Zona de disponibilidade (AZ) que é especificada pela sub-rede.

O security group do destino de montagem permite uma conexão de rede com a porta TCP 2049 que é necessária para que um cliente NFSv4 monte um sistema de arquivos. Para obter mais informações sobre security groups para instâncias do EC2 e destinos de montagem, consulte [Segurança](https://docs.aws.amazon.com/efs/latest/ug/security-considerations.html), no [https://docs.aws.amazon.com/efs/latest/ug/](https://docs.aws.amazon.com/efs/latest/ug/).

**nota**  
Se você fizer uma atualização no destino de montagem que faça com que ele seja substituído, as instâncias ou os aplicativos que usam o sistema de arquivos associado podem ser interrompidos. Isso pode fazer com que as gravações não confirmadas sejam perdidas. Para evitar interrupções, interrompa suas instâncias ao atualizar o destino de montagem definindo a capacidade desejada como zero. Isso permite que as instâncias desmontem o sistema de arquivos antes que o destino de montagem seja substituído. Após a conclusão da atualização da montagem, inicie suas instâncias em uma atualização posterior definindo a capacidade desejada.

## JSON
<a name="quickref-efs-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "This template creates an Amazon EFS file system and mount target and associates it with Amazon EC2 instances in an Auto Scaling group. **WARNING** This template creates Amazon EC2 instances and related resources. You will be billed for the AWS resources used if you create a stack from this template.",
  "Parameters": {
    "InstanceType" : {
      "Description" : "WebServer EC2 instance type",
      "Type" : "String",
      "Default" : "t2.small",
      "AllowedValues" : [ 
        "t1.micro", 
        "t2.nano", 
        "t2.micro", 
        "t2.small", 
        "t2.medium", 
        "t2.large", 
        "m1.small", 
        "m1.medium", 
        "m1.large", 
        "m1.xlarge", 
        "m2.xlarge", 
        "m2.2xlarge", 
        "m2.4xlarge", 
        "m3.medium", 
        "m3.large", 
        "m3.xlarge", 
        "m3.2xlarge", 
        "m4.large", 
        "m4.xlarge", 
        "m4.2xlarge", 
        "m4.4xlarge", 
        "m4.10xlarge", 
        "c1.medium", 
        "c1.xlarge", 
        "c3.large", 
        "c3.xlarge", 
        "c3.2xlarge", 
        "c3.4xlarge", 
        "c3.8xlarge", 
        "c4.large", 
        "c4.xlarge", 
        "c4.2xlarge", 
        "c4.4xlarge", 
        "c4.8xlarge", 
        "g2.2xlarge", 
        "g2.8xlarge", 
        "r3.large", 
        "r3.xlarge", 
        "r3.2xlarge", 
        "r3.4xlarge", 
        "r3.8xlarge", 
        "i2.xlarge", 
        "i2.2xlarge", 
        "i2.4xlarge", 
        "i2.8xlarge", 
        "d2.xlarge", 
        "d2.2xlarge", 
        "d2.4xlarge", 
        "d2.8xlarge", 
        "hi1.4xlarge", 
        "hs1.8xlarge", 
        "cr1.8xlarge", 
        "cc2.8xlarge", 
        "cg1.4xlarge"
      ],
      "ConstraintDescription" : "must be a valid EC2 instance type."
    },
    "KeyName": {
      "Type": "AWS::EC2::KeyPair::KeyName",
      "Description": "Name of an existing EC2 key pair to enable SSH access to the EC2 instances"
    },
    "AsgMaxSize": {
      "Type": "Number",
      "Description": "Maximum size and initial desired capacity of Auto Scaling Group",
      "Default": "2"
    },
    "SSHLocation" : {
      "Description" : "The IP address range that can be used to connect to the EC2 instances by using SSH",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "0.0.0.0/0",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "VolumeName" : {
      "Description" : "The name to be used for the EFS volume",
      "Type": "String",
      "MinLength": "1",
      "Default": "myEFSvolume"
    },
    "MountPoint" : {
      "Description" : "The Linux mount point for the EFS volume",
      "Type": "String",
      "MinLength": "1",
      "Default": "myEFSvolume"
    }
  },
  "Mappings" : {
    "AWSInstanceType2Arch" : {
      "t1.micro"    : { "Arch" : "HVM64"  },
      "t2.nano"     : { "Arch" : "HVM64"  },
      "t2.micro"    : { "Arch" : "HVM64"  },
      "t2.small"    : { "Arch" : "HVM64"  },
      "t2.medium"   : { "Arch" : "HVM64"  },
      "t2.large"    : { "Arch" : "HVM64"  },
      "m1.small"    : { "Arch" : "HVM64"  },
      "m1.medium"   : { "Arch" : "HVM64"  },
      "m1.large"    : { "Arch" : "HVM64"  },
      "m1.xlarge"   : { "Arch" : "HVM64"  },
      "m2.xlarge"   : { "Arch" : "HVM64"  },
      "m2.2xlarge"  : { "Arch" : "HVM64"  },
      "m2.4xlarge"  : { "Arch" : "HVM64"  },
      "m3.medium"   : { "Arch" : "HVM64"  },
      "m3.large"    : { "Arch" : "HVM64"  },
      "m3.xlarge"   : { "Arch" : "HVM64"  },
      "m3.2xlarge"  : { "Arch" : "HVM64"  },
      "m4.large"    : { "Arch" : "HVM64"  },
      "m4.xlarge"   : { "Arch" : "HVM64"  },
      "m4.2xlarge"  : { "Arch" : "HVM64"  },
      "m4.4xlarge"  : { "Arch" : "HVM64"  },
      "m4.10xlarge" : { "Arch" : "HVM64"  },
      "c1.medium"   : { "Arch" : "HVM64"  },
      "c1.xlarge"   : { "Arch" : "HVM64"  },
      "c3.large"    : { "Arch" : "HVM64"  },
      "c3.xlarge"   : { "Arch" : "HVM64"  },
      "c3.2xlarge"  : { "Arch" : "HVM64"  },
      "c3.4xlarge"  : { "Arch" : "HVM64"  },
      "c3.8xlarge"  : { "Arch" : "HVM64"  },
      "c4.large"    : { "Arch" : "HVM64"  },
      "c4.xlarge"   : { "Arch" : "HVM64"  },
      "c4.2xlarge"  : { "Arch" : "HVM64"  },
      "c4.4xlarge"  : { "Arch" : "HVM64"  },
      "c4.8xlarge"  : { "Arch" : "HVM64"  },
      "g2.2xlarge"  : { "Arch" : "HVMG2"  },
      "g2.8xlarge"  : { "Arch" : "HVMG2"  },
      "r3.large"    : { "Arch" : "HVM64"  },
      "r3.xlarge"   : { "Arch" : "HVM64"  },
      "r3.2xlarge"  : { "Arch" : "HVM64"  },
      "r3.4xlarge"  : { "Arch" : "HVM64"  },
      "r3.8xlarge"  : { "Arch" : "HVM64"  },
      "i2.xlarge"   : { "Arch" : "HVM64"  },
      "i2.2xlarge"  : { "Arch" : "HVM64"  },
      "i2.4xlarge"  : { "Arch" : "HVM64"  },
      "i2.8xlarge"  : { "Arch" : "HVM64"  },
      "d2.xlarge"   : { "Arch" : "HVM64"  },
      "d2.2xlarge"  : { "Arch" : "HVM64"  },
      "d2.4xlarge"  : { "Arch" : "HVM64"  },
      "d2.8xlarge"  : { "Arch" : "HVM64"  },
      "hi1.4xlarge" : { "Arch" : "HVM64"  },
      "hs1.8xlarge" : { "Arch" : "HVM64"  },
      "cr1.8xlarge" : { "Arch" : "HVM64"  },
      "cc2.8xlarge" : { "Arch" : "HVM64"  }
    },
    "AWSRegionArch2AMI" : {
      "us-east-1"        : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"},
      "us-west-2"        : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"},
      "us-west-1"        : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"},
      "eu-west-1"        : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"},
      "eu-west-2"        : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"},
      "eu-west-3"        : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"},
      "eu-central-1"     : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"},
      "ap-northeast-1"   : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"},
      "ap-northeast-2"   : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"},
      "ap-northeast-3"   : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"},
      "ap-southeast-1"   : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"},
      "ap-southeast-2"   : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"},
      "ap-south-1"       : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"},
      "us-east-2"        : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"},
      "ca-central-1"     : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"},
      "sa-east-1"        : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"},
      "cn-north-1"       : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"},
      "cn-northwest-1"   : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"}
    }
  },
  "Resources": {
    "CloudWatchPutMetricsRole" : {
      "Type"  : "AWS::IAM::Role",
      "Properties" : {
          "AssumeRolePolicyDocument" : {
              "Statement" : [ {
                  "Effect" : "Allow",
                  "Principal" : {
                      "Service" : [ "ec2.amazonaws.com" ]
                  },
                  "Action" : [ "sts:AssumeRole" ]
              } ]
          },
          "Path" : "/"
      }
    },
    "CloudWatchPutMetricsRolePolicy" : {
        "Type" : "AWS::IAM::Policy",
        "Properties" : {
            "PolicyName" : "CloudWatch_PutMetricData",
            "PolicyDocument" : {
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                {
                  "Sid": "CloudWatchPutMetricData",
                  "Effect": "Allow",
                  "Action": ["cloudwatch:PutMetricData"],
                  "Resource": ["*"]
                }
              ]
            },
            "Roles" : [ { "Ref" : "CloudWatchPutMetricsRole" } ]
        }
    },
    "CloudWatchPutMetricsInstanceProfile" : {
      "Type" : "AWS::IAM::InstanceProfile",
      "Properties" : {
        "Path" : "/",
        "Roles" : [ { "Ref" : "CloudWatchPutMetricsRole" } ]
      }
    },
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "EnableDnsSupport" : "true",
        "EnableDnsHostnames" : "true",
        "CidrBlock": "10.0.0.0/16",
        "Tags": [ {"Key": "Application", "Value": { "Ref": "AWS::StackId"} } ]
      }
    },
    "InternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway",
      "Properties" : {
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackName" } },
          { "Key" : "Network", "Value" : "Public" }
        ]
      }
    },
    "GatewayToInternet" : {
      "Type" : "AWS::EC2::VPCGatewayAttachment",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "InternetGatewayId" : { "Ref" : "InternetGateway" }
      }
    },
    "RouteTable":{
      "Type":"AWS::EC2::RouteTable",
      "Properties":{
        "VpcId": {"Ref":"VPC"}
      }
    },
    "SubnetRouteTableAssoc": {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "RouteTableId" : {"Ref":"RouteTable"},
        "SubnetId" : {"Ref":"Subnet"}
      }
    },
    "InternetGatewayRoute": {
        "Type":"AWS::EC2::Route",
        "Properties":{
            "DestinationCidrBlock":"0.0.0.0/0",
            "RouteTableId":{"Ref":"RouteTable"},
            "GatewayId":{"Ref":"InternetGateway"}
        }
    },
    "Subnet": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "CidrBlock": "10.0.0.0/24",
        "Tags": [ { "Key": "Application", "Value": { "Ref": "AWS::StackId" } } ]
      }
    },    
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "GroupDescription": "Enable SSH access via port 22",
        "SecurityGroupIngress": [
          { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } },
          { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" }
         ]
      }
    },
    "MountTargetSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "GroupDescription": "Security group for mount target",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 2049,
            "ToPort": 2049,
            "CidrIp": "0.0.0.0/0"
          }
        ]
      }
    },
    "FileSystem": {
      "Type": "AWS::EFS::FileSystem",
      "Properties": {
        "PerformanceMode": "generalPurpose",
        "FileSystemTags": [
          {
            "Key": "Name",
            "Value": { "Ref" : "VolumeName" }
          }
        ]
      }
    },
    "MountTarget": {
      "Type": "AWS::EFS::MountTarget",
      "Properties": {
        "FileSystemId": { "Ref": "FileSystem" },
        "SubnetId": { "Ref": "Subnet" },
        "SecurityGroups": [ { "Ref": "MountTargetSecurityGroup" } ]        
      }
    },
    "LaunchConfiguration": {
      "Type": "AWS::AutoScaling::LaunchConfiguration",
      "Metadata" : {
        "AWS::CloudFormation::Init" : {
          "configSets" : {
            "MountConfig" : [ "setup", "mount" ]
          },
          "setup" : {
            "packages" : {
              "yum" : {
                "nfs-utils" : []
              }
            },
            "files" : {
              "/home/ec2-user/post_nfsstat" : {
                "content" : { "Fn::Join" : [ "", [
                      "#!/bin/bash\n",
                      "\n",
                      "INPUT=\"$(cat)\"\n",
                      "CW_JSON_OPEN='{ \"Namespace\": \"EFS\", \"MetricData\": [ '\n",
                      "CW_JSON_CLOSE=' ] }'\n",
                      "CW_JSON_METRIC=''\n",
                      "METRIC_COUNTER=0\n",
                      "\n",
                      "for COL in 1 2 3 4 5 6; do\n",
                      "\n",
                      " COUNTER=0\n",
                      " METRIC_FIELD=$COL\n",
                      " DATA_FIELD=$(($COL+($COL-1)))\n",
                      "\n",
                      " while read line; do\n",
                      "   if [[ COUNTER -gt 0 ]]; then\n",
                      "\n",
                      "     LINE=`echo $line | tr -s ' ' `\n",
                      "     AWS_COMMAND=\"aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, "\"\n",
                      "     MOD=$(( $COUNTER % 2))\n",
                      "\n",
                      "     if [ $MOD -eq 1 ]; then\n",
                      "       METRIC_NAME=`echo $LINE | cut -d ' ' -f $METRIC_FIELD`\n",
                      "     else\n",
                      "       METRIC_VALUE=`echo $LINE | cut -d ' ' -f $DATA_FIELD`\n",
                      "     fi\n",
                      "\n",
                      "     if [[ -n \"$METRIC_NAME\" && -n \"$METRIC_VALUE\" ]]; then\n",
                      "       INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)\n",
                      "       CW_JSON_METRIC=\"$CW_JSON_METRIC { \\\"MetricName\\\": \\\"$METRIC_NAME\\\", \\\"Dimensions\\\": [{\\\"Name\\\": \\\"InstanceId\\\", \\\"Value\\\": \\\"$INSTANCE_ID\\\"} ], \\\"Value\\\": $METRIC_VALUE },\"\n",
                      "       unset METRIC_NAME\n",
                      "       unset METRIC_VALUE\n",
                      "\n",
                      "       METRIC_COUNTER=$((METRIC_COUNTER+1))\n",
                      "       if [ $METRIC_COUNTER -eq 20 ]; then\n",
                      "         # 20 is max metric collection size, so we have to submit here\n",
                      "         aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, " --cli-input-json \"`echo $CW_JSON_OPEN ${CW_JSON_METRIC%?} $CW_JSON_CLOSE`\"\n",
                      "\n",
                      "         # reset\n",
                      "         METRIC_COUNTER=0\n",
                      "         CW_JSON_METRIC=''\n",
                      "       fi\n",
                      "     fi  \n",
                      "\n",
                      "\n",
                      "\n",
                      "     COUNTER=$((COUNTER+1))\n",
                      "   fi\n",
                      "\n",
                      "   if [[ \"$line\" == \"Client nfs v4:\" ]]; then\n",
                      "     # the next line is the good stuff \n",
                      "     COUNTER=$((COUNTER+1))\n",
                      "   fi\n",
                      " done <<< \"$INPUT\"\n",
                      "done\n",
                      "\n",
                      "# submit whatever is left\n",
                      "aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, " --cli-input-json \"`echo $CW_JSON_OPEN ${CW_JSON_METRIC%?} $CW_JSON_CLOSE`\""
                    ] ] },
                "mode": "000755",
                "owner": "ec2-user",
                "group": "ec2-user"
              },
              "/home/ec2-user/crontab" : {
                "content" : { "Fn::Join" : [ "", [
                  "* * * * * /usr/sbin/nfsstat | /home/ec2-user/post_nfsstat\n"
                ] ] },
                "owner": "ec2-user",
                "group": "ec2-user"
              }
            },
            "commands" : {
              "01_createdir" : {
                "command" : {"Fn::Join" : [ "", [ "mkdir /", { "Ref" : "MountPoint" }]]}
              }
            }
          },
          "mount" : {
            "commands" : {
              "01_mount" : {
                "command" : { "Fn::Sub": "sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 ${FileSystem}.efs.${AWS::Region}.amazonaws.com:/ /${MountPoint}"}
              },
              "02_permissions" : {
                "command" : {"Fn::Join" : [ "", [ "chown ec2-user:ec2-user /", { "Ref" : "MountPoint" }]]}
              }
            }
          }
        }
      },
      "Properties": {
        "AssociatePublicIpAddress" : true,
        "ImageId": {
          "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, {
            "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ]
          } ]
        },
        "InstanceType": { "Ref": "InstanceType" },
        "KeyName": { "Ref": "KeyName" },
        "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ],
        "IamInstanceProfile" : { "Ref" : "CloudWatchPutMetricsInstanceProfile" },
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
             "#!/bin/bash -xe\n",
             "yum install -y aws-cfn-bootstrap\n",

             "/opt/aws/bin/cfn-init -v ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource LaunchConfiguration ",
             "         --configsets MountConfig ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n",

             "crontab /home/ec2-user/crontab\n",

             "/opt/aws/bin/cfn-signal -e $? ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource AutoScalingGroup ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n"
        ]]}}
      }
    },
    "AutoScalingGroup": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "DependsOn": ["MountTarget", "GatewayToInternet"],
      "CreationPolicy" : {
        "ResourceSignal" : {
          "Timeout" : "PT15M",
          "Count"   : { "Ref": "AsgMaxSize" }
        }
      },
      "Properties": {
        "VPCZoneIdentifier": [ { "Ref": "Subnet" } ],
        "LaunchConfigurationName": { "Ref": "LaunchConfiguration" },
        "MinSize": "1",
        "MaxSize": { "Ref": "AsgMaxSize" },
        "DesiredCapacity": { "Ref": "AsgMaxSize" },
        "Tags": [ {
          "Key": "Name",
          "Value": "EFS FileSystem Mounted Instance",
          "PropagateAtLaunch": "true"
        } ]
      }
    }
  },
  "Outputs" : {
    "MountTargetID" : {
      "Description" : "Mount target ID",
      "Value" :  { "Ref" : "MountTarget" }
    },
    "FileSystemID" : {
      "Description" : "File system ID",
      "Value" :  { "Ref" : "FileSystem" }
    }
  }
}
```

## YAML
<a name="quickref-efs-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: This template creates an Amazon EFS file system and mount target and
  associates it with Amazon EC2 instances in an Auto Scaling group. **WARNING** This
  template creates Amazon EC2 instances and related resources. You will be billed
  for the AWS resources used if you create a stack from this template.
Parameters:
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.small
    AllowedValues:
      - t1.micro
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - m1.small
      - m1.medium
      - m1.large
      - m1.xlarge
      - m2.xlarge
      - m2.2xlarge
      - m2.4xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - c1.medium
      - c1.xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - g2.2xlarge
      - g2.8xlarge
      - r3.large
      - r3.xlarge
      - r3.2xlarge
      - r3.4xlarge
      - r3.8xlarge
      - i2.xlarge
      - i2.2xlarge
      - i2.4xlarge
      - i2.8xlarge
      - d2.xlarge
      - d2.2xlarge
      - d2.4xlarge
      - d2.8xlarge
      - hi1.4xlarge
      - hs1.8xlarge
      - cr1.8xlarge
      - cc2.8xlarge
      - cg1.4xlarge
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Name of an existing EC2 key pair to enable SSH access to the ECS
      instances
  AsgMaxSize:
    Type: Number
    Description: Maximum size and initial desired capacity of Auto Scaling Group
    Default: '2'
  SSHLocation:
    Description: The IP address range that can be used to connect to the EC2 instances
      by using SSH
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  VolumeName:
    Description: The name to be used for the EFS volume
    Type: String
    MinLength: '1'
    Default: myEFSvolume
  MountPoint:
    Description: The Linux mount point for the EFS volume
    Type: String
    MinLength: '1'
    Default: myEFSvolume
Mappings:
  AWSInstanceType2Arch:
    t1.micro:
      Arch: HVM64
    t2.nano:
      Arch: HVM64
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    t2.large:
      Arch: HVM64
    m1.small:
      Arch: HVM64
    m1.medium:
      Arch: HVM64
    m1.large:
      Arch: HVM64
    m1.xlarge:
      Arch: HVM64
    m2.xlarge:
      Arch: HVM64
    m2.2xlarge:
      Arch: HVM64
    m2.4xlarge:
      Arch: HVM64
    m3.medium:
      Arch: HVM64
    m3.large:
      Arch: HVM64
    m3.xlarge:
      Arch: HVM64
    m3.2xlarge:
      Arch: HVM64
    m4.large:
      Arch: HVM64
    m4.xlarge:
      Arch: HVM64
    m4.2xlarge:
      Arch: HVM64
    m4.4xlarge:
      Arch: HVM64
    m4.10xlarge:
      Arch: HVM64
    c1.medium:
      Arch: HVM64
    c1.xlarge:
      Arch: HVM64
    c3.large:
      Arch: HVM64
    c3.xlarge:
      Arch: HVM64
    c3.2xlarge:
      Arch: HVM64
    c3.4xlarge:
      Arch: HVM64
    c3.8xlarge:
      Arch: HVM64
    c4.large:
      Arch: HVM64
    c4.xlarge:
      Arch: HVM64
    c4.2xlarge:
      Arch: HVM64
    c4.4xlarge:
      Arch: HVM64
    c4.8xlarge:
      Arch: HVM64
    g2.2xlarge:
      Arch: HVMG2
    g2.8xlarge:
      Arch: HVMG2
    r3.large:
      Arch: HVM64
    r3.xlarge:
      Arch: HVM64
    r3.2xlarge:
      Arch: HVM64
    r3.4xlarge:
      Arch: HVM64
    r3.8xlarge:
      Arch: HVM64
    i2.xlarge:
      Arch: HVM64
    i2.2xlarge:
      Arch: HVM64
    i2.4xlarge:
      Arch: HVM64
    i2.8xlarge:
      Arch: HVM64
    d2.xlarge:
      Arch: HVM64
    d2.2xlarge:
      Arch: HVM64
    d2.4xlarge:
      Arch: HVM64
    d2.8xlarge:
      Arch: HVM64
    hi1.4xlarge:
      Arch: HVM64
    hs1.8xlarge:
      Arch: HVM64
    cr1.8xlarge:
      Arch: HVM64
    cc2.8xlarge:
      Arch: HVM64
  AWSRegionArch2AMI:
    us-east-1:
      HVM64: ami-0ff8a91507f77f867
      HVMG2: ami-0a584ac55a7631c0c
    us-west-2:
      HVM64: ami-a0cfeed8
      HVMG2: ami-0e09505bc235aa82d
    us-west-1:
      HVM64: ami-0bdb828fd58c52235
      HVMG2: ami-066ee5fd4a9ef77f1
    eu-west-1:
      HVM64: ami-047bb4163c506cd98
      HVMG2: ami-0a7c483d527806435
    eu-west-2:
      HVM64: ami-f976839e
      HVMG2: NOT_SUPPORTED
    eu-west-3:
      HVM64: ami-0ebc281c20e89ba4b
      HVMG2: NOT_SUPPORTED
    eu-central-1:
      HVM64: ami-0233214e13e500f77
      HVMG2: ami-06223d46a6d0661c7
    ap-northeast-1:
      HVM64: ami-06cd52961ce9f0d85
      HVMG2: ami-053cdd503598e4a9d
    ap-northeast-2:
      HVM64: ami-0a10b2721688ce9d2
      HVMG2: NOT_SUPPORTED
    ap-northeast-3:
      HVM64: ami-0d98120a9fb693f07
      HVMG2: NOT_SUPPORTED
    ap-southeast-1:
      HVM64: ami-08569b978cc4dfa10
      HVMG2: ami-0be9df32ae9f92309
    ap-southeast-2:
      HVM64: ami-09b42976632b27e9b
      HVMG2: ami-0a9ce9fecc3d1daf8
    ap-south-1:
      HVM64: ami-0912f71e06545ad88
      HVMG2: ami-097b15e89dbdcfcf4
    us-east-2:
      HVM64: ami-0b59bfac6be064b78
      HVMG2: NOT_SUPPORTED
    ca-central-1:
      HVM64: ami-0b18956f
      HVMG2: NOT_SUPPORTED
    sa-east-1:
      HVM64: ami-07b14488da8ea02a0
      HVMG2: NOT_SUPPORTED
    cn-north-1:
      HVM64: ami-0a4eaf6c4454eda75
      HVMG2: NOT_SUPPORTED
    cn-northwest-1:
      HVM64: ami-6b6a7d09
      HVMG2: NOT_SUPPORTED
Resources:
  CloudWatchPutMetricsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  CloudWatchPutMetricsRolePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: CloudWatch_PutMetricData
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Sid: CloudWatchPutMetricData
          Effect: Allow
          Action:
          - cloudwatch:PutMetricData
          Resource:
          - "*"
      Roles:
      - Ref: CloudWatchPutMetricsRole
  CloudWatchPutMetricsInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - Ref: CloudWatchPutMetricsRole
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
      CidrBlock: 10.0.0.0/16
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackName
      - Key: Network
        Value: Public
  GatewayToInternet:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: InternetGateway
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC
  SubnetRouteTableAssoc:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId:
        Ref: RouteTable
      SubnetId:
        Ref: Subnet
  InternetGatewayRoute:
    Type: AWS::EC2::Route
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId:
        Ref: RouteTable
      GatewayId:
        Ref: InternetGateway
  Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      CidrBlock: 10.0.0.0/24
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp:
          Ref: SSHLocation
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  MountTargetSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Security group for mount target
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 2049
        ToPort: 2049
        CidrIp: 0.0.0.0/0
  FileSystem:
    Type: AWS::EFS::FileSystem
    Properties:
      PerformanceMode: generalPurpose
      FileSystemTags:
      - Key: Name
        Value:
          Ref: VolumeName
  MountTarget:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId:
        Ref: FileSystem
      SubnetId:
        Ref: Subnet
      SecurityGroups:
      - Ref: MountTargetSecurityGroup
  LaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Metadata:
      AWS::CloudFormation::Init:
        configSets:
          MountConfig:
          - setup
          - mount
        setup:
          packages:
            yum:
              nfs-utils: []
          files:
            "/home/ec2-user/post_nfsstat":
              content: !Sub |
                #!/bin/bash

                INPUT="$(cat)"
                CW_JSON_OPEN='{ "Namespace": "EFS", "MetricData": [ '
                CW_JSON_CLOSE=' ] }'
                CW_JSON_METRIC=''
                METRIC_COUNTER=0

                for COL in 1 2 3 4 5 6; do

                 COUNTER=0
                 METRIC_FIELD=$COL
                 DATA_FIELD=$(($COL+($COL-1)))

                 while read line; do
                   if [[ COUNTER -gt 0 ]]; then

                     LINE=`echo $line | tr -s ' ' `
                     AWS_COMMAND="aws cloudwatch put-metric-data --region ${AWS::Region}"
                     MOD=$(( $COUNTER % 2))

                     if [ $MOD -eq 1 ]; then
                       METRIC_NAME=`echo $LINE | cut -d ' ' -f $METRIC_FIELD`
                     else
                       METRIC_VALUE=`echo $LINE | cut -d ' ' -f $DATA_FIELD`
                     fi

                     if [[ -n "$METRIC_NAME" && -n "$METRIC_VALUE" ]]; then
                       INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
                       CW_JSON_METRIC="$CW_JSON_METRIC { \"MetricName\": \"$METRIC_NAME\", \"Dimensions\": [{\"Name\": \"InstanceId\", \"Value\": \"$INSTANCE_ID\"} ], \"Value\": $METRIC_VALUE },"
                       unset METRIC_NAME
                       unset METRIC_VALUE

                       METRIC_COUNTER=$((METRIC_COUNTER+1))
                       if [ $METRIC_COUNTER -eq 20 ]; then
                         # 20 is max metric collection size, so we have to submit here
                         aws cloudwatch put-metric-data --region ${AWS::Region} --cli-input-json "`echo $CW_JSON_OPEN ${!CW_JSON_METRIC%?} $CW_JSON_CLOSE`"

                         # reset
                         METRIC_COUNTER=0
                         CW_JSON_METRIC=''
                       fi
                     fi



                     COUNTER=$((COUNTER+1))
                   fi

                   if [[ "$line" == "Client nfs v4:" ]]; then
                     # the next line is the good stuff
                     COUNTER=$((COUNTER+1))
                   fi
                 done <<< "$INPUT"
                done

                # submit whatever is left
                aws cloudwatch put-metric-data --region ${AWS::Region} --cli-input-json "`echo $CW_JSON_OPEN ${!CW_JSON_METRIC%?} $CW_JSON_CLOSE`"
              mode: '000755'
              owner: ec2-user
              group: ec2-user
            "/home/ec2-user/crontab":
              content: "* * * * * /usr/sbin/nfsstat | /home/ec2-user/post_nfsstat\n"
              owner: ec2-user
              group: ec2-user
          commands:
            01_createdir:
              command: !Sub "mkdir /${MountPoint}"
        mount:
          commands:
            01_mount:
              command: !Sub >
                mount -t nfs4 -o nfsvers=4.1 ${FileSystem}.efs.${AWS::Region}.amazonaws.com:/ /${MountPoint}
            02_permissions:
              command: !Sub "chown ec2-user:ec2-user /${MountPoint}"
    Properties:
      AssociatePublicIpAddress: true
      ImageId:
        Fn::FindInMap:
        - AWSRegionArch2AMI
        - Ref: AWS::Region
        - Fn::FindInMap:
          - AWSInstanceType2Arch
          - Ref: InstanceType
          - Arch
      InstanceType:
        Ref: InstanceType
      KeyName:
        Ref: KeyName
      SecurityGroups:
      - Ref: InstanceSecurityGroup
      IamInstanceProfile:
        Ref: CloudWatchPutMetricsInstanceProfile
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfiguration --configsets MountConfig --region ${AWS::Region}
          crontab /home/ec2-user/crontab
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource AutoScalingGroup --region ${AWS::Region}
  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
    - MountTarget
    - GatewayToInternet
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
        Count:
          Ref: AsgMaxSize
    Properties:
      VPCZoneIdentifier:
      - Ref: Subnet
      LaunchConfigurationName:
        Ref: LaunchConfiguration
      MinSize: '1'
      MaxSize:
        Ref: AsgMaxSize
      DesiredCapacity:
        Ref: AsgMaxSize
      Tags:
      - Key: Name
        Value: EFS FileSystem Mounted Instance
        PropagateAtLaunch: 'true'
Outputs:
  MountTargetID:
    Description: Mount target ID
    Value:
      Ref: MountTarget
  FileSystemID:
    Description: File system ID
    Value:
      Ref: FileSystem
```

# Trechos de modelo do Elastic Beanstalk
<a name="quickref-elasticbeanstalk"></a>

Com o Elastic Beanstalk, você pode implantar e gerenciar aplicações rapidamente na AWS sem se preocupar com a infraestrutura na qual essas aplicações são executadas. O modelo de exemplo a seguir pode ajudar a descrever os recursos do Elastic Beanstalk em seu modelo do CloudFormation.

## PHP de exemplo do Elastic Beanstalk
<a name="quickref-elasticbeanstalk-sampleenv"></a>

O modelo de exemplo a seguir implementa um aplicativo Web de exemplo em PHP que é armazenado em um bucket do Amazon S3. O ambiente também é um ambiente de ajuste de escala automático com balanceamento de carga, com um mínimo de duas e um máximo de seis instâncias do Amazon EC2. Ele mostra um ambiente do Elastic Beanstalk que usa uma configuração de lançamento legada. Para obter informações sobre como usar um modelo de lançamento em vez disso, consulte [Modelos de lançamento](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-autoscaling-launch-templates.html) no *Guia do desenvolvedor do AWS Elastic Beanstalk*.

Substitua `solution-stack` por um nome de pilha de soluções (versão da plataforma). Para obter uma lista de pilhas de soluções disponíveis, use o comando **aws elasticbeanstalk list-available-solution-stacks** da AWS CLI.

### JSON
<a name="quickref-elasticbeanstalk-example-1.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "sampleApplication": {
            "Type": "AWS::ElasticBeanstalk::Application",
            "Properties": {
                "Description": "AWS Elastic Beanstalk Sample Application"
            }
        },
        "sampleApplicationVersion": {
            "Type": "AWS::ElasticBeanstalk::ApplicationVersion",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Application Version",
                "SourceBundle": {
                    "S3Bucket": {
                        "Fn::Sub": "elasticbeanstalk-samples-${AWS::Region}"
                    },
                    "S3Key": "php-newsample-app.zip"
                }
            }
        },
        "sampleConfigurationTemplate": {
            "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Configuration Template",
                "OptionSettings": [
                    {
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MinSize",
                        "Value": "2"
                    },
                    {
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MaxSize",
                        "Value": "6"
                    },
                    {
                        "Namespace": "aws:elasticbeanstalk:environment",
                        "OptionName": "EnvironmentType",
                        "Value": "LoadBalanced"
                    },
                    {
                        "Namespace": "aws:autoscaling:launchconfiguration",
                        "OptionName": "IamInstanceProfile",
                        "Value": {
                            "Ref": "MyInstanceProfile"
                        }
                    }
                ],
                "SolutionStackName": "solution-stack"
            }
        },
        "sampleEnvironment": {
            "Type": "AWS::ElasticBeanstalk::Environment",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Environment",
                "TemplateName": {
                    "Ref": "sampleConfigurationTemplate"
                },
                "VersionLabel": {
                    "Ref": "sampleApplicationVersion"
                }
            }
        },
        "MyInstanceRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Description": "Beanstalk EC2 role",
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier",
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker",
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier"
                ]
            }
        },
        "MyInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Roles": [
                    {
                        "Ref": "MyInstanceRole"
                    }
                ]
            }
        }
    }
}
```

### YAML
<a name="quickref-elasticbeanstalk-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  sampleApplication:
    Type: AWS::ElasticBeanstalk::Application
    Properties:
      Description: AWS Elastic Beanstalk Sample Application
  sampleApplicationVersion:
    Type: AWS::ElasticBeanstalk::ApplicationVersion
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Application Version
      SourceBundle:
        S3Bucket: !Sub "elasticbeanstalk-samples-${AWS::Region}"
        S3Key: php-newsample-app.zip
  sampleConfigurationTemplate:
    Type: AWS::ElasticBeanstalk::ConfigurationTemplate
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Configuration Template
      OptionSettings:
      - Namespace: aws:autoscaling:asg
        OptionName: MinSize
        Value: '2'
      - Namespace: aws:autoscaling:asg
        OptionName: MaxSize
        Value: '6'
      - Namespace: aws:elasticbeanstalk:environment
        OptionName: EnvironmentType
        Value: LoadBalanced
      - Namespace: aws:autoscaling:launchconfiguration
        OptionName: IamInstanceProfile
        Value: !Ref MyInstanceProfile        
      SolutionStackName: solution-stack
  sampleEnvironment:
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Environment
      TemplateName:
        Ref: sampleConfigurationTemplate
      VersionLabel:
        Ref: sampleApplicationVersion
  MyInstanceRole:
    Type: AWS::IAM::Role
    Properties: 
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Description: Beanstalk EC2 role
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier
  MyInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties: 
      Roles:
        - !Ref MyInstanceRole
```

# Trechos de modelo do Elastic Load Balancing
<a name="quickref-elb"></a>

Para criar um Application Load Balancer, um Network Load Balancer, um Gateway Load Balancer, use os tipos de recursos do V2, que começam com `AWS::ElasticLoadBalancingV2`. Para criar um Classic Load Balancer, use os tipos de recursos que começam com `AWS::ElasticLoadBalancing`.

**Topics**
+ [Recursos do ELBv2](#scenario-elbv2-load-balancer)
+ [Recursos do Classic Load Balancer](#scenario-elb-load-balancer)

## Recursos do ELBv2
<a name="scenario-elbv2-load-balancer"></a>

Este exemplo define um Application Load Balancer com um receptor HTTP e uma ação padrão que encaminha o tráfego para o grupo-alvo. O balanceador de carga usa as configurações padrão de verificação de integridade. O grupo-alvo tem duas instâncias do EC2 registradas. 

------
#### [ YAML ]

```
Resources:
  myLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup

  myHTTPlistener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref myLoadBalancer
      Protocol: HTTP
      Port: 80
      DefaultActions:
        - Type: "forward"
          TargetGroupArn: !Ref myTargetGroup
                        
  myTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: "my-target-group"
      Protocol: HTTP
      Port: 80
      TargetType: instance
      VpcId: !Ref myVPC
      Targets:
        - Id: !GetAtt Instance1.InstanceId
          Port: 80
        - Id: !GetAtt Instance2.InstanceId
          Port: 80
```

------
#### [ JSON ]

```
{
    "Resources": {
        "myLoadBalancer": {
            "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
            "Properties": {
                "Name": "my-alb",
                "Type": "application",
                "Scheme": "internal",
                "Subnets": [
                    {
                        "Ref": "subnet-AZ1"
                    },
                    {
                        "Ref": "subnet-AZ2"
                    }
                ],
                "SecurityGroups": [
                    {
                        "Ref": "mySecurityGroup"
                    }
                ]
            }
        },
        "myHTTPlistener": {
            "Type": "AWS::ElasticLoadBalancingV2::Listener",
            "Properties": {
                "LoadBalancerArn": {
                    "Ref": "myLoadBalancer"
                },
                "Protocol": "HTTP",
                "Port": 80,
                "DefaultActions": [
                    {
                        "Type": "forward",
                        "TargetGroupArn": {
                            "Ref": "myTargetGroup"
                        }
                    }
                ]
            }
        },
        "myTargetGroup": {
            "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
            "Properties": {
                "Name": "my-target-group",
                "Protocol": "HTTP",
                "Port": 80,
                "TargetType": "instance",
                "VpcId": {
                    "Ref": "myVPC"
                },
                "Targets": [
                    {
                        "Id": {
                            "Fn::GetAtt": [
                                "Instance1",
                                "InstanceId"
                            ]
                        },
                        "Port": 80
                    },
                    {
                        "Id": {
                            "Fn::GetAtt": [
                                "Instance2",
                                "InstanceId"
                            ]
                        },
                        "Port": 80
                    }
                ]
            }
        }
    }
}
```

------

## Recursos do Classic Load Balancer
<a name="scenario-elb-load-balancer"></a>

Este exemplo define um Classic Load Balancer com um receptor HTTP e nenhuma instância do EC2 registrada. O balanceador de carga usa as configurações padrão de verificação de integridade.

------
#### [ YAML ]

```
myLoadBalancer:
  Type: AWS::ElasticLoadBalancing::LoadBalancer
  Properties:
    AvailabilityZones:
    - "us-east-1a"
    Listeners:
    - LoadBalancerPort: '80'
      InstancePort: '80'
      Protocol: HTTP
```

------
#### [ JSON ]

```
"myLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
        "AvailabilityZones" : [ "us-east-1a" ],
        "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "80",
            "Protocol" : "HTTP"
        } ]
    }
}
```

------

Este exemplo define um Classic Load Balancer com um receptor HTTP, duas instâncias do EC2 registradas e configurações personalizadas de verificação de integridade.

------
#### [ YAML ]

```
myClassicLoadBalancer:
  Type: AWS::ElasticLoadBalancing::LoadBalancer
  Properties:
    AvailabilityZones:
    - "us-east-1a"
    Instances:
    - Ref: Instance1
    - Ref: Instance2
    Listeners:
    - LoadBalancerPort: '80'
      InstancePort: '80'
      Protocol: HTTP
    HealthCheck:
      Target: HTTP:80/
      HealthyThreshold: '3'
      UnhealthyThreshold: '5'
      Interval: '30'
      Timeout: '5'
```

------
#### [ JSON ]

```
"myClassicLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
        "AvailabilityZones" : [ "us-east-1a" ],
        "Instances" : [
            { "Ref" : "Instance1" },
            { "Ref" : "Instance2" }
        ],
        "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "80",
            "Protocol" : "HTTP"
        } ],

        "HealthCheck" : {
            "Target" : "HTTP:80/",
            "HealthyThreshold" : "3",
            "UnhealthyThreshold" : "5",
            "Interval" : "30",
            "Timeout" : "5"
        }
    }
}
```

------

# Trechos de modelo do AWS Identity and Access Management
<a name="quickref-iam"></a>

Esta seção contém trechos de modelos do AWS Identity and Access Management.

**Topics**
+ [Declarar um recurso de usuário do IAM](#scenario-iam-user)
+ [Declarar um recurso de chave de acesso do IAM](#scenario-iam-accesskey)
+ [Declarar um recurso de grupo do IAM](#scenario-iam-group)
+ [Adicionar usuários a um grupo](#scenario-iam-addusertogroup)
+ [Declarar uma política do IAM](#scenario-iam-policy)
+ [Declarar uma política do bucket do Amazon S3](#scenario-bucket-policy)
+ [Declarar uma política de tópico do Amazon SNS](#scenario-sns-policy)
+ [Declarar uma política do Amazon SQS](#scenario-sqs-policy)
+ [Exemplos de modelos de função do IAM](#scenarios-iamroles)

**Importante**  
Ao criar ou atualizar uma pilha usando um modelo que contém recursos do IAM, confirme o uso de recursos do IAM. Para obter mais informações, consulte [Confirmar recursos do IAM em modelos do CloudFormation](control-access-with-iam.md#using-iam-capabilities).

## Declarar um recurso de usuário do IAM
<a name="scenario-iam-user"></a>

Este trecho mostra como declarar um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) para criar um usuário do IAM. O usuário é declarado com o caminho (`"/"`) e um perfil de login com a senha (`myP@ssW0rd`).

O documento de política chamado `giveaccesstoqueueonly` oferece ao usuário permissão para executar todas as ações do Amazon SQS no `myqueue` do recurso de fila do Amazon SQS e nega o acesso a todos os outros recursos de fila do Amazon SQS. A função `Fn::GetAtt` obtém o atributo Arn do recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html) denominado `myqueue`.

O documento de política chamado `giveaccesstotopiconly` é adicionado ao usuário para que ele tenha permissão para executar todas as ações Amazon SNS no recurso `mytopic` do tópico do Amazon SNS e negar acesso a todos os outros recursos do Amazon SNS. A função `Ref`[AWS::SNS::Topic obtém o Nome de região da Amazon (ARN) do `mytopic` do recurso ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html).

### JSON
<a name="quickref-iam-example-1.json"></a>

```
"myuser" : {
   "Type" : "AWS::IAM::User",
   "Properties" : {
      "Path" : "/",
      "LoginProfile" : {
         "Password" : "myP@ssW0rd"
      },
      "Policies" : [ {
         "PolicyName" : "giveaccesstoqueueonly",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sqs:*" ],
               "Resource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            }, {
               "Effect" : "Deny",
               "Action" : [ "sqs:*" ],
               "NotResource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            }
         ] }
      }, {
         "PolicyName" : "giveaccesstotopiconly",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sns:*" ],
               "Resource" : [ { "Ref" : "mytopic" } ]
            }, {
               "Effect" : "Deny",
               "Action" : [ "sns:*" ],
               "NotResource" : [ { "Ref" : "mytopic" } ]
            } ]
         }
      } ]
   }
}
```

### YAML
<a name="quickref-iam-example-1.yaml"></a>

```
myuser:
  Type: AWS::IAM::User
  Properties:
    Path: "/"
    LoginProfile:
      Password: myP@ssW0rd
    Policies:
    - PolicyName: giveaccesstoqueueonly
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sqs:*
          Resource:
          - !GetAtt myqueue.Arn
        - Effect: Deny
          Action:
          - sqs:*
          NotResource:
          - !GetAtt myqueue.Arn
    - PolicyName: giveaccesstotopiconly
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sns:*
          Resource:
          - !Ref mytopic
        - Effect: Deny
          Action:
          - sns:*
          NotResource:
          - !Ref mytopic
```

## Declarar um recurso de chave de acesso do IAM
<a name="scenario-iam-accesskey"></a>

### 
<a name="quickref-iam-access-key"></a>

Este trecho mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-accesskey.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-accesskey.html). O recurso `myaccesskey` cria uma chave de acesso e a atribui para um usuário do IAM que é declarado como um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) no modelo.

#### JSON
<a name="quickref-iam-example-2.json"></a>

```
"myaccesskey" : {
   "Type" : "AWS::IAM::AccessKey",
   "Properties" : {
      "UserName" : { "Ref" : "myuser" }
   }
}
```

#### YAML
<a name="quickref-iam-example-2.yaml"></a>

```
myaccesskey:
  Type: AWS::IAM::AccessKey
  Properties:
    UserName:
      !Ref myuser
```

### 
<a name="quickref-iam-access-key-2"></a>

É possível obter a chave secreta para um recurso `AWS::IAM::AccessKey` usando a função `Fn::GetAtt`. Uma forma de recuperar a chave secreta é colocá-la em um valor `Output`. Você pode obter a chave de acesso usando a função `Ref`. As seguintes declarações do valor `Output` obtêm a chave de acesso e a chave secreta para `myaccesskey`.

#### JSON
<a name="quickref-iam-example-3.json"></a>

```
"AccessKeyformyaccesskey" : {
   "Value" : { "Ref" : "myaccesskey" }
},
"SecretKeyformyaccesskey" : {
   "Value" : {
      "Fn::GetAtt" : [ "myaccesskey", "SecretAccessKey" ]
   }
}
```

#### YAML
<a name="quickref-iam-example-3.yaml"></a>

```
AccessKeyformyaccesskey:
  Value:
    !Ref myaccesskey
SecretKeyformyaccesskey:
  Value: !GetAtt myaccesskey.SecretAccessKey
```

### 
<a name="quickref-iam-access-key-3"></a>

Você também pode passar a chave de acesso e a chave secreta da AWS para uma instância do Amazon EC2 ou um grupo do Auto Scaling definido no modelo. A declaração [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) a seguir usa a propriedade `UserData` para passar a chave de acesso e a chave secreta para o recurso `myaccesskey`.

#### JSON
<a name="quickref-iam-example-4.json"></a>

```
"myinstance" : {
   "Type" : "AWS::EC2::Instance",
   "Properties" : {
      "AvailabilityZone" : "us-east-1a",
      "ImageId" : "ami-0ff8a91507f77f867",
      "UserData" : {
         "Fn::Base64" : {
            "Fn::Join" : [
               "", [
                  "ACCESS_KEY=", {
                     "Ref" : "myaccesskey"
                  },
                  "&",
                  "SECRET_KEY=",
                  {
                     "Fn::GetAtt" : [
                        "myaccesskey",
                        "SecretAccessKey"
                     ]
                  }
               ]
            ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-4.yaml"></a>

```
myinstance:
  Type: AWS::EC2::Instance
  Properties:
    AvailabilityZone: "us-east-1a"
    ImageId: ami-0ff8a91507f77f867
    UserData:
      Fn::Base64: !Sub "ACCESS_KEY=${myaccesskey}&SECRET_KEY=${myaccesskey.SecretAccessKey}"
```

## Declarar um recurso de grupo do IAM
<a name="scenario-iam-group"></a>

Este trecho mostra um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html). O grupo tem um caminho (`"/myapplication/"`). O documento de política chamado `myapppolicy` é adicionado ao grupo para permitir que os usuários do grupo executem todas as ações do Amazon SQS no recurso de fila myqueue do Amazon SQS e negar todos os outros recursos do Amazon SQS, exceto `myqueue`.

Para atribuir uma política a um recurso, o IAM exige o Nome de recurso da Amazon (ARN). No trecho, a função `Fn::GetAtt` obtém o ARN da fila do recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html).

### JSON
<a name="quickref-iam-example-5.json"></a>

```
"mygroup" : {
   "Type" : "AWS::IAM::Group",
   "Properties" : {
      "Path" : "/myapplication/",
      "Policies" : [ {
         "PolicyName" : "myapppolicy",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sqs:*" ],
               "Resource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            },
            {
               "Effect" : "Deny",
               "Action" : [ "sqs:*" ],
               "NotResource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ]
            }
         ] }
      } ]
   }
}
```

### YAML
<a name="quickref-iam-example-5.yaml"></a>

```
mygroup:
  Type: AWS::IAM::Group
  Properties:
    Path: "/myapplication/"
    Policies:
    - PolicyName: myapppolicy
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sqs:*
          Resource: !GetAtt myqueue.Arn
        - Effect: Deny
          Action:
          - sqs:*
          NotResource: !GetAtt myqueue.Arn
```

## Adicionar usuários a um grupo
<a name="scenario-iam-addusertogroup"></a>

O recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-usertogroupaddition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-usertogroupaddition.html) adiciona os usuários a um grupo. No trecho a seguir, o recurso `addUserToGroup` adiciona os usuários a seguir a um grupo existente chamado `myexistinggroup2`: o usuário existente `existinguser1` e o usuário `myuser`, que é declarado como um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) no modelo.

### JSON
<a name="quickref-iam-example-6.json"></a>

```
"addUserToGroup" : {
   "Type" : "AWS::IAM::UserToGroupAddition",
   "Properties" : {
      "GroupName" : "myexistinggroup2",
      "Users" : [ "existinguser1", { "Ref" : "myuser" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-6.yaml"></a>

```
addUserToGroup:
  Type: AWS::IAM::UserToGroupAddition
  Properties:
    GroupName: myexistinggroup2
    Users:
    - existinguser1
    - !Ref myuser
```

## Declarar uma política do IAM
<a name="scenario-iam-policy"></a>

Este trecho mostra como criar uma política e aplicá-la a vários grupos usando um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-policy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-policy.html) chamado `mypolicy`. O recurso `mypolicy` contém uma propriedade `PolicyDocument` que permite as ações `GetObject`, `PutObject` e `PutObjectAcl` sobre os objetos no bucket do S3 representado pelo ARN `arn:aws:s3:::myAWSBucket`. O recurso `mypolicy` aplica a política para um grupo existente chamado `myexistinggroup1` e a um grupo `mygroup` que é declarado no modelo como um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html). Este exemplo mostra como aplicar uma política a um grupo usando a propriedade `Groups`; no entanto, você também pode usar a propriedade `Users` para adicionar um documento de política a uma lista de usuários.

### JSON
<a name="quickref-iam-example-7.json"></a>

```
"mypolicy" : {
   "Type" : "AWS::IAM::Policy",
   "Properties" : {
      "PolicyName" : "mygrouppolicy",
      "PolicyDocument" : {
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Effect" : "Allow",
            "Action" : [
               "s3:GetObject" , "s3:PutObject" , "s3:PutObjectAcl" ],
            "Resource" : "arn:aws:s3:::myAWSBucket/*"
         } ]
      },
      "Groups" : [ "myexistinggroup1", { "Ref" : "mygroup" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-7.yaml"></a>

```
mypolicy:
  Type: AWS::IAM::Policy
  Properties:
    PolicyName: mygrouppolicy
    PolicyDocument:
      Version: '2012-10-17'
      Statement:
      - Effect: Allow
        Action:
        - s3:GetObject
        - s3:PutObject
        - s3:PutObjectAcl
        Resource: arn:aws:s3:::myAWSBucket/*
    Groups:
    - myexistinggroup1
    - !Ref mygroup
```

## Declarar uma política do bucket do Amazon S3
<a name="scenario-bucket-policy"></a>

Este trecho mostra como criar uma política e aplicá-la a um bucket do Amazon S3 usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html). O recurso `mybucketpolicy` declara um documento de política que permite que o usuário `user1` do IAM execute a ação `GetObject` em todos os objetos no bucket do S3 aos quais essa política se aplica. No trecho, a função `Fn::GetAtt` obtém o Nome de região da Amazon (ARN) do recurso `user1`. O recurso `mybucketpolicy` aplica a política ao mybucket do recurso `AWS::S3::BucketPolicy`. A função `Ref` obtém o nome do bucket do recurso `mybucket`.

### JSON
<a name="quickref-iam-example-8.json"></a>

```
"mybucketpolicy" : {
   "Type" : "AWS::S3::BucketPolicy",
   "Properties" : {
      "PolicyDocument" : {
         "Id" : "MyPolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "ReadAccess",
            "Action" : [ "s3:GetObject" ],
            "Effect" : "Allow",
            "Resource" : { "Fn::Join" : [
                  "", [ "arn:aws:s3:::", { "Ref" : "mybucket" } , "/*" ]
               ] },
            "Principal" : {
               "AWS" : { "Fn::GetAtt" : [ "user1", "Arn" ] }
            }
         } ]
      },
      "Bucket" : { "Ref" : "mybucket" }
   }
}
```

### YAML
<a name="quickref-iam-example-8.yaml"></a>

```
mybucketpolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    PolicyDocument:
      Id: MyPolicy
      Version: '2012-10-17'
      Statement:
      - Sid: ReadAccess
        Action:
        - s3:GetObject
        Effect: Allow
        Resource: !Sub "arn:aws:s3:::${mybucket}/*"
        Principal:
          AWS: !GetAtt user1.Arn
    Bucket: !Ref mybucket
```

## Declarar uma política de tópico do Amazon SNS
<a name="scenario-sns-policy"></a>

Este trecho mostra como criar uma política e aplicá-la a um tópico do Amazon SNS usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topicpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topicpolicy.html). O recurso `mysnspolicy` contém uma propriedade `PolicyDocument` que permite que o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) denominado `myuser` execute a ação `Publish` em um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) denominado `mytopic`. No trecho, a função `Fn::GetAtt` obtém o Nome de região da Amazon (ARN) para o recurso `myuser` e a função `Ref` obtém o Nome de região da Amazon (ARN) para o recurso `mytopic`.

### JSON
<a name="quickref-iam-example-9.json"></a>

```
"mysnspolicy" : {
   "Type" : "AWS::SNS::TopicPolicy",
   "Properties" : {
      "PolicyDocument" :  {
         "Id" : "MyTopicPolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "My-statement-id",
            "Effect" : "Allow",
            "Principal" : {
               "AWS" : { "Fn::GetAtt" : [ "myuser", "Arn" ] }
            },
            "Action" : "sns:Publish",
            "Resource" : "*"
         } ]
      },
      "Topics" : [ { "Ref" : "mytopic" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-9.yaml"></a>

```
mysnspolicy:
  Type: AWS::SNS::TopicPolicy
  Properties:
    PolicyDocument:
      Id: MyTopicPolicy
      Version: '2012-10-17'
      Statement:
      - Sid: My-statement-id
        Effect: Allow
        Principal:
          AWS: !GetAtt myuser.Arn
        Action: sns:Publish
        Resource: "*"
    Topics:
    - !Ref mytopic
```

## Declarar uma política do Amazon SQS
<a name="scenario-sqs-policy"></a>

Este trecho mostra como criar uma política e aplicá-la a uma fila do Amazon SQS usando o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queuepolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queuepolicy.html). A propriedade `PolicyDocument` permite que o usuário `myapp` existente (especificado pelo seu ARN) execute a ação `SendMessage` em uma fila existente, que é especificada pelo seu URL, e um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html) denominado myqueue. A função [Ref](resources-section-structure.md#resource-properties-ref) obtém o URL para o recurso `myqueue`.

### JSON
<a name="quickref-iam-example-10.json"></a>

```
"mysqspolicy" : {
   "Type" : "AWS::SQS::QueuePolicy",
   "Properties" : {
      "PolicyDocument" : {
         "Id" : "MyQueuePolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "Allow-User-SendMessage",
            "Effect" : "Allow",
            "Principal" : {
               "AWS" : "arn:aws:iam::123456789012:user/myapp"
            },
            "Action" : [ "sqs:SendMessage" ],
            "Resource" : "*"
         } ]
      },
      "Queues" : [
         "https://sqs.us-east-2aws-region.amazonaws.com/123456789012/myexistingqueue",
         { "Ref" : "myqueue" }
      ]
   }
}
```

### YAML
<a name="quickref-iam-example-10.yaml"></a>

```
mysqspolicy:
  Type: AWS::SQS::QueuePolicy
  Properties:
    PolicyDocument:
      Id: MyQueuePolicy
      Version: '2012-10-17'
      Statement:
      - Sid: Allow-User-SendMessage
        Effect: Allow
        Principal:
          AWS: arn:aws:iam::123456789012:user/myapp
        Action:
        - sqs:SendMessage
        Resource: "*"
    Queues:
    - https://sqs.aws-region.amazonaws.com/123456789012/myexistingqueue
    - !Ref myqueue
```

## Exemplos de modelos de função do IAM
<a name="scenarios-iamroles"></a>

Esta seção fornece exemplos de modelos do CloudFormation para perfis do IAM para instâncias do EC2.

Para obter mais informações, consulte [Perfis do IAM para o Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) no *Guia do usuário do Amazon EC2*.

### Função do IAM com o EC2
<a name="scenario-iamrole-ec2"></a>

Neste exemplo, o perfil de instância é referenciado pela propriedade `IamInstanceProfile` da instância do EC2. Tanto a instância quanto a função de política referenciam a política [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html).

#### JSON
<a name="quickref-iam-example-11.json"></a>

```
{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {
      "myEC2Instance": {
         "Type": "AWS::EC2::Instance",
         "Version": "2009-05-15",
         "Properties": {
            "ImageId": "ami-0ff8a91507f77f867",
            "InstanceType": "m1.small",
            "Monitoring": "true",
            "DisableApiTermination": "false",
            "IamInstanceProfile": {
               "Ref": "RootInstanceProfile"
            }
         }
      },
      "RootRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
            "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "ec2.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            },
            "Path": "/"
         }
      },
      "RolePolicies": {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "PolicyName": "root",
            "PolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
               } ]
            },
            "Roles": [ { "Ref": "RootRole" } ]
         }
      },
      "RootInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
            "Path": "/",
            "Roles": [ { "Ref": "RootRole" } ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-11.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myEC2Instance:
    Type: AWS::EC2::Instance
    Version: '2009-05-15'
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: m1.small
      Monitoring: 'true'
      DisableApiTermination: 'false'
      IamInstanceProfile:
        !Ref RootInstanceProfile
  RootRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  RolePolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: root
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      Roles:
      - !Ref RootRole
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref RootRole
```

### Perfil do IAM com grupo do Auto Scaling
<a name="scenario-iamrole-asg"></a>

Neste exemplo, o perfil de instância é referenciado pela propriedade `IamInstanceProfile` de um grupo de uma configuração de execução do Amazon EC2 Auto Scaling.

#### JSON
<a name="quickref-iam-example-12.json"></a>

```
{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {
      "myLCOne": {
         "Type": "AWS::AutoScaling::LaunchConfiguration",
         "Version": "2009-05-15",
         "Properties": {
            "ImageId": "ami-0ff8a91507f77f867",
            "InstanceType": "m1.small",
            "InstanceMonitoring": "true",
            "IamInstanceProfile": { "Ref": "RootInstanceProfile" }
         }
      },
      "myASGrpOne": {
         "Type": "AWS::AutoScaling::AutoScalingGroup",
         "Version": "2009-05-15",
         "Properties": {
            "AvailabilityZones": [ "us-east-1a" ],
            "LaunchConfigurationName": { "Ref": "myLCOne" },
            "MinSize": "0",
            "MaxSize": "0",
            "HealthCheckType": "EC2",
            "HealthCheckGracePeriod": "120"
         }
      },
      "RootRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
            "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "ec2.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            },
            "Path": "/"
         }
      },
      "RolePolicies": {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "PolicyName": "root",
            "PolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
               } ]
            },
            "Roles": [ { "Ref": "RootRole" } ]
         }
      },
      "RootInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
            "Path": "/",
            "Roles": [ { "Ref": "RootRole" } ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-12.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myLCOne:
    Type: AWS::AutoScaling::LaunchConfiguration
    Version: '2009-05-15'
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: m1.small
      InstanceMonitoring: 'true'
      IamInstanceProfile:
        !Ref RootInstanceProfile
  myASGrpOne:
    Type: AWS::AutoScaling::AutoScalingGroup
    Version: '2009-05-15'
    Properties:
      AvailabilityZones:
      - "us-east-1a"
      LaunchConfigurationName:
        !Ref myLCOne
      MinSize: '0'
      MaxSize: '0'
      HealthCheckType: EC2
      HealthCheckGracePeriod: '120'
  RootRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  RolePolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: root
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      Roles:
      - !Ref RootRole
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref RootRole
```

# AWS LambdaModelo
<a name="quickref-lambda"></a>

O modelo a seguir usa uma função do AWS Lambda (Lambda) e um recurso personalizado para anexar um novo grupo de segurança a uma lista de grupos de segurança existentes. Essa função é útil quando você deseja criar uma lista de grupos de segurança dinamicamente, de maneira que a lista inclua grupos de segurança novos e existentes. Por exemplo, é possível passar uma lista de grupos de segurança existentes como um valor de parâmetro, anexar o novo valor à lista e associar todos os valores a uma instância EC2. Para obter mais informações sobre o tipo de recurso de função do Lambda, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html).

No exemplo, quando o CloudFormation cria o recurso personalizado `AllSecurityGroups`, ele invoca a função do Lambda `AppendItemToListFunction`. O CloudFormation passa a lista de grupos de segurança existentes e um novo grupo de segurança (`NewSecurityGroup`) para a função, que anexa o novo grupo de segurança à lista e retorna a lista modificada. O CloudFormation usa a lista modificada para associar todos os grupos de segurança ao recurso `MyEC2Instance`.

## JSON
<a name="quickref-lambda-example-1.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "ExistingSecurityGroups": {
            "Type": "List<AWS::EC2::SecurityGroup::Id>"
        },
        "ExistingVPC": {
            "Type": "AWS::EC2::VPC::Id",
            "Description": "The VPC ID that includes the security groups in the ExistingSecurityGroups parameter."
        },
        "InstanceType": {
            "Type": "String",
            "Default": "t2.micro",
            "AllowedValues": [
                "t2.micro",
                "t3.micro"
            ]
        }
    },

    "Resources": {
        "SecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Allow HTTP traffic to the host",
                "VpcId": {
                    "Ref": "ExistingVPC"
                },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    }
                ],
                "SecurityGroupEgress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "AllSecurityGroups": {
            "Type": "Custom::Split",
            "Properties": {
                "ServiceToken": {
                    "Fn::GetAtt": [
                        "AppendItemToListFunction",
                        "Arn"
                    ]
                },
                "List": {
                    "Ref": "ExistingSecurityGroups"
                },
                "AppendedItem": {
                    "Ref": "SecurityGroup"
                }
            }
        },
        "AppendItemToListFunction": {
            "Type": "AWS::Lambda::Function",
            "Properties": {
                "Handler": "index.handler",
                "Role": {
                    "Fn::GetAtt": [
                        "LambdaExecutionRole",
                        "Arn"
                    ]
                },
                "Code": {
                    "ZipFile": {
                        "Fn::Join": [
                            "",
                            [
                                "var response = require('cfn-response');",
                                "exports.handler = function(event, context) {",
                                "   var responseData = {Value: event.ResourceProperties.List};",
                                "   responseData.Value.push(event.ResourceProperties.AppendedItem);",
                                "   response.send(event, context, response.SUCCESS, responseData);",
                                "};"
                            ]
                        ]
                    }
                },
                "Runtime": "nodejs20.x"
            }
        },
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
                "SecurityGroupIds": {
                    "Fn::GetAtt": [
                        "AllSecurityGroups",
                        "Value"
                    ]
                },
                "InstanceType": {
                    "Ref": "InstanceType"
                }
            }
        },
        "LambdaExecutionRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17", 		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "lambda.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "root",
                        "PolicyDocument": {
                            "Version": "2012-10-17", 		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:*"
                                    ],
                                    "Resource": "arn:aws:logs:*:*:*"
                                }
                            ]
                        }
                    }
                ]
            }
        }
    },
    "Outputs": {
        "AllSecurityGroups": {
            "Description": "Security Groups that are associated with the EC2 instance",
            "Value": {
                "Fn::Join": [
                    ", ",
                    {
                        "Fn::GetAtt": [
                            "AllSecurityGroups",
                            "Value"
                        ]
                    }
                ]
            }
        }
    }
}
```

## YAML
<a name="quickref-lambda-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  ExistingSecurityGroups:
    Type: List<AWS::EC2::SecurityGroup::Id>
  ExistingVPC:
    Type: AWS::EC2::VPC::Id
    Description: The VPC ID that includes the security groups in the ExistingSecurityGroups parameter.
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t3.micro
Resources:
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP traffic to the host
      VpcId: !Ref ExistingVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
  AllSecurityGroups:
    Type: Custom::Split
    Properties:
      ServiceToken: !GetAtt AppendItemToListFunction.Arn
      List: !Ref ExistingSecurityGroups
      AppendedItem: !Ref SecurityGroup
  AppendItemToListFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile: !Join
          - ''
          - - var response = require('cfn-response');
            - exports.handler = function(event, context) {
            - '   var responseData = {Value: event.ResourceProperties.List};'
            - '   responseData.Value.push(event.ResourceProperties.AppendedItem);'
            - '   response.send(event, context, response.SUCCESS, responseData);'
            - '};'
      Runtime: nodejs20.x
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      SecurityGroupIds: !GetAtt AllSecurityGroups.Value
      InstanceType: !Ref InstanceType
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17' 		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: '2012-10-17' 		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - logs:*
                Resource: arn:aws:logs:*:*:*
Outputs:
  AllSecurityGroups:
    Description: Security Groups that are associated with the EC2 instance
    Value: !Join
      - ', '
      - !GetAtt AllSecurityGroups.Value
```

# Trechos de modelo do Amazon Redshift
<a name="quickref-redshift"></a>

O Amazon Redshift é um serviço de data warehouse em escala de petabytes totalmente gerenciado na nuvem. Você pode usar o CloudFormation para provisionar e gerenciar clusters do Amazon Redshift.

## Cluster do Amazon Redshift
<a name="quickref-redshift-samplecluster"></a>

O modelo de amostra a seguir cria um cluster do Amazon Redshift de acordo com os valores de parâmetro que são especificadas quando a pilha é criada. O parameter group de cluster associado ao cluster do Amazon Redshift permite o registro de atividades do usuário. O modelo também executa o cluster do Amazon Redshift em uma Amazon VPC, que é definida no modelo. A VPC inclui um gateway de Internet que permite acessar os clusters do Amazon Redshift da Internet. No entanto, a comunicação entre o cluster e o gateway de Internet também deve ser ativada, o que é feito pela entrada na tabela de roteamento.

**nota**  
O modelo inclui a condição `IsMultiNodeCluster` para que o parâmetro `NumberOfNodes` seja declarado somente quando o valor do parâmetro `ClusterType` estiver definido como `multi-node`.

O exemplo define os parâmetros `MysqlRootPassword` com a propriedade `NoEcho` definida como `true`. Se você definir o atributo `NoEcho` como `true`, o CloudFormation retornará o valor do parâmetro mascarado como asteriscos (\$1\$1\$1\$1\$1) para qualquer chamada que descreva a pilha ou os eventos de pilha, exceto informações armazenadas nos locais especificados abaixo.

**Importante**  
O uso do atributo `NoEcho` não mascara informações armazenadas no seguinte:  
A seção de modelo de `Metadata`. O CloudFormation não transforma, modifica nem edita nenhuma informação incluída na seção `Metadata`. Para obter mais informações, consulte [Metadados](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
A seção de modelo de `Outputs`. Para obter mais informações, consulte [Saídas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
O atributo `Metadata` de uma definição de recurso. Para obter mais informações, consulte o atributo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
É altamente recomendável não usar esses mecanismos para incluir informações confidenciais, como senhas ou segredos.

**Importante**  
Em vez de incorporar informações confidenciais diretamente em modelos do CloudFormation, recomendamos usar os parâmetros dinâmicos no modelo da pilha para fazer referência a informações confidenciais que são armazenadas e gerenciadas de forma externa ao CloudFormation, como no AWS Systems Manager Parameter Store ou no AWS Secrets Manager.  
Para obter mais informações, consulte a prática recomendada [Não incorporar credenciais nos seus modelos](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).

### JSON
<a name="quickref-redshift-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" : {
    "DatabaseName" : {
      "Description" : "The name of the first database to be created when the cluster is created",
      "Type" : "String",
      "Default" : "dev",
      "AllowedPattern" : "([a-z]|[0-9])+"
    },
    "ClusterType" : {
      "Description" : "The type of cluster",
      "Type" : "String",
      "Default" : "single-node",
      "AllowedValues" : [ "single-node", "multi-node" ]
    },
    "NumberOfNodes" : {
      "Description" : "The number of compute nodes in the cluster. For multi-node clusters, the NumberOfNodes parameter must be greater than 1",
      "Type" : "Number",
      "Default" : "1"
    },
    "NodeType" : {
      "Description" : "The type of node to be provisioned",
      "Type" : "String",
      "Default" : "ds2.xlarge",
      "AllowedValues" : [ "ds2.xlarge", "ds2.8xlarge", "dc1.large", "dc1.8xlarge" ]
    }, 
    "MasterUsername" : {
      "Description" : "The user name that is associated with the master user account for the cluster that is being created",
      "Type" : "String",
      "Default" : "defaultuser",
      "AllowedPattern" : "([a-z])([a-z]|[0-9])*"
    },
    "MasterUserPassword" :  {
      "Description" : "The password that is associated with the master user account for the cluster that is being created.",
      "Type" : "String",
      "NoEcho" : "true"
    },
    "InboundTraffic" : {
      "Description" : "Allow inbound traffic to the cluster from this CIDR range.",
      "Type" : "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default" : "0.0.0.0/0",
      "AllowedPattern" : "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription" : "must be a valid CIDR range of the form x.x.x.x/x."
    },
    "PortNumber" : {
      "Description" : "The port number on which the cluster accepts incoming connections.",
      "Type" : "Number",
      "Default" : "5439"
    }
  },
  "Conditions" : {
    "IsMultiNodeCluster" : {
      "Fn::Equals" : [{ "Ref" : "ClusterType" }, "multi-node" ]        
    }
  },
  "Resources" : {
    "RedshiftCluster" : {
      "Type" : "AWS::Redshift::Cluster",
      "DependsOn" : "AttachGateway",
      "Properties" : {
        "ClusterType" : { "Ref" : "ClusterType" },
        "NumberOfNodes" : { "Fn::If" : [ "IsMultiNodeCluster",  { "Ref" : "NumberOfNodes" }, { "Ref" : "AWS::NoValue" }]},
        "NodeType" : { "Ref" : "NodeType" },
        "DBName" : { "Ref" : "DatabaseName" },
        "MasterUsername" : { "Ref" : "MasterUsername" },
        "MasterUserPassword" : { "Ref" : "MasterUserPassword" },               
        "ClusterParameterGroupName" : { "Ref" : "RedshiftClusterParameterGroup" },
        "VpcSecurityGroupIds" : [ { "Ref" : "SecurityGroup" } ],
        "ClusterSubnetGroupName" : { "Ref" : "RedshiftClusterSubnetGroup" },
        "PubliclyAccessible" : "true",
        "Port" : { "Ref" : "PortNumber" }
      }
    },
    "RedshiftClusterParameterGroup" : {
      "Type" : "AWS::Redshift::ClusterParameterGroup",
      "Properties" : {
        "Description" : "Cluster parameter group",
        "ParameterGroupFamily" : "redshift-1.0",
        "Parameters" : [{
          "ParameterName" : "enable_user_activity_logging",
          "ParameterValue" : "true"
        }]
      }
    },
    "RedshiftClusterSubnetGroup" : {
      "Type" : "AWS::Redshift::ClusterSubnetGroup",
      "Properties" : {
        "Description" : "Cluster subnet group",
        "SubnetIds" : [ { "Ref" : "PublicSubnet" } ]
      }
    },
    "VPC" : {
      "Type" : "AWS::EC2::VPC",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/16"
      }
    },
    "PublicSubnet" : {
      "Type" : "AWS::EC2::Subnet",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/24",
        "VpcId" : { "Ref" : "VPC" }
      }
    },
    "SecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Security group",
        "SecurityGroupIngress" : [ {
          "CidrIp" : { "Ref": "InboundTraffic" },
          "FromPort" : { "Ref" : "PortNumber" },
          "ToPort" : { "Ref" : "PortNumber" },
          "IpProtocol" : "tcp"
        } ],
        "VpcId" : { "Ref" : "VPC" }
      }
    },
    "myInternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway"
    },
    "AttachGateway" : {
      "Type" : "AWS::EC2::VPCGatewayAttachment",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "InternetGatewayId" : { "Ref" : "myInternetGateway" }
      }
    },
    "PublicRouteTable" : {
      "Type" : "AWS::EC2::RouteTable",
      "Properties" : {
        "VpcId" : {
          "Ref" : "VPC"
        }
      }
    },
    "PublicRoute" : {
      "Type" : "AWS::EC2::Route",
      "DependsOn" : "AttachGateway",
      "Properties"  : {
        "RouteTableId" : {
          "Ref" : "PublicRouteTable"
        },
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : {
          "Ref" : "myInternetGateway"
        }
      }
    },
    "PublicSubnetRouteTableAssociation" : {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "SubnetId" : {
          "Ref" : "PublicSubnet"
        },
        "RouteTableId" : {
          "Ref" : "PublicRouteTable"
        }
      }
    }
  },
  "Outputs" : {
    "ClusterEndpoint" : {
      "Description" : "Cluster endpoint",
      "Value" : { "Fn::Join" : [ ":", [ { "Fn::GetAtt" : [ "RedshiftCluster", "Endpoint.Address" ] }, { "Fn::GetAtt" : [ "RedshiftCluster", "Endpoint.Port" ] } ] ] }
    },
    "ClusterName" : {
      "Description" : "Name of cluster",
      "Value" : { "Ref" : "RedshiftCluster" }
    },
    "ParameterGroupName" : {
      "Description" : "Name of parameter group",
      "Value" : { "Ref" : "RedshiftClusterParameterGroup" }
    },
    "RedshiftClusterSubnetGroupName" : {
      "Description" : "Name of cluster subnet group",
      "Value" : { "Ref" : "RedshiftClusterSubnetGroup" }
    },
    "RedshiftClusterSecurityGroupName" : {
      "Description" : "Name of cluster security group",
      "Value" : { "Ref" : "SecurityGroup" }
    }
  }
}
```

### YAML
<a name="quickref-redshift-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  DatabaseName:
    Description: The name of the first database to be created when the cluster is
      created
    Type: String
    Default: dev
    AllowedPattern: "([a-z]|[0-9])+"
  ClusterType:
    Description: The type of cluster
    Type: String
    Default: single-node
    AllowedValues:
    - single-node
    - multi-node
  NumberOfNodes:
    Description: The number of compute nodes in the cluster. For multi-node clusters,
      the NumberOfNodes parameter must be greater than 1
    Type: Number
    Default: '1'
  NodeType:
    Description: The type of node to be provisioned
    Type: String
    Default: ds2.xlarge
    AllowedValues:
    - ds2.xlarge
    - ds2.8xlarge
    - dc1.large
    - dc1.8xlarge
  MasterUsername:
    Description: The user name that is associated with the master user account for
      the cluster that is being created
    Type: String
    Default: defaultuser
    AllowedPattern: "([a-z])([a-z]|[0-9])*"
  MasterUserPassword:
    Description: The password that is associated with the master user account for
      the cluster that is being created.
    Type: String
    NoEcho: 'true'
  InboundTraffic:
    Description: Allow inbound traffic to the cluster from this CIDR range.
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid CIDR range of the form x.x.x.x/x.
  PortNumber:
    Description: The port number on which the cluster accepts incoming connections.
    Type: Number
    Default: '5439'
Conditions:
  IsMultiNodeCluster:
    Fn::Equals:
    - Ref: ClusterType
    - multi-node
Resources:
  RedshiftCluster:
    Type: AWS::Redshift::Cluster
    DependsOn: AttachGateway
    Properties:
      ClusterType:
        Ref: ClusterType
      NumberOfNodes:
        Fn::If:
        - IsMultiNodeCluster
        - Ref: NumberOfNodes
        - Ref: AWS::NoValue
      NodeType:
        Ref: NodeType
      DBName:
        Ref: DatabaseName
      MasterUsername:
        Ref: MasterUsername
      MasterUserPassword:
        Ref: MasterUserPassword
      ClusterParameterGroupName:
        Ref: RedshiftClusterParameterGroup
      VpcSecurityGroupIds:
      - Ref: SecurityGroup
      ClusterSubnetGroupName:
        Ref: RedshiftClusterSubnetGroup
      PubliclyAccessible: 'true'
      Port:
        Ref: PortNumber
  RedshiftClusterParameterGroup:
    Type: AWS::Redshift::ClusterParameterGroup
    Properties:
      Description: Cluster parameter group
      ParameterGroupFamily: redshift-1.0
      Parameters:
      - ParameterName: enable_user_activity_logging
        ParameterValue: 'true'
  RedshiftClusterSubnetGroup:
    Type: AWS::Redshift::ClusterSubnetGroup
    Properties:
      Description: Cluster subnet group
      SubnetIds:
      - Ref: PublicSubnet
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId:
        Ref: VPC
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group
      SecurityGroupIngress:
      - CidrIp:
          Ref: InboundTraffic
        FromPort:
          Ref: PortNumber
        ToPort:
          Ref: PortNumber
        IpProtocol: tcp
      VpcId:
        Ref: VPC
  myInternetGateway:
    Type: AWS::EC2::InternetGateway
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: myInternetGateway
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId:
        Ref: PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: myInternetGateway
  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: PublicSubnet
      RouteTableId:
        Ref: PublicRouteTable
Outputs:
  ClusterEndpoint:
    Description: Cluster endpoint
    Value: !Sub "${RedshiftCluster.Endpoint.Address}:${RedshiftCluster.Endpoint.Port}"
  ClusterName:
    Description: Name of cluster
    Value:
      Ref: RedshiftCluster
  ParameterGroupName:
    Description: Name of parameter group
    Value:
      Ref: RedshiftClusterParameterGroup
  RedshiftClusterSubnetGroupName:
    Description: Name of cluster subnet group
    Value:
      Ref: RedshiftClusterSubnetGroup
  RedshiftClusterSecurityGroupName:
    Description: Name of cluster security group
    Value:
      Ref: SecurityGroup
```

## Consulte também
<a name="w2aac11c41c72b7"></a>

[AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html)

# Trechos de modelo do Amazon RDS
<a name="quickref-rds"></a>

**Topics**
+ [Recurso de instância de banco de dados do Amazon RDS](#scenario-rds-instance)
+ [Recurso de instância de banco de dados do Oracle do Amazon RDS](#scenario-rds-oracleinstance)
+ [Recurso DBSecurityGroup do Amazon RDS para intervalo de CIDR](#scenario-rds-security-group-cidr)
+ [DBSecurityGroup do Amazon RDS com um grupo de segurança do Amazon EC2](#scenario-rds-security-group-ec2)
+ [Security groups da VPC múltiplos](#scenario-multiple-vpc-security-groups)
+ [Instância de banco de dados do Amazon RDS em um grupo de segurança da VPC](#w2aac11c41c76c15)

## Recurso de instância de banco de dados do Amazon RDS
<a name="scenario-rds-instance"></a>

Este exemplo mostra um recurso de instância de banco de dados do Amazon RDS especificando uma senha de usuário mestre gerenciada. Para obter mais informações, consulte [Gerenciamento de senhas com o AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) no *Guia do usuário do Amazon RDS* e [Gerenciamento de senhas com o AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html) no *Guia do usuário do Aurora*. Como a propriedade `EngineVersion` opcional não é especificada, a versão do mecanismo padrão é usada para essa instância de banco de dados. Para obter detalhes sobre a versão do mecanismo padrão e outras configurações padrão, consulte [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html). A propriedade `DBSecurityGroups` autoriza a entrada na rede para os recursos `AWS::RDS::DBSecurityGroup` chamados `MyDbSecurityByEC2SecurityGroup` e MyDbSecurityByCIDRIPGroup. Para obter detalhes, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html). O recurso de instância de banco de dados também tem um atributo `DeletionPolicy` definido como `Snapshot`. Com a `DeletionPolicy` do `Snapshot` definida, o CloudFormation capturará um snapshot dessa instância de banco de dados antes de excluí-lo durante a exclusão da pilha.

### JSON
<a name="quickref-rds-example-1.json"></a>

```
 1. "MyDB" : {
 2.  "Type" : "AWS::RDS::DBInstance",
 3.  "Properties" : {
 4.      "DBSecurityGroups" : [
 5.         {"Ref" : "MyDbSecurityByEC2SecurityGroup"}, {"Ref" : "MyDbSecurityByCIDRIPGroup"} ],
 6.      "AllocatedStorage" : "5",
 7.      "DBInstanceClass" : "db.t2.small",
 8.      "Engine" : "MySQL",
 9.      "MasterUsername" : "MyName",
10.      "ManageMasterUserPassword" : true,
11.      "MasterUserSecret" : {
12.         "KmsKeyId" : {"Ref" : "KMSKey"}
13.      }
14.  },
15.  "DeletionPolicy" : "Snapshot"
16. }
```

### YAML
<a name="quickref-rds-example-1.yaml"></a>

```
 1. MyDB:
 2.   Type: AWS::RDS::DBInstance
 3.   Properties:
 4.     DBSecurityGroups:
 5.     - Ref: MyDbSecurityByEC2SecurityGroup
 6.     - Ref: MyDbSecurityByCIDRIPGroup
 7.     AllocatedStorage: '5'
 8.     DBInstanceClass: db.t2.small
 9.     Engine: MySQL
10.     MasterUsername: MyName
11.     ManageMasterUserPassword: true
12.     MasterUserSecret:
13.       KmsKeyId: !Ref KMSKey
14.   DeletionPolicy: Snapshot
```

## Recurso de instância de banco de dados do Oracle do Amazon RDS
<a name="scenario-rds-oracleinstance"></a>

Este exemplo cria um recurso de instância Oracle Database DB com uma senha de usuário mestre gerenciada. Para obter mais informações, consulte [Gerenciamento de senhas com o AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) no *Guia do usuário do Amazon RDS*. O exemplo especifica o `Engine` como `oracle-ee` com um modelo de traga sua própria licença. Para obter detalhes sobre as configurações para instâncias de banco de dados do Oracle Database, consulte [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html). A propriedade DBSecurityGroups autoriza o ingresso na rede dos recursos `AWS::RDS::DBSecurityGroup` chamados MyDbSecurityByEC2SecurityGroup e MyDbSecurityByCIDRIPGroup. Para obter detalhes, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html). O recurso de instância de banco de dados também tem um atributo `DeletionPolicy` definido como `Snapshot`. Com a `DeletionPolicy` do `Snapshot` definida, o CloudFormation capturará um snapshot dessa instância de banco de dados antes de excluí-lo durante a exclusão da pilha.

### JSON
<a name="quickref-rds-example-2.json"></a>

```
 1. "MyDB" : {
 2.  "Type" : "AWS::RDS::DBInstance",
 3.  "Properties" : {
 4.      "DBSecurityGroups" : [
 5.         {"Ref" : "MyDbSecurityByEC2SecurityGroup"}, {"Ref" : "MyDbSecurityByCIDRIPGroup"} ],
 6.      "AllocatedStorage" : "5",
 7.      "DBInstanceClass" : "db.t2.small",
 8.      "Engine" : "oracle-ee",
 9.      "LicenseModel" : "bring-your-own-license",
10.      "MasterUsername" : "master",
11.      "ManageMasterUserPassword" : true,
12.      "MasterUserSecret" : {
13.         "KmsKeyId" : {"Ref" : "KMSKey"}
14.      }
15.  },
16.  "DeletionPolicy" : "Snapshot"
17. }
```

### YAML
<a name="quickref-rds-example-2.yaml"></a>

```
 1. MyDB:
 2.   Type: AWS::RDS::DBInstance
 3.   Properties:
 4.     DBSecurityGroups:
 5.     - Ref: MyDbSecurityByEC2SecurityGroup
 6.     - Ref: MyDbSecurityByCIDRIPGroup
 7.     AllocatedStorage: '5'
 8.     DBInstanceClass: db.t2.small
 9.     Engine: oracle-ee
10.     LicenseModel: bring-your-own-license
11.     MasterUsername: master
12.     ManageMasterUserPassword: true
13.     MasterUserSecret:
14.       KmsKeyId: !Ref KMSKey
15.   DeletionPolicy: Snapshot
```

## Recurso DBSecurityGroup do Amazon RDS para intervalo de CIDR
<a name="scenario-rds-security-group-cidr"></a>

Este exemplo mostra um recurso `DBSecurityGroup` do Amazon RDS com uma autorização de entrada para o intervalo de CIDR especificado no formato `ddd.ddd.ddd.ddd/dd`. Para obter detalhes, consulte [AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) e [Ingress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-rds-dbsecuritygroup-ingress.html).

### JSON
<a name="quickref-rds-example-3.json"></a>

```
1. "MyDbSecurityByCIDRIPGroup" : {
2.  "Type" : "AWS::RDS::DBSecurityGroup",
3.  "Properties" : {
4.      "GroupDescription" : "Ingress for CIDRIP",
5.      "DBSecurityGroupIngress" : {
6.          "CIDRIP" : "192.168.0.0/32"
7.      }
8.  }
9. }
```

### YAML
<a name="quickref-rds-example-3.yaml"></a>

```
1. MyDbSecurityByCIDRIPGroup:
2.   Type: AWS::RDS::DBSecurityGroup
3.   Properties:
4.     GroupDescription: Ingress for CIDRIP
5.     DBSecurityGroupIngress:
6.       CIDRIP: "192.168.0.0/32"
```

## DBSecurityGroup do Amazon RDS com um grupo de segurança do Amazon EC2
<a name="scenario-rds-security-group-ec2"></a>

Este exemplo mostra um recurso [AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) com autorização de entrada de um grupo de segurança do Amazon EC2 referenciado por `MyEc2SecurityGroup`.

Para fazer isso, defina um grupo de segurança do EC2 e, depois, use a função intrínseca `Ref` para fazer referência ao grupo de segurança do EC2 no `DBSecurityGroup`.

### JSON
<a name="quickref-rds-example-4.json"></a>

```
"DBInstance" : {
   "Type": "AWS::RDS::DBInstance",
   "Properties": {
      "DBName"            : { "Ref" : "DBName" },
      "Engine"            : "MySQL",
      "MasterUsername"    : { "Ref" : "DBUsername" },
      "DBInstanceClass"   : { "Ref" : "DBClass" },
      "DBSecurityGroups"  : [ { "Ref" : "DBSecurityGroup" } ],
      "AllocatedStorage"  : { "Ref" : "DBAllocatedStorage" },
      "MasterUserPassword": { "Ref" : "DBPassword" }
   }
},

"DBSecurityGroup": {
   "Type": "AWS::RDS::DBSecurityGroup",
   "Properties": {
      "DBSecurityGroupIngress": {
         "EC2SecurityGroupName": {
            "Fn::GetAtt": ["WebServerSecurityGroup", "GroupName"]
         }
      },
      "GroupDescription" : "Frontend Access"
   }
},

"WebServerSecurityGroup" : {
   "Type" : "AWS::EC2::SecurityGroup",
   "Properties" : {
      "GroupDescription" : "Enable HTTP access via port 80 and SSH access",
      "SecurityGroupIngress" : [
         {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0"},
         {"IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : "0.0.0.0/0"}
      ]
   }
}
```

### YAML
<a name="quickref-rds-example-4.yaml"></a>

Este exemplo é extraído do seguinte exemplo completo: [Drupal\$1Single\$1Instance\$1With\$1RDS.template](https://s3.amazonaws.com/cloudformation-templates-us-east-1/Drupal_Single_Instance_With_RDS.template)

```
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBName:
      Ref: DBName
    Engine: MySQL
    MasterUsername:
      Ref: DBUsername
    DBInstanceClass:
      Ref: DBClass
    DBSecurityGroups:
    - Ref: DBSecurityGroup
    AllocatedStorage:
      Ref: DBAllocatedStorage
    MasterUserPassword:
      Ref: DBPassword
DBSecurityGroup:
  Type: AWS::RDS::DBSecurityGroup
  Properties:
    DBSecurityGroupIngress:
      EC2SecurityGroupName:
        Ref: WebServerSecurityGroup
    GroupDescription: Frontend Access
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Enable HTTP access via port 80 and SSH access
    SecurityGroupIngress:
    - IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      CidrIp: 0.0.0.0/0
    - IpProtocol: tcp
      FromPort: 22
      ToPort: 22
      CidrIp: 0.0.0.0/0
```

## Security groups da VPC múltiplos
<a name="scenario-multiple-vpc-security-groups"></a>

Este exemplo mostra um recurso [AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) com autorização de entrada para vários grupos de segurança de VPC do Amazon EC2 em [AWS::RDS::DBSecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroupingress.html).

### JSON
<a name="quickref-rds-example-5.json"></a>

```
{
   "Resources" : {
      "DBinstance" : {
         "Type" : "AWS::RDS::DBInstance",
         "Properties" : {
            "AllocatedStorage" : "5",
            "DBInstanceClass" : "db.t2.small",
           "DBName" : {"Ref": "MyDBName" },
            "DBSecurityGroups" : [ { "Ref" : "DbSecurityByEC2SecurityGroup" } ],
            "DBSubnetGroupName" : { "Ref" : "MyDBSubnetGroup" },
            "Engine" : "MySQL",
           "MasterUserPassword": { "Ref" : "MyDBPassword" },
           "MasterUsername"    : { "Ref" : "MyDBUsername" }
        },
         "DeletionPolicy" : "Snapshot"
      },
      "DbSecurityByEC2SecurityGroup" : {
         "Type" : "AWS::RDS::DBSecurityGroup",
         "Properties" : {
            "GroupDescription" : "Ingress for Amazon EC2 security group",
           "EC2VpcId" : { "Ref" : "MyVPC" },
            "DBSecurityGroupIngress" : [ {
               "EC2SecurityGroupId" : "sg-b0ff1111",
               "EC2SecurityGroupOwnerId" : "111122223333"
            }, {
               "EC2SecurityGroupId" : "sg-ffd722222",
               "EC2SecurityGroupOwnerId" : "111122223333"
            } ]
         }
      }
   }
}
```

### YAML
<a name="quickref-rds-example-5.yaml"></a>

```
Resources:
  DBinstance:
    Type: AWS::RDS::DBInstance
    Properties:
      AllocatedStorage: '5'
      DBInstanceClass: db.t2.small
      DBName:
        Ref: MyDBName
      DBSecurityGroups:
      - Ref: DbSecurityByEC2SecurityGroup
      DBSubnetGroupName:
        Ref: MyDBSubnetGroup
      Engine: MySQL
      MasterUserPassword:
        Ref: MyDBPassword
      MasterUsername:
        Ref: MyDBUsername
    DeletionPolicy: Snapshot
  DbSecurityByEC2SecurityGroup:
    Type: AWS::RDS::DBSecurityGroup
    Properties:
      GroupDescription: Ingress for Amazon EC2 security group
      EC2VpcId:
        Ref: MyVPC
      DBSecurityGroupIngress:
      - EC2SecurityGroupId: sg-b0ff1111
        EC2SecurityGroupOwnerId: '111122223333'
      - EC2SecurityGroupId: sg-ffd722222
        EC2SecurityGroupOwnerId: '111122223333'
```

## Instância de banco de dados do Amazon RDS em um grupo de segurança da VPC
<a name="w2aac11c41c76c15"></a>

Este exemplo mostra uma instância do banco de dados do Amazon RDS associada a um security group da VPC do Amazon EC2.

### JSON
<a name="quickref-rds-example-6.json"></a>

```
{
  "DBEC2SecurityGroup": {
    "Type": "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription": "Open database for access",
      "SecurityGroupIngress" : [{
        "IpProtocol" : "tcp",
        "FromPort" : 3306,
        "ToPort" : 3306,
        "SourceSecurityGroupName" : { "Ref" : "WebServerSecurityGroup" }
      }]
    }
  },
  "DBInstance" : {
    "Type": "AWS::RDS::DBInstance",
    "Properties": {
      "DBName"            : { "Ref" : "DBName" },
      "Engine"            : "MySQL",
      "MultiAZ"           : { "Ref": "MultiAZDatabase" },
      "MasterUsername"    : { "Ref" : "DBUser" },
      "DBInstanceClass"   : { "Ref" : "DBClass" },
      "AllocatedStorage"  : { "Ref" : "DBAllocatedStorage" },
      "MasterUserPassword": { "Ref" : "DBPassword" },
      "VPCSecurityGroups" : [ { "Fn::GetAtt": [ "DBEC2SecurityGroup", "GroupId" ] } ]
    }
  }
}
```

### YAML
<a name="quickref-rds-example-6.yaml"></a>

```
DBEC2SecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Open database for access
    SecurityGroupIngress:
    - IpProtocol: tcp
      FromPort: 3306
      ToPort: 3306
      SourceSecurityGroupName:
        Ref: WebServerSecurityGroup
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBName:
      Ref: DBName
    Engine: MySQL
    MultiAZ:
      Ref: MultiAZDatabase
    MasterUsername:
      Ref: DBUser
    DBInstanceClass:
      Ref: DBClass
    AllocatedStorage:
      Ref: DBAllocatedStorage
    MasterUserPassword:
      Ref: DBPassword
    VPCSecurityGroups:
    - !GetAtt DBEC2SecurityGroup.GroupId
```

# Trechos de modelos do Route 53
<a name="quickref-route53"></a>

**Topics**
+ [Conjunto de registro de recurso do Amazon Route 53 usando ID ou nome de zona hospedada](#scenario-route53-recordset-by-host)
+ [Usar RecordSetGroup para configurar conjuntos de registros de recurso ponderados](#scenario-recordsetgroup-weighted)
+ [Usar RecordSetGroup para configurar um conjunto de registros de recursos de alias](#scenario-recordsetgroup-zoneapex)
+ [Conjunto de registros de recursos de alias para uma distribuição do CloudFront](#scenario-user-friendly-url-for-cloudfront-distribution)

## Conjunto de registro de recurso do Amazon Route 53 usando ID ou nome de zona hospedada
<a name="scenario-route53-recordset-by-host"></a>

Ao criar um conjunto de registro de recurso do Amazon Route 53, você deve especificar a zona hospedada em que deseja adicioná-lo. O CloudFormation oferece duas maneiras de especificar uma zona hospedada:
+ Você pode especificar explicitamente a zona hospedada usando a propriedade `HostedZoneId`.
+ Você pode fazer com que o CloudFormation encontre a zona hospedada usando a propriedade `HostedZoneName`. Se você usar a propriedade `HostedZoneName` e houver várias zonas hospedadas com o mesmo nome, o CloudFormation não criará a pilha.

### Adição de RecordSet usando HostedZoneId
<a name="scenario-recordset-using-id"></a>

Este exemplo adiciona um conjunto de registro de recurso do Amazon Route 53 que contém um registro `SPF` para o nome de domínio `mysite.example.com` que usa a propriedade `HostedZoneId` para especificar a zona hospedada.

#### JSON
<a name="quickref-route53-example-1.json"></a>

```
 1. "myDNSRecord" : {
 2.   "Type" : "AWS::Route53::RecordSet",
 3.   "Properties" : 
 4.   {
 5.     "HostedZoneId" : "Z3DG6IL3SJCGPX",
 6.     "Name" : "mysite.example.com.",
 7.     "Type" : "SPF",
 8.     "TTL" : "900",
 9.     "ResourceRecords" : [ "\"v=spf1 ip4:192.168.0.1/16 -all\"" ]
10.   }
11. }
```

#### YAML
<a name="quickref-route53-example-1.yaml"></a>

```
1. myDNSRecord:
2.   Type: AWS::Route53::RecordSet
3.   Properties:
4.     HostedZoneId: Z3DG6IL3SJCGPX
5.     Name: mysite.example.com.
6.     Type: SPF
7.     TTL: '900'
8.     ResourceRecords:
9.     - '"v=spf1 ip4:192.168.0.1/16 -all"'
```

### Adição de RecordSet usando HostedZoneName
<a name="scenario-recordset-using-name"></a>

Este exemplo adiciona um conjunto de registros de recurso do Amazon Route 53 para o nome de domínio "mysite.example.com" usando a propriedade `HostedZoneName` para especificar a zona hospedada.

#### JSON
<a name="quickref-route53-example-2.json"></a>

```
 1. "myDNSRecord2" : {
 2.             "Type" : "AWS::Route53::RecordSet",
 3.             "Properties" : {
 4.                 "HostedZoneName" : "example.com.",
 5.                 "Name" : "mysite.example.com.",
 6.                 "Type" : "A",
 7.                 "TTL" : "900",
 8.                 "ResourceRecords" : [
 9.                     "192.168.0.1",
10.                     "192.168.0.2"
11.                 ]
12.             }
13.         }
```

#### YAML
<a name="quickref-route53-example-2.yaml"></a>

```
 1. myDNSRecord2:
 2.   Type: AWS::Route53::RecordSet
 3.   Properties:
 4.     HostedZoneName: example.com.
 5.     Name: mysite.example.com.
 6.     Type: A
 7.     TTL: '900'
 8.     ResourceRecords:
 9.     - 192.168.0.1
10.     - 192.168.0.2
```

## Usar RecordSetGroup para configurar conjuntos de registros de recurso ponderados
<a name="scenario-recordsetgroup-weighted"></a>

Este exemplo usa um [AWS::Route53::RecordSetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) para configurar dois registros CNAME para o "example.com". zona hospedada. A propriedade `RecordSets` contém os conjuntos de registros CNAME para o nome DNS do "mysite.example.com". Cada conjunto de registros contém um identificador (`SetIdentifier`) e um peso (`Weight`). A proporção do tráfego de Internet que é roteada para os recursos é baseada nos seguintes cálculos:
+ `Frontend One`: `140/(140+60)` = `140/200` = 70%
+ `Frontend Two`: `60/(140+60)` = `60/200` = 30%

Para obter mais informações sobre conjuntos de registros de recursos ponderados, consulte [Roteamento ponderado](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html) no *Guia do desenvolvedor do Amazon Route 53*.

### JSON
<a name="quickref-route53-example-3.json"></a>

```
 1.         "myDNSOne" : {
 2.             "Type" : "AWS::Route53::RecordSetGroup",
 3.             "Properties" : {
 4.                 "HostedZoneName" : "example.com.",
 5.                 "Comment" : "Weighted RR for my frontends.",
 6.                 "RecordSets" : [
 7.                   {
 8.                     "Name" : "mysite.example.com.",
 9.                     "Type" : "CNAME",
10.                     "TTL" : "900",
11.                     "SetIdentifier" : "Frontend One",
12.                     "Weight" : "140",
13.                     "ResourceRecords" : ["example-ec2.amazonaws.com"]
14.                   },
15.                   {
16.                     "Name" : "mysite.example.com.",
17.                     "Type" : "CNAME",
18.                     "TTL" : "900",
19.                     "SetIdentifier" : "Frontend Two",
20.                     "Weight" : "60",
21.                     "ResourceRecords" : ["example-ec2-larger.amazonaws.com"]
22.                   }
23.                   ]
24.             }
25.         }
```

### YAML
<a name="quickref-route53-example-3.yaml"></a>

```
 1. myDNSOne:
 2.   Type: AWS::Route53::RecordSetGroup
 3.   Properties:
 4.     HostedZoneName: example.com.
 5.     Comment: Weighted RR for my frontends.
 6.     RecordSets:
 7.     - Name: mysite.example.com.
 8.       Type: CNAME
 9.       TTL: '900'
10.       SetIdentifier: Frontend One
11.       Weight: '140'
12.       ResourceRecords:
13.       - example-ec2.amazonaws.com
14.     - Name: mysite.example.com.
15.       Type: CNAME
16.       TTL: '900'
17.       SetIdentifier: Frontend Two
18.       Weight: '60'
19.       ResourceRecords:
20.       - example-ec2-larger.amazonaws.com
```

## Usar RecordSetGroup para configurar um conjunto de registros de recursos de alias
<a name="scenario-recordsetgroup-zoneapex"></a>

Os exemplos a seguir usam um [AWS::Route53::RecordSetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) para configurar um conjunto de registros de recurso de alias chamado `example.com` que roteia o tráfego para um load balancer do ELB Versão 1 (Classic) e um load balancer (aplicativo ou rede) da versão 2. A propriedade [AliasTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-route53-recordset-aliastarget.html) especifica o ID da zona hospedada e o nome do DNS para o `LoadBalancer` `myELB` usando a função intrínseca `GetAtt`. O `GetAtt` recupera propriedades diferentes do recurso `myELB`, dependendo de você estar roteando o tráfego para um balanceador de carga versão 1 ou versão 2:
+ Load balancer da versão 1: `CanonicalHostedZoneNameID` e `DNSName`
+ Load balancer da versão 2: `CanonicalHostedZoneID` e `DNSName`

Para obter mais informações sobre conjuntos de registros de recurso de alias, consulte [Escolher entre registros de alias e de não alias](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html), no *Guia do Desenvolvedor do Route 53*.

### JSON para load balancer da versão 1
<a name="quickref-route53-example-4.json"></a>

```
 1.       "myELB" : {
 2.         "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
 3.         "Properties" : {
 4.             "AvailabilityZones" : [ "us-east-1a" ],
 5.             "Listeners" : [ {
 6.                 "LoadBalancerPort" : "80",
 7.                 "InstancePort" : "80",
 8.                 "Protocol" : "HTTP"
 9.             } ]
10.         }
11.       },
12.       "myDNS" : {
13.         "Type" : "AWS::Route53::RecordSetGroup",
14.         "Properties" : {
15.           "HostedZoneName" : "example.com.",
16.           "Comment" : "Zone apex alias targeted to myELB LoadBalancer.",
17.           "RecordSets" : [
18.             {
19.               "Name" : "example.com.",
20.               "Type" : "A",
21.               "AliasTarget" : {
22.                   "HostedZoneId" : { "Fn::GetAtt" : ["myELB", "CanonicalHostedZoneNameID"] },
23.                   "DNSName" : { "Fn::GetAtt" : ["myELB","DNSName"] }
24.               }
25.             }
26.           ]
27.         }
28.     }
```

### YAML para load balancer da versão 1
<a name="quickref-route53-example-4.yaml"></a>

```
 1. myELB:
 2.   Type: AWS::ElasticLoadBalancing::LoadBalancer
 3.   Properties:
 4.     AvailabilityZones:
 5.     - "us-east-1a"
 6.     Listeners:
 7.     - LoadBalancerPort: '80'
 8.       InstancePort: '80'
 9.       Protocol: HTTP
10. myDNS:
11.   Type: AWS::Route53::RecordSetGroup
12.   Properties:
13.     HostedZoneName: example.com.
14.     Comment: Zone apex alias targeted to myELB LoadBalancer.
15.     RecordSets:
16.     - Name: example.com.
17.       Type: A
18.       AliasTarget:
19.         HostedZoneId: !GetAtt 'myELB.CanonicalHostedZoneNameID'
20.         DNSName: !GetAtt 'myELB.DNSName'
```

### JSON para load balancer da versão 2
<a name="quickref-route53-example-4-v2.json"></a>

```
 1.       "myELB" : {
 2.         "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
 3.         "Properties" : {
 4.             "Subnets" : [ 
 5.                 {"Ref": "SubnetAZ1"}, 
 6.                 {"Ref" : "SubnetAZ2"}
 7.             ]
 8.         }
 9.       },
10.       "myDNS" : {
11.         "Type" : "AWS::Route53::RecordSetGroup",
12.         "Properties" : {
13.           "HostedZoneName" : "example.com.",
14.           "Comment" : "Zone apex alias targeted to myELB LoadBalancer.",
15.           "RecordSets" : [
16.             {
17.               "Name" : "example.com.",
18.               "Type" : "A",
19.               "AliasTarget" : {
20.                   "HostedZoneId" : { "Fn::GetAtt" : ["myELB", "CanonicalHostedZoneID"] },
21.                   "DNSName" : { "Fn::GetAtt" : ["myELB","DNSName"] }
22.               }
23.             }
24.           ]
25.         }
26.     }
```

### YAML para load balancer da versão 2
<a name="quickref-route53-example-4-v2.yaml"></a>

```
 1. myELB:
 2.   Type: AWS::ElasticLoadBalancingV2::LoadBalancer
 3.   Properties:
 4.     Subnets:
 5.     - Ref: SubnetAZ1
 6.     - Ref: SubnetAZ2
 7. myDNS:
 8.   Type: AWS::Route53::RecordSetGroup
 9.   Properties:
10.     HostedZoneName: example.com.
11.     Comment: Zone apex alias targeted to myELB LoadBalancer.
12.     RecordSets:
13.     - Name: example.com.
14.       Type: A
15.       AliasTarget:
16.         HostedZoneId: !GetAtt 'myELB.CanonicalHostedZoneID'
17.         DNSName: !GetAtt 'myELB.DNSName'
```

## Conjunto de registros de recursos de alias para uma distribuição do CloudFront
<a name="scenario-user-friendly-url-for-cloudfront-distribution"></a>

O exemplo a seguir cria um registro de alias A que aponta um nome de domínio personalizado para uma distribuição do CloudFront existente. Presume-se que `myHostedZoneID` seja uma referência a um recurso `AWS::Route53::HostedZone` atual no mesmo modelo ou um parâmetro. `myCloudFrontDistribution` refere-se a um recurso `AWS::CloudFront::Distribution` dentro do mesmo modelo. O registro de alias usa o ID de zona hospedada padrão do CloudFront (`Z2FDTNDATAQYW2`) e resolve automaticamente o nome de domínio da distribuição usando `Fn::GetAtt`. Essa configuração permite que o tráfego da Web seja roteado do domínio personalizado para a distribuição do CloudFront sem exigir um endereço IP.

**nota**  
Quando você cria conjuntos de registros de recursos de alias, você deve especificar `Z2FDTNDATAQYW2` para a propriedade `HostedZoneId`. Os conjuntos de registros de recursos do CloudFront não podem ser criados em uma zona privada.

### JSON
<a name="quickref-route53-example-5.json"></a>

```
 1. {
 2.     "myDNS": {
 3.         "Type": "AWS::Route53::RecordSetGroup",
 4.         "Properties": {
 5.             "HostedZoneId": {
 6.                 "Ref": "myHostedZoneID"
 7.             },
 8.             "RecordSets": [
 9.                 {
10.                     "Name": {
11.                         "Ref": "myRecordSetDomainName"
12.                     },
13.                     "Type": "A",
14.                     "AliasTarget": {
15.                         "HostedZoneId": "Z2FDTNDATAQYW2",
16.                         "DNSName": {
17.                             "Fn::GetAtt": [
18.                                 "myCloudFrontDistribution",
19.                                 "DomainName"
20.                             ]
21.                         },
22.                         "EvaluateTargetHealth": false
23.                     }
24.                 }
25.             ]
26.         }
27.     }
28. }
```

### YAML
<a name="quickref-route53-example-5.yaml"></a>

```
 1. myDNS:
 2.   Type: AWS::Route53::RecordSetGroup
 3.   Properties:
 4.     HostedZoneId: !Ref myHostedZoneID
 5.     RecordSets:
 6.       - Name: !Ref myRecordSetDomainName
 7.         Type: A
 8.         AliasTarget:
 9.           HostedZoneId: Z2FDTNDATAQYW2
10.           DNSName: !GetAtt 
11.             - myCloudFrontDistribution
12.             - DomainName
13.           EvaluateTargetHealth: false
```

# Trechos de modelo do Amazon S3
<a name="quickref-s3"></a>

Use os modelos de exemplo do Amazon S3 para ajudar a descrever seus buckets do Amazon S3 com o CloudFormation. Para obter mais exemplos, consulte a seção [Exemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html#aws-resource-s3-bucket--examples) no recurso `AWS::S3::Bucket`.

**Topics**
+ [Criar um bucket do Amazon S3 com padrões](#scenario-s3-bucket)
+ [Criação de um bucket do Amazon S3 para hospedagem de site e com uma `DeletionPolicy`](#scenario-s3-bucket-website)
+ [Criar um site estático usando um domínio personalizado](#scenario-s3-bucket-website-customdomain)

## Criar um bucket do Amazon S3 com padrões
<a name="scenario-s3-bucket"></a>

Este exemplo usa um [AWS::S3::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html) para criar um bucket com as configurações padrão.

### JSON
<a name="quickref-s3-example-1.json"></a>

```
1. "myS3Bucket" : {
2.       "Type" : "AWS::S3::Bucket"
3.       }
```

### YAML
<a name="quickref-s3-example-1.yaml"></a>

```
1. MyS3Bucket:
2.     Type: AWS::S3::Bucket
```

## Criação de um bucket do Amazon S3 para hospedagem de site e com uma `DeletionPolicy`
<a name="scenario-s3-bucket-website"></a>

Este exemplo cria um bucket como um site e desabilita o bloqueio de acesso público (são necessárias permissões públicas de leitura para buckets configurados para a hospedagem de sites). Em seguida, uma política pública para buckets é adicionada ao bucket. Como esse recurso de bucket tem um atributo `DeletionPolicy` definido como `Retain`, o CloudFormation não exclui esse bucket ao excluir a pilha. A seção `Output` usa `Fn::GetAtt` para recuperar os atributos `WebsiteURL` e `DomainName` do recurso `S3Bucket`.

**nota**  
Os exemplos apresentados a seguir pressupõem que as configurações do bloqueio de acesso público `BlockPublicPolicy` e `RestrictPublicBuckets` foram desabilitadas no nível da conta. 

### JSON
<a name="quickref-s3-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion": "2010-09-09",
 3.     "Resources": {
 4.         "S3Bucket": {
 5.             "Type": "AWS::S3::Bucket",
 6.             "Properties": {
 7.                 "PublicAccessBlockConfiguration": {
 8.                     "BlockPublicAcls": false,
 9.                     "BlockPublicPolicy": false,
10.                     "IgnorePublicAcls": false,
11.                     "RestrictPublicBuckets": false
12.                 },
13.                 "WebsiteConfiguration": {
14.                     "IndexDocument": "index.html",
15.                     "ErrorDocument": "error.html"
16.                 }
17.             },
18.             "DeletionPolicy": "Retain",
19.             "UpdateReplacePolicy": "Retain"
20.         },
21.         "BucketPolicy": {
22.             "Type": "AWS::S3::BucketPolicy",
23.             "Properties": {
24.                 "PolicyDocument": {
25.                     "Id": "MyPolicy",
26.                     "Version": "2012-10-17", 		 	 	 
27.                     "Statement": [
28.                         {
29.                             "Sid": "PublicReadForGetBucketObjects",
30.                             "Effect": "Allow",
31.                             "Principal": "*",
32.                             "Action": "s3:GetObject",
33.                             "Resource": {
34.                                 "Fn::Join": [
35.                                     "",
36.                                     [
37.                                         "arn:aws:s3:::",
38.                                         {
39.                                             "Ref": "S3Bucket"
40.                                         },
41.                                         "/*"
42.                                     ]
43.                                 ]
44.                             }
45.                         }
46.                     ]
47.                 },
48.                 "Bucket": {
49.                     "Ref": "S3Bucket"
50.                 }
51.             }
52.         }
53.     },
54.     "Outputs": {
55.         "WebsiteURL": {
56.             "Value": {
57.                 "Fn::GetAtt": [
58.                     "S3Bucket",
59.                     "WebsiteURL"
60.                 ]
61.             },
62.             "Description": "URL for website hosted on S3"
63.         },
64.         "S3BucketSecureURL": {
65.             "Value": {
66.                 "Fn::Join": [
67.                     "",
68.                     [
69.                         "https://",
70.                         {
71.                             "Fn::GetAtt": [
72.                                 "S3Bucket",
73.                                 "DomainName"
74.                             ]
75.                         }
76.                     ]
77.                 ]
78.             },
79.             "Description": "Name of S3 bucket to hold website content"
80.         }
81.     }
82. }
```

### YAML
<a name="quickref-s3-example-2.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Resources:
 3.   S3Bucket:
 4.     Type: AWS::S3::Bucket
 5.     Properties:
 6.       PublicAccessBlockConfiguration:
 7.         BlockPublicAcls: false
 8.         BlockPublicPolicy: false
 9.         IgnorePublicAcls: false
10.         RestrictPublicBuckets: false
11.       WebsiteConfiguration:
12.         IndexDocument: index.html
13.         ErrorDocument: error.html
14.     DeletionPolicy: Retain
15.     UpdateReplacePolicy: Retain
16.   BucketPolicy:
17.     Type: AWS::S3::BucketPolicy
18.     Properties:
19.       PolicyDocument:
20.         Id: MyPolicy
21.         Version: 2012-10-17 		 	 	 
22.         Statement:
23.           - Sid: PublicReadForGetBucketObjects
24.             Effect: Allow
25.             Principal: '*'
26.             Action: 's3:GetObject'
27.             Resource: !Join 
28.               - ''
29.               - - 'arn:aws:s3:::'
30.                 - !Ref S3Bucket
31.                 - /*
32.       Bucket: !Ref S3Bucket
33. Outputs:
34.   WebsiteURL:
35.     Value: !GetAtt 
36.       - S3Bucket
37.       - WebsiteURL
38.     Description: URL for website hosted on S3
39.   S3BucketSecureURL:
40.     Value: !Join 
41.       - ''
42.       - - 'https://'
43.         - !GetAtt 
44.           - S3Bucket
45.           - DomainName
46.     Description: Name of S3 bucket to hold website content
```

## Criar um site estático usando um domínio personalizado
<a name="scenario-s3-bucket-website-customdomain"></a>

Você pode usar o Route 53 com um domínio registrado. O exemplo a seguir pressupõe que você já criou uma zona hospedada no Route 53 para seu domínio. O exemplo cria dois buckets para hospedagem de sites. O bucket raiz hospeda o conteúdo, e o outro bucket redireciona as solicitações `www.domainname.com` para o bucket raiz. Os conjuntos de registros mapeiam o nome do domínio para os endpoints do Amazon S3. 

Também será necessário adicionar uma política de bucket, como mostrado nos exemplos acima.

Para obter mais informações sobre como usar um domínio personalizado, consulte [Tutorial: Configurar um site estático usando um domínio personalizado registrado no Route 53](https://docs.aws.amazon.com/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html) no *Guia do usuário do Amazon Simple Storage Service*.

**nota**  
Os exemplos apresentados a seguir pressupõem que as configurações do bloqueio de acesso público `BlockPublicPolicy` e `RestrictPublicBuckets` foram desabilitadas no nível da conta. 

### JSON
<a name="quickref-s3-example-3.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Mappings" : {
        "RegionMap" : {
            "us-east-1" : { "S3hostedzoneID" : "Z3AQBSTGFYJSTF", "websiteendpoint" : "s3-website-us-east-1.amazonaws.com" },
            "us-west-1" : { "S3hostedzoneID" : "Z2F56UZL2M1ACD", "websiteendpoint" : "s3-website-us-west-1.amazonaws.com" },
            "us-west-2" : { "S3hostedzoneID" : "Z3BJ6K6RIION7M", "websiteendpoint" : "s3-website-us-west-2.amazonaws.com" },            
            "eu-west-1" : { "S3hostedzoneID" : "Z1BKCTXD74EZPE", "websiteendpoint" : "s3-website-eu-west-1.amazonaws.com" },
            "ap-southeast-1" : { "S3hostedzoneID" : "Z3O0J2DXBE1FTB", "websiteendpoint" : "s3-website-ap-southeast-1.amazonaws.com" },
            "ap-southeast-2" : { "S3hostedzoneID" : "Z1WCIGYICN2BYD", "websiteendpoint" : "s3-website-ap-southeast-2.amazonaws.com" },
            "ap-northeast-1" : { "S3hostedzoneID" : "Z2M4EHUR26P7ZW", "websiteendpoint" : "s3-website-ap-northeast-1.amazonaws.com" },
            "sa-east-1" : { "S3hostedzoneID" : "Z31GFT0UA1I2HV", "websiteendpoint" : "s3-website-sa-east-1.amazonaws.com" }
        }
    },
    "Parameters": {
        "RootDomainName": {
            "Description": "Domain name for your website (example.com)",
            "Type": "String"
        }
    },
    "Resources": {
        "RootBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName" : {"Ref":"RootDomainName"},
                "PublicAccessBlockConfiguration": {
                    "BlockPublicAcls": false,
                    "BlockPublicPolicy": false,
                    "IgnorePublicAcls": false,
                    "RestrictPublicBuckets": false
                },
                "WebsiteConfiguration": {
                    "IndexDocument":"index.html",
                    "ErrorDocument":"404.html"
                }
            }
        },
        "WWWBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": {
                    "Fn::Join": ["", ["www.", {"Ref":"RootDomainName"}]]
                },
                "AccessControl": "BucketOwnerFullControl",
                "WebsiteConfiguration": {
                    "RedirectAllRequestsTo": {
                        "HostName": {"Ref": "RootBucket"}
                    }
                }
            }
        },
        "myDNS": {
            "Type": "AWS::Route53::RecordSetGroup",
            "Properties": {
                "HostedZoneName": {
                    "Fn::Join": ["", [{"Ref": "RootDomainName"}, "."]]
                },
                "Comment": "Zone apex alias.",
                "RecordSets": [
                    {
                        "Name": {"Ref": "RootDomainName"},
                        "Type": "A",
                        "AliasTarget": {
                            "HostedZoneId": {"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "S3hostedzoneID"]},
                            "DNSName": {"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "websiteendpoint"]}
                        }
                    },
                    {
                        "Name": {
                            "Fn::Join": ["", ["www.", {"Ref":"RootDomainName"}]]
                        },
                        "Type": "CNAME",
                        "TTL" : "900",
                        "ResourceRecords" : [
                            {"Fn::GetAtt":["WWWBucket", "DomainName"]}
                        ]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "WebsiteURL": {
            "Value": {"Fn::GetAtt": ["RootBucket", "WebsiteURL"]},
            "Description": "URL for website hosted on S3"
        }
    }
}
```

### YAML
<a name="quickref-s3-example-3.yaml"></a>

```
Parameters:
  RootDomainName:
    Description: Domain name for your website (example.com)
    Type: String
Mappings:
  RegionMap:
    us-east-1:
      S3hostedzoneID: Z3AQBSTGFYJSTF
      websiteendpoint: s3-website-us-east-1.amazonaws.com
    us-west-1:
      S3hostedzoneID: Z2F56UZL2M1ACD
      websiteendpoint: s3-website-us-west-1.amazonaws.com
    us-west-2:
      S3hostedzoneID: Z3BJ6K6RIION7M
      websiteendpoint: s3-website-us-west-2.amazonaws.com
    eu-west-1:
      S3hostedzoneID: Z1BKCTXD74EZPE
      websiteendpoint: s3-website-eu-west-1.amazonaws.com
    ap-southeast-1:
      S3hostedzoneID: Z3O0J2DXBE1FTB
      websiteendpoint: s3-website-ap-southeast-1.amazonaws.com
    ap-southeast-2:
      S3hostedzoneID: Z1WCIGYICN2BYD
      websiteendpoint: s3-website-ap-southeast-2.amazonaws.com
    ap-northeast-1:
      S3hostedzoneID: Z2M4EHUR26P7ZW
      websiteendpoint: s3-website-ap-northeast-1.amazonaws.com
    sa-east-1:
      S3hostedzoneID: Z31GFT0UA1I2HV
      websiteendpoint: s3-website-sa-east-1.amazonaws.com
Resources:
  RootBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref RootDomainName
      PublicAccessBlockConfiguration:
        BlockPublicAcls: false
        BlockPublicPolicy: false
        IgnorePublicAcls: false
        RestrictPublicBuckets: false
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: 404.html
  WWWBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub
        - www.${Domain}
        - Domain: !Ref RootDomainName
      AccessControl: BucketOwnerFullControl
      WebsiteConfiguration:
        RedirectAllRequestsTo:
          HostName: !Ref RootBucket
  myDNS:
    Type: AWS::Route53::RecordSetGroup
    Properties:
      HostedZoneName: !Sub 
        - ${Domain}.
        - Domain: !Ref RootDomainName
      Comment: Zone apex alias.
      RecordSets:
        - Name: !Ref RootDomainName
          Type: A
          AliasTarget:
            HostedZoneId: !FindInMap [ RegionMap, !Ref 'AWS::Region', S3hostedzoneID]
            DNSName: !FindInMap [ RegionMap, !Ref 'AWS::Region', websiteendpoint]
        - Name: !Sub
            - www.${Domain}
            - Domain: !Ref RootDomainName
          Type: CNAME
          TTL: 900
          ResourceRecords:
            - !GetAtt WWWBucket.DomainName
Outputs:
  WebsiteURL:
    Value: !GetAtt RootBucket.WebsiteURL
    Description: URL for website hosted on S3
```

# Trechos de modelo do Amazon SNS
<a name="quickref-sns"></a>

Este exemplo mostra um recurso de tópico do Amazon SNS. Ele requer um endereço de e-mail válido.

## JSON
<a name="quickref-sns-example-1.json"></a>

```
1. "MySNSTopic" : {
2.     "Type" : "AWS::SNS::Topic",
3.     "Properties" : {
4.         "Subscription" : [ {
5.             "Endpoint" : "add valid email address",
6.             "Protocol" : "email"
7.         } ]
8.     }
9. }
```

## YAML
<a name="quickref-sns-example-1.yaml"></a>

```
1. MySNSTopic:
2.   Type: AWS::SNS::Topic
3.   Properties:
4.     Subscription:
5.     - Endpoint: "add valid email address"
6.       Protocol: email
```

# Trechos de modelo do Amazon SQS
<a name="scenario-sqs-queue"></a>

Este exemplo mostra uma fila do Amazon SQS.

## JSON
<a name="scenario-sqs-queue-example-1.json"></a>

```
1. "MyQueue" : {
2.     "Type" : "AWS::SQS::Queue",
3.     "Properties" : {
4.         "VisibilityTimeout" : "value"
5.     }
6. }
```

## YAML
<a name="scenario-sqs-queue-example-1.yaml"></a>

```
1. MyQueue:
2.   Type: AWS::SQS::Queue
3.   Properties:
4.     VisibilityTimeout: value
```

# Trechos de modelo do Amazon Timestream
<a name="scenario-timestream-queue"></a>

O Amazon Timestream para InfluxDB torna fácil para os desenvolvedores de aplicações e as equipes de DevOps executarem bancos de dados InfluxDB totalmente gerenciados na AWS para aplicações de série temporal em tempo real usando APIs de código aberto. Você pode criar rapidamente um banco de dados InfluxDB que lida com workloads de série temporal complexas. Com algumas simples chamadas de API, você pode configurar, migrar, operar e escalar um banco de dados InfluxDB na AWS com correções, backups e recuperação de software automatizados. Você também pode encontrar esses exemplos em [awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb](https://github.com/awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb) no GitHub.

**Topics**
+ [Exemplo mínimo usando valores padrão](#scenario-timestream-influxdb-example-1)
+ [Exemplo mais completo com parâmetros](#scenario-timestream-influxdb-example-2)

Esses modelos do CloudFormation criam os seguintes recursos que são necessários para a criação, a conexão e o monitoramento bem-sucedido de uma instância do Amazon Timestream para InfluxDB:

**Amazon VPC**
+ `VPC`
+ Uma ou mais `Subnet`
+ `InternetGateway`
+ `RouteTable`
+ `SecurityGroup`

**Amazon S3**
+ `Bucket`

**Amazon Timestream**
+ `InfluxDBInstance`

## Exemplo mínimo usando valores padrão
<a name="scenario-timestream-influxdb-example-1"></a>

Esse exemplo implanta uma instância multi-AZ acessível ao público usando os valores padrão quando possível.

### JSON
<a name="scenario-timestream-influxdb-example-1.json"></a>

```
{
  "Metadata": {
    "AWS::CloudFormation::Interface": {
      "ParameterGroups": [
        {
          "Label": {"default": "Amazon Timestream for InfluxDB Configuration"},
          "Parameters": [
            "DbInstanceName",
            "InfluxDBPassword"
          ]
        }
      ],
      "ParameterLabels": {
        "VPCCIDR": {"default": "VPC CIDR"}
      }
    }
  },
  "Parameters": {
    "DbInstanceName": {
      "Description": "The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.",
      "Type": "String",
      "Default": "mydbinstance",
      "MinLength": 3,
      "MaxLength": 40,
      "AllowedPattern": "^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$"
    },
    "InfluxDBPassword": {
      "Description": "The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "NoEcho": true,
      "MinLength": 8,
      "MaxLength": 64,
      "AllowedPattern": "^[a-zA-Z0-9]+$"
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {"CidrBlock": "10.0.0.0/16"}
    },
    "InternetGateway": {"Type": "AWS::EC2::InternetGateway"},
    "InternetGatewayAttachment": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "Properties": {
        "InternetGatewayId": {"Ref": "InternetGateway"},
        "VpcId": {"Ref": "VPC"}
      }
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            0,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            0,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": true
      }
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            1,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            1,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": true
      }
    },
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {"Ref": "VPC"}
      }
    },
    "DefaultRoute": {
      "Type": "AWS::EC2::Route",
      "DependsOn": "InternetGatewayAttachment",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "InternetGateway"}
      }
    },
    "Subnet1RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet1"}
      }
    },
    "Subnet2RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet2"}
      }
    },
    "InfluxDBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "influxdb-sg",
        "GroupDescription": "Security group allowing port 8086 ingress for InfluxDB",
        "VpcId": {"Ref": "VPC"}
      }
    },
    "InfluxDBSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {"Ref": "InfluxDBSecurityGroup"},
        "IpProtocol": "tcp",
        "CidrIp": "0.0.0.0/0",
        "FromPort": 8086,
        "ToPort": 8086
      }
    },
    "InfluxDBLogsS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain"
    },
    "InfluxDBLogsS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {"Ref": "InfluxDBLogsS3Bucket"},
        "PolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*"},
              "Principal": {"Service": "timestream-influxdb.amazonaws.com"}
            },
            {
              "Action": "s3:*",
              "Effect": "Deny",
              "Resource": [
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/*"},
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}"}
              ],
              "Principal": "*",
              "Condition": {
                "Bool": {"aws:SecureTransport": false}
              }
            }
          ]
        }
      }
    },
    "DbInstance": {
      "Type": "AWS::Timestream::InfluxDBInstance",
      "DependsOn": "InfluxDBLogsS3BucketPolicy",
      "Properties": {
        "AllocatedStorage": 20,
        "DbInstanceType": "db.influx.medium",
        "Name": {"Ref": "DbInstanceName"},
        "Password": {"Ref": "InfluxDBPassword"},
        "PubliclyAccessible": true,
        "DeploymentType": "WITH_MULTIAZ_STANDBY",
        "VpcSecurityGroupIds": [
          {"Ref": "InfluxDBSecurityGroup"}
        ],
        "VpcSubnetIds": [
          {"Ref": "Subnet1"},
          {"Ref": "Subnet2"}
        ],
        "LogDeliveryConfiguration": {
          "S3Configuration": {
            "BucketName": {"Ref": "InfluxDBLogsS3Bucket"},
            "Enabled": true
          }
        }
      }
    }
  },
  "Outputs": {
    "VPC": {
      "Description": "A reference to the VPC used to create network resources",
      "Value": {"Ref": "VPC"}
    },
    "Subnets": {
      "Description": "A list of the subnets created",
      "Value": {
        "Fn::Join": [
          ",",
          [
            {"Ref": "Subnet1"},
            {"Ref": "Subnet2"}
          ]
        ]
      }
    },
    "Subnet1": {
      "Description": "A reference to the subnet in the 1st Availability Zone",
      "Value": {"Ref": "Subnet1"}
    },
    "Subnet2": {
      "Description": "A reference to the subnet in the 2nd Availability Zone",
      "Value": {"Ref": "Subnet2"}
    },
    "InfluxDBSecurityGroup": {
      "Description": "Security group with port 8086 ingress rule",
      "Value": {"Ref": "InfluxDBSecurityGroup"}
    },
    "InfluxDBLogsS3Bucket": {
      "Description": "S3 Bucket containing InfluxDB logs from the DB instance",
      "Value": {"Ref": "InfluxDBLogsS3Bucket"}
    },
    "DbInstance": {
      "Description": "A reference to the Timestream for InfluxDB DB instance",
      "Value": {"Ref": "DbInstance"}
    },
    "InfluxAuthParametersSecretArn": {
      "Description": "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password.",
      "Value": {
        "Fn::GetAtt": [
          "DbInstance",
          "InfluxAuthParametersSecretArn"
        ]
      }
    },
    "Endpoint": {
      "Description": "The endpoint URL to connect to InfluxDB",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Fn::GetAtt": [
                "DbInstance",
                "Endpoint"
              ]
            },
            ":8086"
          ]
        ]
      }
    }
  }
}
```

### YAML
<a name="scenario-timestream-influxdb-example-1.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: "Amazon Timestream for InfluxDB Configuration"
        Parameters:
          - DbInstanceName
          - InfluxDBPassword
    ParameterLabels:
      VPCCIDR:
        default: VPC CIDR

Parameters:
  DbInstanceName:
    Description: The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.
    Type: String
    Default: mydbinstance
    MinLength: 3
    MaxLength: 40
    AllowedPattern: ^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$
  InfluxDBPassword:
    Description: The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 64
    AllowedPattern: ^[a-zA-Z0-9]+$

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  InternetGateway:
    Type: AWS::EC2::InternetGateway
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: true
  Subnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [1, !GetAZs  '']
      CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: true
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  DefaultRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2
  InfluxDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "influxdb-sg"
      GroupDescription: "Security group allowing port 8086 ingress for InfluxDB"
      VpcId: !Ref VPC
  InfluxDBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref InfluxDBSecurityGroup
      IpProtocol: tcp
      CidrIp: 0.0.0.0/0
      FromPort: 8086
      ToPort: 8086
  InfluxDBLogsS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
  InfluxDBLogsS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref InfluxDBLogsS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*
            Principal:
              Service: timestream-influxdb.amazonaws.com
          - Action: "s3:*"
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/*
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: false
  DbInstance:
    Type: AWS::Timestream::InfluxDBInstance
    DependsOn: InfluxDBLogsS3BucketPolicy
    Properties:
      AllocatedStorage: 20
      DbInstanceType: db.influx.medium
      Name: !Ref DbInstanceName
      Password: !Ref InfluxDBPassword
      PubliclyAccessible: true
      DeploymentType: WITH_MULTIAZ_STANDBY
      VpcSecurityGroupIds: 
        - !Ref InfluxDBSecurityGroup
      VpcSubnetIds:
        - !Ref Subnet1
        - !Ref Subnet2
      LogDeliveryConfiguration:
        S3Configuration:
          BucketName: !Ref InfluxDBLogsS3Bucket
          Enabled: true

Outputs:
  # Network Resources
  VPC:
    Description: A reference to the VPC used to create network resources
    Value: !Ref VPC
  Subnets:
    Description: A list of the subnets created
    Value: !Join [",", [!Ref Subnet1, !Ref Subnet2]]
  Subnet1:
    Description: A reference to the subnet in the 1st Availability Zone
    Value: !Ref Subnet1
  Subnet2:
    Description: A reference to the subnet in the 2nd Availability Zone
    Value: !Ref Subnet2
  InfluxDBSecurityGroup:
    Description: Security group with port 8086 ingress rule
    Value: !Ref InfluxDBSecurityGroup

  # Timestream for InfluxDB Resources
  InfluxDBLogsS3Bucket:
    Description: S3 Bucket containing InfluxDB logs from the DB instance
    Value: !Ref InfluxDBLogsS3Bucket
  DbInstance:
    Description: A reference to the Timestream for InfluxDB DB instance
    Value: !Ref DbInstance
  InfluxAuthParametersSecretArn:
    Description: "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password."
    Value: !GetAtt DbInstance.InfluxAuthParametersSecretArn
  Endpoint:
    Description: The endpoint URL to connect to InfluxDB
    Value: !Join ["", ["https://", !GetAtt DbInstance.Endpoint, ":8086"]]
```

## Exemplo mais completo com parâmetros
<a name="scenario-timestream-influxdb-example-2"></a>

Esse exemplo de modelo altera dinamicamente os recursos de rede de acordo com os parâmetros fornecidos. Os parâmetros incluem `PubliclyAccessible` e `DeploymentType`.

### JSON
<a name="scenario-timestream-influxdb-example-2.json"></a>

```
{
  "Metadata": {
    "AWS::CloudFormation::Interface": {
      "ParameterGroups": [
        {
          "Label": {"default": "Network Configuration"},
          "Parameters": ["VPCCIDR"]
        },
        {
          "Label": {"default": "Amazon Timestream for InfluxDB Configuration"},
          "Parameters": [
            "DbInstanceName",
            "InfluxDBUsername",
            "InfluxDBPassword",
            "InfluxDBOrganization",
            "InfluxDBBucket",
            "DbInstanceType",
            "DbStorageType",
            "AllocatedStorage",
            "PubliclyAccessible",
            "DeploymentType"
          ]
        }
      ],
      "ParameterLabels": {
        "VPCCIDR": {"default": "VPC CIDR"}
      }
    }
  },
  "Parameters": {
    "VPCCIDR": {
      "Description": "Please enter the IP range (CIDR notation) for the new VPC",
      "Type": "String",
      "Default": "10.0.0.0/16"
    },
    "DbInstanceName": {
      "Description": "The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.",
      "Type": "String",
      "Default": "mydbinstance",
      "MinLength": 3,
      "MaxLength": 40,
      "AllowedPattern": "^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$"
    },
    "InfluxDBUsername": {
      "Description": "The username of the initial admin user created in InfluxDB. Must start with a letter and can't end with a hyphen or contain two consecutive hyphens. For example, my-user1. This username will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "Default": "admin",
      "MinLength": 1,
      "MaxLength": 64
    },
    "InfluxDBPassword": {
      "Description": "The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "NoEcho": true,
      "MinLength": 8,
      "MaxLength": 64,
      "AllowedPattern": "^[a-zA-Z0-9]+$"
    },
    "InfluxDBOrganization": {
      "Description": "The name of the initial organization for the initial admin user in InfluxDB. An InfluxDB organization is a workspace for a group of users.",
      "Type": "String",
      "Default": "org",
      "MinLength": 1,
      "MaxLength": 64
    },
    "InfluxDBBucket": {
      "Description": "The name of the initial InfluxDB bucket. All InfluxDB data is stored in a bucket. A bucket combines the concept of a database and a retention period (the duration of time that each data point persists). A bucket belongs to an organization.",
      "Type": "String",
      "Default": "bucket",
      "MinLength": 2,
      "MaxLength": 64,
      "AllowedPattern": "^[^_\\\"][^\\\"]*$"
    },
    "DeploymentType": {
      "Description": "Specifies whether the Timestream for InfluxDB is deployed as Single-AZ or with a MultiAZ Standby for High availability",
      "Type": "String",
      "Default": "WITH_MULTIAZ_STANDBY",
      "AllowedValues": [
        "SINGLE_AZ",
        "WITH_MULTIAZ_STANDBY"
      ]
    },
    "AllocatedStorage": {
      "Description": "The amount of storage to allocate for your DB storage type in GiB (gibibytes).",
      "Type": "Number",
      "Default": 400,
      "MinValue": 20,
      "MaxValue": 16384
    },
    "DbInstanceType": {
      "Description": "The Timestream for InfluxDB DB instance type to run InfluxDB on.",
      "Type": "String",
      "Default": "db.influx.medium",
      "AllowedValues": [
        "db.influx.medium",
        "db.influx.large",
        "db.influx.xlarge",
        "db.influx.2xlarge",
        "db.influx.4xlarge",
        "db.influx.8xlarge",
        "db.influx.12xlarge",
        "db.influx.16xlarge"
      ]
    },
    "DbStorageType": {
      "Description": "The Timestream for InfluxDB DB storage type to read and write InfluxDB data.",
      "Type": "String",
      "Default": "InfluxIOIncludedT1",
      "AllowedValues": [
        "InfluxIOIncludedT1",
        "InfluxIOIncludedT2",
        "InfluxIOIncludedT3"
      ]
    },
    "PubliclyAccessible": {
      "Description": "Configures the DB instance with a public IP to facilitate access.",
      "Type": "String",
      "Default": true,
      "AllowedValues": [
        true,
        false
      ]
    }
  },
  "Conditions": {
    "IsMultiAZ": {
      "Fn::Equals": [
        {"Ref": "DeploymentType"},
        "WITH_MULTIAZ_STANDBY"
      ]
    },
    "IsPublic": {
      "Fn::Equals": [
        {"Ref": "PubliclyAccessible"},
        true
      ]
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": {"Ref": "VPCCIDR"}
      }
    },
    "InternetGateway": {
      "Type": "AWS::EC2::InternetGateway",
      "Condition": "IsPublic"
    },
    "InternetGatewayAttachment": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "Condition": "IsPublic",
      "Properties": {
        "InternetGatewayId": {"Ref": "InternetGateway"},
        "VpcId": {"Ref": "VPC"}
      }
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            0,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            0,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        }
      }
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet",
      "Condition": "IsMultiAZ",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            1,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            1,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        }
      }
    },
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {"Ref": "VPC"}
      }
    },
    "DefaultRoute": {
      "Type": "AWS::EC2::Route",
      "Condition": "IsPublic",
      "DependsOn": "InternetGatewayAttachment",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "InternetGateway"}
      }
    },
    "Subnet1RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet1"}
      }
    },
    "Subnet2RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Condition": "IsMultiAZ",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet2"}
      }
    },
    "InfluxDBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "influxdb-sg",
        "GroupDescription": "Security group allowing port 8086 ingress for InfluxDB",
        "VpcId": {"Ref": "VPC"}
      }
    },
    "InfluxDBSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {"Ref": "InfluxDBSecurityGroup"},
        "IpProtocol": "tcp",
        "CidrIp": "0.0.0.0/0",
        "FromPort": 8086,
        "ToPort": 8086
      }
    },
    "InfluxDBLogsS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain"
    },
    "InfluxDBLogsS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {"Ref": "InfluxDBLogsS3Bucket"},
        "PolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*"},
              "Principal": {"Service": "timestream-influxdb.amazonaws.com"}
            },
            {
              "Action": "s3:*",
              "Effect": "Deny",
              "Resource": [
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/*"},
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}"}
              ],
              "Principal": "*",
              "Condition": {
                "Bool": {"aws:SecureTransport": false}
              }
            }
          ]
        }
      }
    },
    "DbInstance": {
      "Type": "AWS::Timestream::InfluxDBInstance",
      "DependsOn": "InfluxDBLogsS3BucketPolicy",
      "Properties": {
        "DbStorageType": {"Ref": "DbStorageType"},
        "AllocatedStorage": {"Ref": "AllocatedStorage"},
        "DbInstanceType": {"Ref": "DbInstanceType"},
        "Name": {"Ref": "DbInstanceName"},
        "Username": {"Ref": "InfluxDBUsername"},
        "Password": {"Ref": "InfluxDBPassword"},
        "Organization": {"Ref": "InfluxDBOrganization"},
        "Bucket": {"Ref": "InfluxDBBucket"},
        "PubliclyAccessible": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        },
        "DeploymentType": {"Ref": "DeploymentType"},
        "VpcSecurityGroupIds": [
          {"Ref": "InfluxDBSecurityGroup"}
        ],
        "VpcSubnetIds": {
          "Fn::If": [
            "IsMultiAZ",
            [
              {"Ref": "Subnet1"},
              {"Ref": "Subnet2"}
            ],
            [
              {"Ref": "Subnet1"}
            ]
          ]
        },
        "LogDeliveryConfiguration": {
          "S3Configuration": {
            "BucketName": {"Ref": "InfluxDBLogsS3Bucket"},
            "Enabled": true
          }
        }
      }
    }
  },
  "Outputs": {
    "VPC": {
      "Description": "A reference to the VPC used to create network resources",
      "Value": {"Ref": "VPC"}
    },
    "Subnets": {
      "Description": "A list of the subnets created",
      "Value": {
        "Fn::If": [
          "IsMultiAZ",
          {
            "Fn::Join": [
              ",",
              [
                {"Ref": "Subnet1"},
                {"Ref": "Subnet2"}
              ]
            ]
          },
          {"Ref": "Subnet1"}
        ]
      }
    },
    "Subnet1": {
      "Description": "A reference to the subnet in the 1st Availability Zone",
      "Value": {"Ref": "Subnet1"}
    },
    "Subnet2": {
      "Condition": "IsMultiAZ",
      "Description": "A reference to the subnet in the 2nd Availability Zone",
      "Value": {"Ref": "Subnet2"}
    },
    "InfluxDBSecurityGroup": {
      "Description": "Security group with port 8086 ingress rule",
      "Value": {"Ref": "InfluxDBSecurityGroup"}
    },
    "InfluxDBLogsS3Bucket": {
      "Description": "S3 Bucket containing InfluxDB logs from the DB instance",
      "Value": {"Ref": "InfluxDBLogsS3Bucket"}
    },
    "DbInstance": {
      "Description": "A reference to the Timestream for InfluxDB DB instance",
      "Value": {"Ref": "DbInstance"}
    },
    "InfluxAuthParametersSecretArn": {
      "Description": "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password.",
      "Value": {
        "Fn::GetAtt": [
          "DbInstance",
          "InfluxAuthParametersSecretArn"
        ]
      }
    },
    "Endpoint": {
      "Description": "The endpoint URL to connect to InfluxDB",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Fn::GetAtt": [
                "DbInstance",
                "Endpoint"
              ]
            },
            ":8086"
          ]
        ]
      }
    }
  }
}
```

### YAML
<a name="scenario-timestream-influxdb-example-2.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: "Network Configuration"
        Parameters:
          - VPCCIDR
      -
        Label:
          default: "Amazon Timestream for InfluxDB Configuration"
        Parameters:
          - DbInstanceName
          - InfluxDBUsername
          - InfluxDBPassword
          - InfluxDBOrganization
          - InfluxDBBucket
          - DbInstanceType
          - DbStorageType
          - AllocatedStorage
          - PubliclyAccessible
          - DeploymentType
    ParameterLabels:
      VPCCIDR:
        default: VPC CIDR

Parameters:
  # Network Configuration
  VPCCIDR:
    Description: Please enter the IP range (CIDR notation) for the new VPC
    Type: String
    Default: 10.0.0.0/16
  # Timestream for InfluxDB Configuration
  DbInstanceName:
    Description: The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.
    Type: String
    Default: mydbinstance
    MinLength: 3
    MaxLength: 40    
    AllowedPattern: ^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$
  # InfluxDB initial user configurations
  InfluxDBUsername:
    Description: The username of the initial admin user created in InfluxDB. Must start with a letter and can't end with a hyphen or contain two consecutive hyphens. For example, my-user1. This username will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.
    Type: String
    Default: admin
    MinLength: 1
    MaxLength: 64
  InfluxDBPassword:
    Description: The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS in your account.
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 64
    AllowedPattern: ^[a-zA-Z0-9]+$
  InfluxDBOrganization:
    Description: The name of the initial organization for the initial admin user in InfluxDB. An InfluxDB organization is a workspace for a group of users.
    Type: String
    Default: org
    MinLength: 1
    MaxLength: 64
  InfluxDBBucket:
    Description: The name of the initial InfluxDB bucket. All InfluxDB data is stored in a bucket. A bucket combines the concept of a database and a retention period (the duration of time that each data point persists). A bucket belongs to an organization.
    Type: String
    Default: bucket
    MinLength: 2
    MaxLength: 64
    AllowedPattern: ^[^_\"][^\"]*$
  DeploymentType:
    Description: Specifies whether the Timestream for InfluxDB is deployed as Single-AZ or with a MultiAZ Standby for High availability
    Type: String
    Default: WITH_MULTIAZ_STANDBY
    AllowedValues:
      - SINGLE_AZ
      - WITH_MULTIAZ_STANDBY
  AllocatedStorage:
    Description: The amount of storage to allocate for your DB storage type in GiB (gibibytes).
    Type: Number
    Default: 400
    MinValue: 20
    MaxValue: 16384
  DbInstanceType:
    Description: The Timestream for InfluxDB DB instance type to run InfluxDB on.
    Type: String
    Default: db.influx.medium
    AllowedValues:
      - db.influx.medium
      - db.influx.large
      - db.influx.xlarge
      - db.influx.2xlarge
      - db.influx.4xlarge
      - db.influx.8xlarge
      - db.influx.12xlarge
      - db.influx.16xlarge
  DbStorageType:
    Description: The Timestream for InfluxDB DB storage type to read and write InfluxDB data.
    Type: String
    Default: InfluxIOIncludedT1
    AllowedValues:
      - InfluxIOIncludedT1
      - InfluxIOIncludedT2
      - InfluxIOIncludedT3
  PubliclyAccessible:
    Description: Configures the DB instance with a public IP to facilitate access.
    Type: String
    Default: true
    AllowedValues:
      - true
      - false

Conditions:
  IsMultiAZ: !Equals [!Ref DeploymentType, WITH_MULTIAZ_STANDBY]
  IsPublic: !Equals [!Ref PubliclyAccessible, true]

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCIDR
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Condition: IsPublic
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Condition: IsPublic
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: !If [IsPublic, true, false]
  Subnet2:
    Type: AWS::EC2::Subnet
    Condition: IsMultiAZ
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [1, !GetAZs  '']
      CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: !If [IsPublic, true, false]
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  DefaultRoute:
    Type: AWS::EC2::Route
    Condition: IsPublic
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Condition: IsMultiAZ
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2
  InfluxDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "influxdb-sg"
      GroupDescription: "Security group allowing port 8086 ingress for InfluxDB"
      VpcId: !Ref VPC
  InfluxDBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref InfluxDBSecurityGroup
      IpProtocol: tcp
      CidrIp: 0.0.0.0/0
      FromPort: 8086
      ToPort: 8086
  InfluxDBLogsS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
  InfluxDBLogsS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref InfluxDBLogsS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*
            Principal:
              Service: timestream-influxdb.amazonaws.com
          - Action: "s3:*"
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/*
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: false
  DbInstance:
    Type: AWS::Timestream::InfluxDBInstance
    DependsOn: InfluxDBLogsS3BucketPolicy
    Properties:
      DbStorageType: !Ref DbStorageType
      AllocatedStorage: !Ref AllocatedStorage
      DbInstanceType: !Ref DbInstanceType
      Name: !Ref DbInstanceName
      Username: !Ref InfluxDBUsername
      Password: !Ref InfluxDBPassword
      Organization: !Ref InfluxDBOrganization
      Bucket: !Ref InfluxDBBucket
      PubliclyAccessible: !If [IsPublic, true, false]
      DeploymentType: !Ref DeploymentType
      VpcSecurityGroupIds: 
        - !Ref InfluxDBSecurityGroup
      VpcSubnetIds: !If
        - IsMultiAZ
        -
          - !Ref Subnet1
          - !Ref Subnet2
        -
          - !Ref Subnet1
      LogDeliveryConfiguration:
        S3Configuration:
          BucketName: !Ref InfluxDBLogsS3Bucket
          Enabled: true

Outputs:
  # Network Resources
  VPC:
    Description: A reference to the VPC used to create network resources
    Value: !Ref VPC
  Subnets:
    Description: A list of the subnets created
    Value: !If
      - IsMultiAZ
      - !Join [",", [!Ref Subnet1, !Ref Subnet2]]
      - !Ref Subnet1
  Subnet1:
    Description: A reference to the subnet in the 1st Availability Zone
    Value: !Ref Subnet1
  Subnet2:
    Condition: IsMultiAZ
    Description: A reference to the subnet in the 2nd Availability Zone
    Value: !Ref Subnet2
  InfluxDBSecurityGroup:
    Description: Security group with port 8086 ingress rule
    Value: !Ref InfluxDBSecurityGroup

  # Timestream for InfluxDB Resources
  InfluxDBLogsS3Bucket:
    Description: S3 Bucket containing InfluxDB logs from the DB instance
    Value: !Ref InfluxDBLogsS3Bucket
  DbInstance:
    Description: A reference to the Timestream for InfluxDB DB instance
    Value: !Ref DbInstance
  InfluxAuthParametersSecretArn:
    Description: "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password."
    Value: !GetAtt DbInstance.InfluxAuthParametersSecretArn
  Endpoint:
    Description: The endpoint URL to connect to InfluxDB
    Value: !Join ["", ["https://", !GetAtt DbInstance.Endpoint, ":8086"]]
```

# Implantar pilhas baseadas em Windows usando o CloudFormation
<a name="cfn-windows-stacks"></a>

Esta página fornece links para documentação de referência técnica dos recursos do CloudFormation comumente usados em implantações baseadas em Windows.

O CloudFormation oferece suporte para a implantação e o gerenciamento de pilhas Microsoft Windows via Infrastructure as Code (IaC). Você pode usar o CloudFormation para provisionamento automatizado de instâncias do EC2 baseadas em Windows, SQL Server no Amazon RDS e Microsoft Active Directory via Directory Service.

A AWS fornece Imagens de máquina da Amazon (AMIs) pré-configuradas e projetadas especificamente para plataformas Windows para ajudar você a implantar rapidamente aplicações no Amazon EC2. Essas AMIs incluem configurações padrão da Microsoft e personalizações específicas para a AWS. Com o CloudFormation, é possível escolher uma AMI apropriada, iniciar uma instância e acessá-la usando a Conexão de Área de Trabalho Remota, exatamente da mesma forma que faria com qualquer outro Windows Server. As AMIs contêm componentes essenciais de software, incluindo o EC2Launch (as versões variam de acordo com a edição do Windows Server), AWS Systems Manager, CloudFormation, Ferramentas da AWS para PowerShell e vários drivers de rede, armazenamento e vídeo para garantir performance e compatibilidade otimizadas com os serviços da AWS. Para obter mais informações, consulte a [Referência da AMI do Windows da AWS](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

O CloudFormation também oferece suporte a ferramentas de configuração de software, como scripts `UserData`, que podem executar comandos do PowerShell ou comandos em lote quando uma instância do EC2 é inicializada pela primeira vez. Ele também oferece scripts auxiliares (`cfn-init`, `cfn-signal`, `cfn-get-metadata` e `cfn-hup`) e oferece suporte a metadados `AWS::CloudFormation::Init` para gerenciar pacotes, arquivos e serviços em instâncias Windows.

Para ambientes corporativos, o CloudFormation permite unir domínios, gerenciar licenças do Windows via modelos de licenciamento do EC2 e lidar de forma segura com credenciais via AWS Secrets Manager. Combinado com modelos controlados por versão e implantações repetíveis, o CloudFormation ajuda as organizações a manter ambientes Windows consistentes, seguros e escaláveis em várias contas e Regiões da AWS.

Para obter detalhes sobre os recursos do CloudFormation comumente usados em implantações baseadas em Windows, consulte os tópicos de referência técnica a seguir.


| Tipo de recurso | Descrição | 
| --- | --- | 
|  [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)  |  Para iniciar instâncias do EC2 do Windows.  | 
|  [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)  |  Para definir regras de firewall para workloads do Windows.  | 
|  [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)  |  Para escalar instâncias do EC2 do Windows.  | 
|  [AWS::DirectoryService::MicrosoftAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html)  |  Para implantar o Microsoft Active Directory.  | 
|  [AWS::FSx::FileSystem](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-fsx-filesystem.html)  |  Para implantar o FSx for Windows File Server.  | 
|  [AWS::RDS::DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)  |  Para provisionamento de SQL Server no Amazon RDS.  | 
|  [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)  |  Usado nos metadados do EC2 para configurar instâncias.  Para obter mais informações, consulte [Fazer o bootstrap de pilhas do CloudFormation baseadas em Windows](cfn-windows-stacks-bootstrapping.md).  | 
|  [AWS::SecretsManager::Secret](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-secretsmanager-secret.html)  |  Para gerenciar credenciais e senhas do Windows com segurança.  | 
|  [AWS::SSM::Parameter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ssm-parameter.html)  |  Para armazenar valores de configuração com segurança.  | 
|  [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html) [AWS::IAM::Perfil](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)  |  Para conceder permissões a aplicações em execução em instâncias do EC2.  | 

# Fazer o bootstrap de pilhas do CloudFormation baseadas em Windows
<a name="cfn-windows-stacks-bootstrapping"></a>

Este tópico descreve como fazer bootstrap de uma pilha do Windows e solucionar problemas na criação da pilha. 

**Topics**
+ [Dados do usuário em instâncias do EC2](#cfn-windows-bootstrapping-user-data)
+ [CloudFormation scripts auxiliares](#cfn-windows-bootstrapping-helper-scripts)
+ [Exemplo de bootstrap de uma pilha do Windows](#cfn-windows-bootstrapping-example)
+ [Escapar barras invertidas nos caminhos dos arquivos do Windows](#cfn-windows-stacks-escape-backslashes)
+ [Gerenciar serviços da Windows](#cfn-windows-stacks-manage-windows-services)
+ [Como solucionar problemas de criação de pilhas](#cfn-windows-stacks-troubleshooting)

## Dados do usuário em instâncias do EC2
<a name="cfn-windows-bootstrapping-user-data"></a>

Os dados do usuário são um recurso do Amazon EC2 que permite que você passe scripts ou informações de configuração para uma instância do EC2 quando ela é inicializada. 

Para instâncias do EC2 para Windows:
+ Você pode usar scripts em lote (usando tags `<script>`) ou scripts PowerShell (usando tags `<powershell>`).
+ A execução de scripts é realizada por EC2Launch.

**Importante**  
Se você estiver criando sua própria AMI do Windows para uso com o CloudFormation, verifique se o EC2Launch v2 está configurado corretamente. O EC2Launch v2 é necessário para que as ferramentas de bootstrap do CloudFormation inicializem e configurem adequadamente as instâncias Windows durante a criação da pilha. Para obter mais informações, consulte [Usar o agente do EC2Launch v2 para realizar tarefas durante a inicialização da instância do EC2 do Windows](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html) no *Guia do usuário do Amazon EC2*.  
Para obter informações sobre as AMIs da AWS para Windows disponíveis, consulte [AWS Windows AMI Reference](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

## CloudFormation scripts auxiliares
<a name="cfn-windows-bootstrapping-helper-scripts"></a>

Os scripts auxiliares são utilitários para configurar instâncias durante o processo de bootstrap. Usados com os dados do usuário do Amazon EC2, eles oferecem opções de configuração avançadas.

O CloudFormation fornece os seguintes scripts auxiliares do Python que podem ser usados para instalar software e iniciar serviços em uma instância do Amazon EC2 criada por você como parte da pilha:
+  `cfn-init`: usado para recuperar e interpretar os metadados de recursos, instalar pacotes, criar arquivos e iniciar serviços.
+  `cfn-signal`: usado para sinalizar com uma `CreationPolicy` para que você possa sincronizar outros recursos da pilha quando o recurso ou a aplicação exigidos estiverem prontos.
+  `cfn-get-metadata`: usado para recuperar metadados de um recurso ou caminho para uma chave específica.
+  `cfn-hup`: usado para verificar se há atualizações para os metadados e executar hooks personalizados quando alterações são detectadas.

Você chama os scripts diretamente do seu modelo. Os scripts funcionam em conjunto com os metadados de recurso que estão definidos no mesmo modelo. Os scripts são executados na instância do Amazon EC2 durante o processo de criação da pilha.

Para obter mais informações, consulte [Referência de scripts auxiliares do CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) no *Guia de referência de modelos do CloudFormation*.

## Exemplo de bootstrap de uma pilha do Windows
<a name="cfn-windows-bootstrapping-example"></a>

Vamos examinar exemplos de trechos de um modelo do Windows Server que executa as seguintes ações:
+ Lança uma instância do EC2 denominada `TestInstance` em uma AMI do Windows Server 2022.
+ Cria um arquivo de teste simples para verificar se `cfn-init` está funcionando.
+ Configura `cfn-hup` para gerenciamento contínuo das configurações.
+ Usa uma `CreationPolicy` para garantir que a instância sinalize conclusões bem-sucedidas.

O script auxiliar `cfn-init` é usado para realizar cada uma dessas ações com base em informações do recurso `AWS::CloudFormation::Init` no modelo.

A seção `AWS::CloudFormation::Init` é denominada `TestInstance` e começa com a declaração a seguir.

```
TestInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      configSets:
        default:
          - create_files
          - start_services
```

A seguir, a seção `files` de `AWS::CloudFormation::Init` é declarada.

```
      create_files:
        files:
          c:\cfn\test.txt:
            content: !Sub |
              Hello from ${AWS::StackName}
          c:\cfn\cfn-hup.conf:
            content: !Sub |
              [main]
              stack=${AWS::StackName}
              region=${AWS::Region}
              interval=2
          c:\cfn\hooks.d\cfn-auto-reloader.conf:
            content: !Sub |
              [cfn-auto-reloader-hook]
              triggers=post.update
              path=Resources.TestInstance.Metadata.AWS::CloudFormation::Init
              action=cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
```

Três arquivos são criados aqui e colocados no diretório `C:\cfn` da instância do servidor:
+ `test.txt`, um arquivo de teste simples que verifica se `cfn-init` está funcionando corretamente e pode criar arquivos com conteúdo dinâmico.
+ `cfn-hup.conf`, o arquivo de configuração de `cfn-hup` com um intervalo de verificação de 2 minutos.
+ `cfn-auto-reloader.conf`, o arquivo de configuração do hook usado por `cfn-hup` para iniciar uma atualização (chamando `cfn-init`) quando os metadados em `AWS::CloudFormation::Init` são alteados.

A próxima seção `start_services` configura serviços do Windows.

```
      start_services:
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Esta seção garante que o serviço `cfn-hup` seja iniciado e que será reiniciado automaticamente se os arquivos de configuração forem modificados. O serviço monitora alterações nos metadados do CloudFormation e executa `cfn-init` novamente quando atualizações são detectadas.

A próxima seção é `Properties`.

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Metadata:
    AWS::CloudFormation::Init:
      # ... metadata configuration ...
  Properties:
    InstanceType: t2.large
    ImageId: '{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base}}'
    SecurityGroupIds:
      - !Ref InstanceSecurityGroup
    KeyName: !Ref KeyPairName
    UserData:
      Fn::Base64: !Sub |
        <powershell>
        cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
        cfn-signal.exe -e $lastexitcode --stack ${AWS::StackName} --resource TestInstance --region ${AWS::Region}
        </powershell>
```

Nesta seção, a propriedade `UserData` contém um script PowerShell que será executado por EC2Launch, entre tags `<powershell>`. O script executa `cfn-init` com o configSet `default` e depois usa `cfn-signal` para retornar o código de saída ao CloudFormation. A `CreationPolicy` é usada para garantir que a instância esteja configurada corretamente antes que a criação da pilha seja considerada concluída.

A propriedade `ImageId` usa um parâmetro público do Systems Manager Parameter Store para recuperar automaticamente o ID da AMI mais recente do Windows Server 2022 . Essa abordagem elimina a necessidade de mapeamentos de AMIs específicas da região e garante que você sempre obtenha a AMI mais recente. O uso de parâmetros do Systems Manager para IDs de AMIs é uma prática recomendada para manter as referências de AMIs atualizadas. Se você planejar se conectar à instância, certifique-se de a propriedade `SecurityGroupIds` referencie um grupo de segurança que permita acesso por RDP.

A `CreationPolicy` é declarada como parte das propriedades do recurso e especifica um tempo limite. O comando `cfn-signal` nos dados do usuário sinaliza quando a configuração da instância foi concluída:

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Properties:
    # ... other properties ...
```

Como o processo de inicialização é mínimo e apenas cria arquivos e inicia serviços, a `CreationPolicy` aguarda 20 minutos (PT20M) antes de atingir o tempo limite. O tempo limite é especificado usando o formato de duração ISO 8601. Observe que as instâncias do Windows geralmente demoram mais para serem iniciadas que as instâncias do Linux, por isso, teste cuidadosamente para determinar os melhores valores de tempo limite para as suas necessidades.

Se tudo correr bem, a `CreationPolicy` será concluída com êxito e você poderá acessar a instância do Windows Server usando seu endereço IP público. Depois que a criação da pilha é concluída, o ID e endereço IP da instância são exibidos na guia **Saídas** do console do CloudFormation. 

```
Outputs:
  InstanceId:
    Value: !Ref TestInstance
    Description: Instance ID of the Windows Server
  PublicIP:
    Value: !GetAtt TestInstance.PublicIp
    Description: Public IP address of the Windows Server
```

Você também pode verificar manualmente se a inicialização funcionou corretamente conectando-se à instância por RDP e verificando se o arquivo `C:\cfn\test.txt` existe e contém o conteúdo esperado. Para obter informações sobre conexão a instâncias do Windows, consulte [Conexão com a instância do Windows usando um cliente RDP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html) no *Manual do usuário do Amazon EC2*.

## Escapar barras invertidas nos caminhos dos arquivos do Windows
<a name="cfn-windows-stacks-escape-backslashes"></a>

Ao referenciar os caminhos do Windows nos modelos do CloudFormation, lembre-se sempre de escapar adequadamente as barras invertidas (`\`) de acordo com o formato do modelo sendo usado.
+ Para modelos JSON, você deve usar barras invertidas duplas nos caminhos dos arquivos do Windows porque o JSON trata a barra invertida como um caractere de escape. A primeira barra invertida escapa da segunda, resultando na interpretação de uma única barra invertida literal.

  ```
  "commands" : {
    "1-extract" : {
      "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
    }
  }
  ```
+ Para modelos YAML, barras invertidas simples normalmente são suficientes.

  ```
  commands:
    1-extract:
      command: C:\SharePoint\SharePointFoundation2010.exe /extract:C:\SharePoint\SPF2010 /quiet /log:C:\SharePoint\SharePointFoundation2010-extract.log
  ```

## Gerenciar serviços da Windows
<a name="cfn-windows-stacks-manage-windows-services"></a>

Os serviços do Windows são gerenciados da mesma forma que os serviços do Linux, exceto pelo uso de uma chave `windows` em vez de `sysvinit`. O exemplo a seguir iniciará o serviço `cfn-hup`, definirá o serviço como automático e o reiniciará se `cfn-init` modificar os arquivos de configuração `c:\cfn\cfn-hup.conf` ou `c:\cfn\hooks.d\cfn-auto-reloader.conf`.

```
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

É possível gerenciar outros serviços do Windows da mesma maneira, usando o nome, não o nome de exibição, para referenciar o serviço.

## Como solucionar problemas de criação de pilhas
<a name="cfn-windows-stacks-troubleshooting"></a>

Em caso de falha na pilha durante a criação, o comportamento padrão é de reversão em caso de falha. Embora normalmente seja um bom padrão, pois evita cobranças desnecessários, isso dificulta a depuração por causa da falha na criação da pilha.

Para desativar esse comportamento ao criar ou atualizar sua pilha com o console do CloudFormation, escolha a opção **Preservar recursos provisionados com sucesso** em **Opções de falha de pilha**. Para obter mais informações, consulte [Escolha como lidar com falhas ao provisionar recursos](stack-failure-options.md). Isso permite a você fazer login na instância e visualizar os arquivos de log para identificar os problemas encontrados na execução dos scripts de startup.

Os logs importantes a serem observados são:
+ O log de configuração do EC2 em `%ProgramData%\Amazon\EC2Launch\log\agent.log`
+ O log de **cfn-init** em `C:\cfn\log\cfn-init.log` (verifique os códigos de saída e as mensagens de erro para pontos de falha específicos)

Para obter mais logs, consulte os seguintes tópicos no *Guia do usuário do Amazon EC2*:
+ [EC2Launch Estrutura de diretórios do](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2config-service.html#UsingConfigXML_WinAMI)
+ [EC2Launch Estrutura de diretório do v](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html#ec2launch-v2-directory)

Para obter mais informações sobre como solucionar problemas de inicialização, consulte [How do I troubleshoot helper scripts that won't bootstrap in a CloudFormation stack with Windows instances?](https://repost.aws/knowledge-center/cloudformation-helper-scripts-windows).

# Amplie os recursos do seu modelo com os tipos de recursos fornecidos pelo CloudFormation
<a name="cloudformation-supplied-resource-types"></a>

O CloudFormation oferece vários tipos de recursos que você pode usar em seu modelo de pilha para extender suas capacidades além daquelas de um simples modelo de pilha.

Esses tipos de recursos incluem:


| Tipo de recurso | Descrição | Documentação | 
| --- | --- | --- | 
|  Recursos personalizados  |  O tipo de recurso `AWS::CloudFormation::CustomResource` permite criar recursos personalizados capazes de executar tarefas de provisionamento específicas ou incluir recursos que não estão disponíveis como tipos de recursos do CloudFormation.  |  [Recursos personalizados](template-custom-resources.md) | 
|  Macros  |  O tipo de recurso `AWS::CloudFormation::Macro` define um trecho reutilizável de código que pode executar o processamento personalizado nos modelos do CloudFormation. Macros podem modificar seus modelos, gerar recursos adicionais ou realizar outras operações personalizadas durante a criação ou as atualizações da pilha.  | [Macros de modelo](template-macros.md) | 
|  Pilhas aninhadas  |  O tipo de recurso `AWS::CloudFormation::Stack` permite que você crie pilhas aninhadas em seus modelos do CloudFormation para obter arquiteturas de pilha mais modulares e reutilizáveis.  | [Pilhas aninhadas](using-cfn-nested-stacks.md) | 
|  StackSet  |  O tipo de recurso `AWS::CloudFormation::StackSet` cria ou atualiza um CloudFormation StackSet, que é um contêiner para pilhas que pode ser implantado em várias regiões e Contas da AWS.  | [Gerenciar pilhas com StackSets](what-is-cfnstacksets.md) | 
|  Condição de espera  |  O tipo de recurso `AWS::CloudFormation::WaitCondition` pausa a criação ou atualização da pilha até que uma condição específica seja atendida, como a conclusão bem-sucedida de um processo de longa execução ou a disponibilidade de recursos externos.   | [Condições de espera](using-cfn-waitcondition.md) | 
|  Processamento de condição de espera  |  O tipo de recurso `AWS::CloudFormation::WaitConditionHandle` funciona junto com o tipo de recurso `AWS::CloudFormation::WaitCondition`. Ele fornece um URL pré-assinado que é usado para enviar sinais indicando que uma determinada condição foi atendida. Esses sinais permitem que o processo de criação ou atualização da pilha continue.  | [Condições de espera](using-cfn-waitcondition.md) | 

# Crie uma lógica de provisionamento personalizada com recursos personalizados
<a name="template-custom-resources"></a>

Os recursos personalizados fornecem uma maneira de gravar uma lógica de provisionamento personalizada nos modelos do CloudFormation e fazer com que o CloudFormation a execute sempre que você criar, atualizar (se você alterou o recurso personalizado) ou excluir uma pilha. Isso pode ser útil quando os requisitos de provisionamento envolvem uma lógica complexa ou fluxos de trabalho que não podem ser expressos com os tipos de recursos integrados do CloudFormation.

Por exemplo, talvez você deseje incluir recursos que não estão disponíveis como tipos de recursos do CloudFormation. Você pode incluir esses recursos usando recursos personalizados. Dessa forma, você ainda poderá gerenciar todos os recursos relacionados em uma única pilha.

Para definir um recurso personalizado em seu modelo do CloudFormation, você usa o tipo de recurso `AWS::CloudFormation::CustomResource` ou `Custom::MyCustomResourceTypeName`. Os recursos personalizados requerem uma propriedade, o token de serviço, que especifica para qual local o CloudFormation envia as solicitações, como um tópico do Amazon SNS ou uma função do Lambda.

Os tópicos apresentados a seguir fornecem informações sobre como usar os recursos personalizados.

**Topics**
+ [Como os recursos personalizados funcionam](#how-custom-resources-work)
+ [Tempo limite de resposta](#response-timeout)
+ [Referência personalizada de solicitações e respostas de recursos do CloudFormation](crpg-ref.md)
+ [Recursos personalizados baseados no Amazon SNS](template-custom-resources-sns.md)
+ [Recursos personalizados baseados no Lambda](template-custom-resources-lambda.md)

**nota**  
O registro e os recursos personalizados do CloudFormation oferecem seus próprios benefícios. Os recursos personalizados oferecem os seguintes benefícios:  
Você não precisa registrar o recurso.
Você pode incluir um recurso inteiro como parte de um modelo sem registrá-lo.
Aceta as operações `Create`, `Update` e `Delete`
As vantagens que os recursos baseados no registro oferecem são as seguintes:  
Oferece suporte à modelagem, ao provisionamento e ao gerenciamento de recursos de aplicações de terceiros
Suporta as operações `Create`, `Read`, `Update`, `Delete` e `List` (`CRUDL`)
Suporta detecção de desvio em tipos de recursos privados e de terceiros
Ao contrário dos recursos personalizados, os recursos baseados em registro não precisarão associar um tópico do Amazon SNS ou uma função Lambda para executar operações `CRUDL`. Para obter mais informações, consulte [Gerenciar extensões com o registro do CloudFormation](registry.md).

## Como os recursos personalizados funcionam
<a name="how-custom-resources-work"></a>

O processo geral para configurar um novo recurso personalizado inclui as etapas a seguir. Essas etapas envolvem dois perfis: o *provedor de recursos personalizados* que é o proprietário do recurso personalizado e o *desenvolvedor de modelos* que cria um modelo que inclui um tipo de recurso personalizado. Eles podem ser a mesma pessoa, mas, se não forem, o provedor de recursos personalizados deverá trabalhar com o desenvolvedor de modelos.

1. O provedor de recursos personalizados escreve uma lógica que determina como lidar com as solicitações do CloudFormation e realizar ações no recurso personalizado. 

1. O provedor de recursos personalizados cria o tópico do Amazon SNS ou a função do Lambda para a qual o CloudFormation pode enviar solicitações. O tópico do Amazon SNS ou a função do Lambda devem estar na mesma região em que a pilha será criada.

1. O provedor de recursos personalizados fornece o ARN do tópico do Amazon SNS ou o ARN da função do Lambda ao desenvolvedor de modelos.

1. O desenvolvedor de modelos define o recurso personalizado no modelo do CloudFormation. Isso inclui um token de serviço e todos os parâmetros de dados de entrada. O token de serviço e a estrutura dos dados de entrada são definidos pelo provedor de recursos personalizados. O token de serviço especifica o ARN do tópico do Amazon SNS ou o ARN da função do Lambda e sempre é obrigatório, mas os dados de entrada são opcionais, dependendo do recurso personalizado.

Sempre que alguém usa o modelo para criar, atualizar ou excluir o recurso personalizado, o CloudFormation envia uma solicitação para o token de serviço especificado e espera por uma resposta antes de prosseguir com a operação da pilha. 

Este é o resumo do fluxo de criação de uma pilha usando o modelo: 

1. O CloudFormation envia uma solicitação para o token de serviço especificado. A solicitação inclui informações como o tipo de solicitação e um URL do bucket do Amazon S3 pré-assinado, para o qual o recurso personalizado envia as respostas. Para obter mais informações sobre o que está incluído na solicitação, consulte [Referência personalizada de solicitações e respostas de recursos do CloudFormation](crpg-ref.md).

   O exemplo de dados a seguir mostra o que o CloudFormation inclui em uma solicitação de `Create`. Neste exemplo, `ResourceProperties` permite que o CloudFormation crie uma carga útil personalizada para enviar à função do Lambda.

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::TestResource",
      "LogicalResourceId" : "MyTestResource",
      "ResourceProperties" : {
         "Name" : "Value",
         "List" : [ "1", "2", "3" ]
      }
   }
   ```

1. O provedor de recursos personalizados realiza o processamento da solicitação do CloudFormation e retorna uma resposta de `SUCCESS` ou de `FAILED` para o URL assinado previamente. O custom resource provider fornece a resposta em um arquivo formatado em JSON e o carrega no URL do S3 pré-assinado. Para obter mais informações, consulte [Carregar objetos com URLs pré-assinados](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html) no *Guia do Usuário do Amazon Simple Storage Service*.

   Na resposta, o custom resource provider também pode incluir pares de nome e valor que o template developer pode acessar. Por exemplo, a resposta poderá incluir dados de saída se a solicitação tiver sido bem-sucedida ou uma mensagem de erro se a solicitação tiver falhado. Para obter mais informações sobre respostas, consulte [Referência personalizada de solicitações e respostas de recursos do CloudFormation](crpg-ref.md).
**Importante**  
Se os pares de nome/valor contiverem informações confidenciais, você deverá utilizar o campo `NoEcho` para mascarar a saída do recurso personalizado. Caso contrário, os valores estarão visíveis por meio de APIs que exibem valores de propriedades (como `DescribeStackEvents`).  
Para obter mais informações sobre como usar `NoEcho` para mascarar informações confidenciais, consulte a prática recomendada [Não incorporar credenciais em seus modelos](security-best-practices.md#creds).

   O custom resource provider é responsável por escutar e responder à solicitação. Por exemplo, para notificações do Amazon SNS, o provedor de recursos personalizados deve atuar como receptor e responder às notificações enviadas para um ARN de tópico específico. O CloudFormation espera e atua como receptor para uma resposta no local do URL assinado previamente.

   Os seguintes dados de exemplo mostram o que um recurso personalizado pode incluir em uma resposta:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MyTestResource",
      "PhysicalResourceId" : "TestResource1",
      "Data" : {
         "OutputName1" : "Value1",
         "OutputName2" : "Value2",
      }
   }
   ```

1. Após obter uma resposta de `SUCCESS`, o CloudFormation prossegue com a operação de pilha. Caso uma resposta `FAILED` ou nenhuma resposta seja retornada, a operação falhará. Todos os dados de saída do recurso personalizado são armazenados no local do URL pré-assinado. O desenvolvedor de modelos pode recuperar os dados usando a função [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt).

**nota**  
Se você usar o AWS PrivateLink, os recursos personalizados da VPC deverão ter acesso aos buckets do S3 específicos para o CloudFormation. Os recursos personalizados devem enviar respostas a um URL pré-assinado do Amazon S3. Se não puderem enviar respostas para o Amazon S3, o CloudFormation não receberá uma resposta e há falha na operação de pilha. Para obter mais informações, consulte [Acessar o CloudFormation usando um endpoint de interface (AWS PrivateLink)](vpc-interface-endpoints.md).

## Tempo limite de resposta
<a name="response-timeout"></a>

O tempo limite padrão para o recurso personalizado é de 3600 segundos (1 hora). Se nenhuma resposta for recebida durante esse período, a operação de pilha falhará.

É possível ajustar o valor do tempo limite com base em quanto tempo você espera que o recurso personalizado leve para responder. Por exemplo, ao provisionar um recurso personalizado que invoca uma função do Lambda que deve responder em cinco minutos, você pode definir um tempo limite de cinco minutos no modelo de pilha especificando a propriedade `ServiceTimeout`. Para obter mais informações, consulte [Referência personalizada de solicitações e respostas de recursos do CloudFormation](crpg-ref.md). Dessa forma, se houver um erro na função do Lambda que provoque sua paralisação, o CloudFormation determinará que houve falha na operação de pilha após cinco minutos, em vez de esperar a hora inteira. 

Porém, tenha cuidado para não definir um valor de tempo limite muito pequeno. Para evitar que o tempo limite se esgote inesperadamente, certifique-se de que o recurso personalizado tenha tempo suficiente para realizar as ações necessárias e retornar uma resposta.

# Referência personalizada de solicitações e respostas de recursos do CloudFormation
<a name="crpg-ref"></a>

O CloudFormation gerencia recursos personalizados por meio de um protocolo de solicitação-resposta que se comunica com seu provedor de recursos personalizados. Cada solicitação inclui um tipo de solicitação (`Create`, `Update` ou `Delete`) e segue esse fluxo de trabalho de alto nível:

1. Um desenvolvedor de modelos define um recurso personalizado com um `ServiceToken` e `ServiceTimeout` no modelo e inicia uma operação de pilha.

1. O CloudFormation envia uma solicitação JSON ao provedor de recursos personalizados por meio do SNS ou do Lambda.

1. O provedor de recursos personalizados processa a solicitação e retorna uma resposta JSON para um URL pré-assinado do bucket do Amazon S3 antes que o período de tempo limite expire.

1. O CloudFormation lê a resposta e prossegue para a operação da pilha. Se nenhuma resposta for recebida antes do tempo limite terminar, a solicitação será considerada malsucedida e a operação de pilha falhará.

Para obter mais informações, consulte [Como os recursos personalizados funcionam](template-custom-resources.md#how-custom-resources-work).

Esta seção descreve a estrutura, os parâmetros e as respostas esperadas para cada tipo de solicitação.

**nota**  
O tamanho total do corpo da resposta não pode exceder 4096 bytes.

## Configuração do modelo
<a name="crpg-ref-template-setup"></a>

Ao definir um recurso personalizado em um modelo, o desenvolvedor do modelo usa [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html) com as seguintes propriedades:

`ServiceToken`  
Um ARN de tópico do Amazon SNS ou um ARN de função do Lambda da mesma região que a pilha.  
*Obrigatório*: Sim  
*Tipo:* string

`ServiceTimeout`  
O tempo máximo, em segundos, antes que a operação de um recurso personalizado atinja o tempo limite. Esse valor deve estar entre 1 e 3600. Padrão: 3600 segundos (1 hora).  
*Obrigatório*: não  
*Tipo:* string

São compatíveis propriedades adicionais de recursos. As propriedades do recurso serão incluídas como `ResourceProperties` na solicitação. O provedor de recursos personalizados deve determinar quais propriedades são válidas e seus valores aceitáveis.

## Objeto de solicitação
<a name="crpg-ref-requesttypes"></a>

------
#### [ Create ]

Quando o desenvolvedor de modelos cria uma pilha que contém um recurso personalizado, o CloudFormation envia uma solicitação com `RequestType` definido como `Create`.

Crie solicitações que contenha os seguintes campos:

`RequestType`  
`Create`.  
*Obrigatório*: Sim  
*Tipo:* string

`RequestId`  
Um ID exclusivo para a solicitação.  
Combinar `StackId` com `RequestId` forma um valor que é possível utilizar para identificar exclusivamente uma solicitação em um recurso personalizado específico.  
*Obrigatório*: Sim  
*Tipo:* string

`StackId`  
O nome do recurso da Amazon (ARN) que identifica a pilha que contém o recurso personalizado.  
Combinar `StackId` com `RequestId` forma um valor que é possível utilizar para identificar exclusivamente uma solicitação em um recurso personalizado específico.  
*Obrigatório*: Sim  
*Tipo:* string

`ResponseURL`  
O URL de resposta identifica um bucket do S3 pré-assinado que recebe respostas do provedor de recursos personalizados para o CloudFormation.  
*Obrigatório*: Sim  
*Tipo:* string

`ResourceType`  
O tipo de recurso escolhido pelo desenvolvedor do modelo do recurso personalizado no modelo do CloudFormation. Os nomes de tipos de recursos personalizados podem incluir até 60 caracteres, incluindo alfanuméricos e os seguintes caracteres: `_@-`.  
*Obrigatório*: Sim  
*Tipo:* string

`LogicalResourceId`  
O nome do modelo escolhido pelo desenvolvedor (ID lógico) do recurso personalizado no modelo do CloudFormation.  
*Obrigatório*: Sim  
*Tipo:* string

`ResourceProperties`  
Esse campo apresenta o conteúdo do objeto `Properties` enviado pelo desenvolvedor de modelos. Seu conteúdo é definido pelo provedor de recursos personalizados.  
*Obrigatório*: não  
*Tipo*: objeto JSON

*Exemplo*

```
{
   "RequestType" : "Create",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-create-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Update ]

Quando o desenvolvedor de modelos faz alterações nas propriedades de uma pilha que contém um recurso personalizado e atualiza a pilha, o CloudFormation envia uma solicitação ao provedor de recursos personalizados com `RequestType` definido como `Update`. Isso significa que o código do recurso personalizado não precisa detectar as alterações nos recursos, pois sabe que as propriedades foram alteradas quando o tipo de solicitação é `Update`.

Atualize solicitações que contenham os seguintes campos:

`RequestType`  
`Update`.  
*Obrigatório*: Sim  
*Tipo:* string

`RequestId`  
Um ID exclusivo para a solicitação.  
Combinar `StackId` com `RequestId` forma um valor que é possível utilizar para identificar exclusivamente uma solicitação em um recurso personalizado específico.  
*Obrigatório*: Sim  
*Tipo:* string

`StackId`  
O nome do recurso da Amazon (ARN) que identifica a pilha que contém o recurso personalizado.  
Combinar `StackId` com `RequestId` forma um valor que é possível utilizar para identificar exclusivamente uma solicitação em um recurso personalizado específico.  
*Obrigatório*: Sim  
*Tipo:* string

`ResponseURL`  
O URL de resposta identifica um bucket do S3 pré-assinado que recebe respostas do provedor de recursos personalizados para o CloudFormation.  
*Obrigatório*: Sim  
*Tipo:* string

`ResourceType`  
O tipo de recurso escolhido pelo desenvolvedor do modelo do recurso personalizado no modelo do CloudFormation. Os nomes de tipos de recursos personalizados podem incluir até 60 caracteres, incluindo alfanuméricos e os seguintes caracteres: `_@-`. Não é possível alterar o tipo durante uma atualização.  
*Obrigatório*: Sim  
*Tipo:* string

`LogicalResourceId`  
O nome do modelo escolhido pelo desenvolvedor (ID lógico) do recurso personalizado no modelo do CloudFormation.  
*Obrigatório*: Sim  
*Tipo:* string

`PhysicalResourceId`  
Um ID físico definido por um provedor de recursos personalizados exclusivo para esse provedor.  
*Obrigatório*: Sim  
*Tipo:* string

`ResourceProperties`  
Esse campo apresenta o conteúdo do objeto `Properties` enviado pelo desenvolvedor de modelos. Seu conteúdo é definido pelo provedor de recursos personalizados.  
*Obrigatório*: não  
*Tipo*: objeto JSON

`OldResourceProperties`  
Usado apenas para solicitações `Update`. Os valores da propriedade do recurso que foram declarados anteriormente pelo desenvolvedor do modelo no modelo do CloudFormation.  
*Obrigatório*: sim  
*Tipo*: objeto JSON

*Exemplo*

```
{
   "RequestType" : "Update",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-update-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "new-string",
      "key2" : [ "new-list" ],
      "key3" : { "key4" : "new-map" }
   },
   "OldResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Delete ]

Quando o desenvolvedor de modelos exclui uma pilha ou remove um recurso personalizado do modelo, e depois atualiza a pilha, o CloudFormation envia uma solicitação com `RequestType` definido como `Delete`.

Exclua solicitações que contenha os seguintes campos:

`RequestType`  
`Delete`.  
*Obrigatório*: Sim  
*Tipo:* string

`RequestId`  
Um ID exclusivo para a solicitação.  
*Obrigatório*: Sim  
*Tipo:* string

`StackId`  
O nome do recurso da Amazon (ARN) que identifica a pilha que contém o recurso personalizado.  
*Obrigatório*: Sim  
*Tipo:* string

`ResponseURL`  
O URL de resposta identifica um bucket do S3 pré-assinado que recebe respostas do provedor de recursos personalizados para o CloudFormation.  
*Obrigatório*: Sim  
*Tipo:* string

`ResourceType`  
O tipo de recurso escolhido pelo desenvolvedor do modelo do recurso personalizado no modelo do CloudFormation. Os nomes de tipos de recursos personalizados podem incluir até 60 caracteres, incluindo alfanuméricos e os seguintes caracteres: `_@-`.  
*Obrigatório*: Sim  
*Tipo:* string

`LogicalResourceId`  
O nome do modelo escolhido pelo desenvolvedor (ID lógico) do recurso personalizado no modelo do CloudFormation.  
*Obrigatório*: Sim  
*Tipo:* string

`PhysicalResourceId`  
Um ID físico definido por um provedor de recursos personalizados exclusivo para esse provedor.  
*Obrigatório*: Sim  
*Tipo:* string

`ResourceProperties`  
Esse campo apresenta o conteúdo do objeto `Properties` enviado pelo desenvolvedor de modelos. Seu conteúdo é definido pelo provedor de recursos personalizados.  
*Obrigatório*: não  
*Tipo*: objeto JSON

*Exemplo*

```
{
   "RequestType" : "Delete",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-delete-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------

## Objeto da resposta
<a name="crpg-ref-responses"></a>

O provedor de recursos personalizados envia uma resposta para o URL pré-assinado para todos os tipos de solicitação. Se o provedor de recursos personalizados não enviar uma resposta, o CloudFormation vai esperar até que a operação atinja o tempo limite.

A resposta deve ser um objeto JSON com os seguintes campos:

`Status`  
Deve ser `SUCCESS` ou `FAILED`.  
*Obrigatório*: Sim  
*Tipo:* string

`RequestId`  
Um ID exclusivo para a solicitação. Copie esse valor exatamente como ele aparece na solicitação.  
*Obrigatório*: Sim  
*Tipo:* string

`StackId`  
O nome do recurso da Amazon (ARN) que identifica a pilha que contém o recurso personalizado. Copie esse valor exatamente como ele aparece na solicitação.  
*Obrigatório*: Sim  
*Tipo:* string

`LogicalResourceId`  
O nome do modelo escolhido pelo desenvolvedor (ID lógico) do recurso personalizado no modelo do CloudFormation. Copie esse valor exatamente como ele aparece na solicitação.  
*Obrigatório*: Sim  
*Tipo:* string

`PhysicalResourceId`  
Esse valor deve ser um identificador exclusivo do fornecedor de recursos personalizados e pode ter até 1 KB de tamanho. O valor deve ser uma string não vazia e deve ser idêntico para todas as respostas do mesmo recurso.  
Ao atualizar recursos personalizados, o valor retornado de `PhysicalResourceId` determina o comportamento da atualização. Se o valor retornado permanecer o mesmo, o CloudFormation vai considerar a atualização normal. Se o valor mudar, o CloudFormation vai interpretar a atualização como uma substituição e enviará uma solicitação de exclusão para o recurso antigo. Para obter mais informações, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).  
*Obrigatório*: Sim  
*Tipo:* string

`Reason`  
Descreve o motivo de uma resposta de falha.  
Obrigatório se `Status` for `FAILED`. Caso contrário, será opcional.  
*Obrigatório*: Condicional  
*Tipo:* string

`NoEcho`  
Indica se é necessário mascarar a saída do recurso personalizado quando ela for recuperada usando a função `Fn::GetAtt`. Se definido como `true`, todos os valores retornados serão mascarados com asteriscos (\$1\$1\$1\$1\$1), *exceto os armazenados na seção `Metadata` do modelo*. O CloudFormation não transforma, modifica nem edita nenhuma informação incluída na seção `Metadata`. O valor padrão é `false`.  
Para obter mais informações sobre como usar `NoEcho` para mascarar informações confidenciais, consulte a prática recomendada [Não incorporar credenciais em seus modelos](security-best-practices.md#creds).  
Disponível somente para respostas `Create` e `Update`. Não é compatível com respostas `Delete`.  
*Obrigatório*: não  
*Tipo*: booliano

`Data`  
Os pares de nome/valor definidos pelo provedor de recursos personalizados a serem enviados com a resposta. É possível acessar os valores fornecidos aqui pelo nome no modelo com `Fn::GetAtt`.  
Disponível somente para respostas `Create` e `Update`. Não é compatível com respostas `Delete`.  
Se os pares de nome/valor contiverem informações confidenciais, você deverá utilizar o campo `NoEcho` para mascarar a saída do recurso personalizado. Caso contrário, os valores estarão visíveis por meio de APIs que exibem valores de propriedades (como `DescribeStackEvents`).
*Obrigatório*: não  
*Tipo*: objeto JSON

### Exemplos de respostas de sucesso
<a name="crpg-ref-success-response-examples"></a>

#### Resposta `Create` e `Update`
<a name="crpg-ref-success-response-example-1"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id",
   "NoEcho": true,
   "Data": {
      "key1": "value1",
      "key2": "value2"
   }
}
```

#### `Delete`Resposta do
<a name="crpg-ref-success-response-example-2"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id"
}
```

### Exemplo de resposta com falha
<a name="crpg-ref-failed-response-example"></a>

```
{
   "Status": "FAILED",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id",
   "PhysicalResourceId": "provider-defined-physical-id",
   "Reason": "Required failure reason string"
}
```

# Recursos personalizados baseados no Amazon SNS
<a name="template-custom-resources-sns"></a>

O tópico apresentado a seguir mostra como configurar um recurso personalizado com um token de serviço que especifica o tópico do Amazon SNS para o qual o CloudFormation envia solicitações. Além disso, você aprende a sequência de eventos e de mensagens enviadas e recebidas como resultado da criação, da atualização e da exclusão da pilha de recursos personalizada.

Com recursos personalizados e o Amazon SNS, você pode habilitar cenários como adicionar novos recursos a uma pilha e injetar dados dinâmicos em uma pilha. Por exemplo, quando você cria uma pilha, o CloudFormation pode enviar uma solicitação `Create` para um tópico monitorado por uma aplicação em execução em uma instância do Amazon EC2. A notificação do Amazon SNS aciona a aplicação para realizar tarefas de provisionamento adicionais, como recuperar um grupo de IPs elásticos na lista de permissão. Depois que todas essas ações forem concluídas, a aplicação enviará uma resposta (e quaisquer dados de saída) que notifica o CloudFormation para dar prosseguimento à operação de pilha.

Quando você especifica um tópico do Amazon SNS como o destino de um recurso personalizado, o CloudFormation envia mensagens para o tópico do SNS especificado durante as operações de pilha que envolvem o recurso personalizado. Para realizar o processamento dessas mensagens e executar as ações necessárias, você deve ter um endpoint com suporte que seja assinante do tópico do SNS.

Para obter uma introdução aos recursos personalizados e como eles funcionam, consulte [Como os recursos personalizados funcionam](template-custom-resources.md#how-custom-resources-work). Para obter mais informações sobre o Amazon SNS e como ele funciona, consulte o [Guia do desenvolvedor do Amazon Simple Notification Service](https://docs.aws.amazon.com/sns/latest/dg/).

## Uso do Amazon SNS para criar recursos personalizados
<a name="walkthrough-custom-resources-sns-adding-nonaws-resource"></a>

**Topics**
+ [Etapa 1: Criar a pilha](#crpg-walkthrough-stack-creation)
+ [Etapa 2: Atualizações de pilha](#crpg-walkthrough-stack-updates)
+ [Etapa 3: Exclusão da pilha](#crpg-walkthrough-stack-deletion)

### Etapa 1: Criar a pilha
<a name="crpg-walkthrough-stack-creation"></a>

1. <a name="crpg-walkthrough-stack-creation-customer-template"></a>O desenvolvedor do modelo cria uma pilha do CloudFormation que contém um recurso personalizado. 

   No exemplo de modelo apresentado abaixo, usamos o nome do tipo de recurso personalizado `Custom::SeleniumTester` para o recurso personalizado com ID lógico `MySeleniumTest`. Os nomes de tipo de recurso personalizados devem ser alfanuméricos e podem ter um comprimento máximo de 60 caracteres. 

   O tipo de recurso personalizado é declarado com um token de serviço, propriedades opcionais específicas do provedor e atributos de [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt) opcionais que são definidos pelo provedor de recursos personalizados. Essas propriedades e os atributos podem ser usados para passar informações do template developer para o custom resource provider, e vice-versa. O token de serviço especifica um tópico do Amazon SNS configurado pelo provedor de recursos.

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```
**nota**  
Os nomes e os valores dos dados acessados ​​com `Fn::GetAtt` são retornados pelo provedor de recursos personalizados durante a resposta do provedor para o CloudFormation. Caso o custom resource provider seja um terceiro, o template developer deverá obter os nomes desses valores de retorno do custom resource provider.

1. <a name="crpg-walkthrough-stack-creation-provider-request"></a>O CloudFormation envia uma notificação do Amazon SNS para o provedor de recursos com um `"RequestType" : "Create"` que contém informações sobre a pilha, as propriedades do recurso personalizado do modelo da pilha e um URL de S3 para a resposta.

   O tópico SNS usado para enviar a notificação é incorporado no modelo na propriedade `ServiceToken`. Para evitar usar um valor codificado, um template developer pode usar um parâmetro de modelo, de maneira que o valor seja informado no momento em que a pilha é iniciada.

   O exemplo a seguir mostra uma solicitação `Create` de recurso personalizado que inclui um nome de tipo de recurso personalizado `Custom::SeleniumTester`, criado com um `LogicalResourceId` de `MySeleniumTester`:

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Para obter informações detalhadas sobre o objeto de solicitação para as solicitações `Create`, consulte o tópico [Referência de solicitações e respostas](crpg-ref.md).

1. <a name="crpg-walkthrough-stack-creation-provider-response"></a>O custom resource provider processa os dados enviados pelo template developer e determina se a solicitação `Create` foi bem-sucedida. O provedor de recursos usa o URL do S3 enviado pelo CloudFormation para enviar uma resposta de `SUCCESS` ou de `FAILED`.

   O CloudFormation espera diferentes campos de resposta com base no tipo de resposta. Para obter informações sobre os campos de resposta para um tipo de solicitação em específico, consulte a documentação para esse tipo de solicitação na seção [Referência de solicitações e respostas](crpg-ref.md).

   Em resposta a uma solicitação de criação ou atualização, o provedor personalizado de recursos pode retornar elementos de dados no campo `Data` da resposta. Esses são os pares de nome/valor, e os *nomes* correspondem aos atributos `Fn::GetAtt` usados com o recurso personalizado no modelo de pilha. Os *valores* são os dados retornados quando o Template Developer chama `Fn::GetAtt` no recurso com o nome do atributo.

   Este é um exemplo de uma resposta de recurso personalizado:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "Data" : {
         "resultsPage" : "http://www.myexampledomain/test-results/guid",
         "lastUpdate" : "2012-11-14T03:30Z"
      }
   }
   ```

   Para obter informações detalhadas sobre o objeto de resposta para as solicitações `Create`, consulte o tópico [Referência de solicitações e respostas](crpg-ref.md).

   Os campos `StackId`, `RequestId` e `LogicalResourceId` devem ser copiados na íntegra da solicitação.

1. <a name="crpg-walkthrough-stack-creation-stack-status"></a> O CloudFormation declara o status da pilha como `CREATE_COMPLETE` ou `CREATE_FAILED`. Caso a pilha tenha sido criada com êxito, o desenvolvedor de modelos pode usar os valores de saída do recurso personalizado criado acessando-os com [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt).

   Por exemplo, o modelo de recurso personalizado usado na ilustração utilizou `Fn::GetAtt` para copiar saídas de recurso para as saídas de pilha:

   ```
   "Outputs" : {
      "topItem" : {
         "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
      },
      "numRespondents" : {
         "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
      }
   }
   ```

### Etapa 2: Atualizações de pilha
<a name="crpg-walkthrough-stack-updates"></a>

Para atualizar uma pilha existente, é necessário enviar um modelo que especifique as atualizações para as propriedades dos recursos na pilha, conforme mostrado no exemplo abaixo. O CloudFormation atualiza somente os recursos que têm alterações especificadas no modelo. Para obter mais informações, consulte [Compreender atualização de comportamentos de recursos da pilha](using-cfn-updating-stacks-update-behaviors.md).

É possível atualizar recursos personalizados que exigem uma substituição do recurso físico subjacente. Quando você atualiza um recurso personalizado em um modelo do CloudFormation, o CloudFormation envia uma solicitação de atualização a esse recurso personalizado. Caso um recurso personalizado exija uma substituição, o novo recurso personalizado deve enviar uma resposta com o novo ID físico. Quando o CloudFormation recebe a resposta, ele compara o `PhysicalResourceId` entre os recursos personalizados antigos e novos. Se os recursos forem diferentes, o CloudFormation reconhecerá a atualização como uma substituição e enviará uma solicitação de exclusão para o recurso antigo, conforme mostrado na [Etapa 3: Exclusão da pilha](#crpg-walkthrough-stack-deletion).

**nota**  
Se você não fez alterações no recurso personalizado, o CloudFormation não enviará solicitações para ele durante uma atualização de pilha.

1. <a name="crpg-walkthrough-stack-updates-customer-template"></a>O template developer inicia uma atualização para a pilha que contém um recurso personalizado. Durante uma atualização, o template developer pode especificar novas propriedades no modelo da pilha.

   Este é um exemplo de um `Update` para o modelo de pilha que usa um tipo de recurso personalizado:

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
                  "http://mynewsite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```

1. <a name="crpg-walkthrough-stack-updates-provider-request"></a>O CloudFormation envia uma notificação do Amazon SNS para o provedor de recursos com um `"RequestType" : "Update"` que contém informações semelhantes às da chamada `Create`, exceto por o campo `OldResourceProperties` conter as propriedades de recurso anteriores e ResourceProperties conter as propriedades de recurso atualizadas (caso haja alguma).

   Este é um exemplo de uma solicitação `Update`:

   ```
   {
      "RequestType" : "Update",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      },
      "OldResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Para obter informações detalhadas sobre o objeto de solicitação para as solicitações `Update`, consulte o tópico [Referência de solicitações e respostas](crpg-ref.md).

1. <a name="crpg-walkthrough-stack-updates-provider-response"></a>O provedor de recursos personalizados realiza o processamento dos dados enviados pelo CloudFormation. O recurso personalizado executa a atualização e envia uma resposta de `SUCCESS` ou de `FAILED` para o URL do S3. Em seguida, o CloudFormation compara os `PhysicalResourceIDs` de recursos personalizados antigos e novos. Se os recursos forem diferentes, o CloudFormation reconhecerá que a atualização requer uma substituição e enviará uma solicitação de exclusão para o recurso antigo. O exemplo a seguir demonstra a resposta do custom resource provider a uma solicitação `Update`.

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester2"
   }
   ```

   Para obter informações detalhadas sobre o objeto de resposta para as solicitações `Update`, consulte o tópico [Referência de solicitações e respostas](crpg-ref.md).

   Os campos `StackId`, `RequestId` e `LogicalResourceId` devem ser copiados na íntegra da solicitação.

1. <a name="crpg-walkthrough-stack-updates-stack-status"></a>O CloudFormation declara o status da pilha como `UPDATE_COMPLETE` ou `UPDATE_FAILED`. Em caso de falha na atualização, a pilha é revertida. Caso a pilha tenha sido atualizada com êxito, o template developer poderá acessar todos os novos valores de saída do recurso personalizado criado com `Fn::GetAtt`.

### Etapa 3: Exclusão da pilha
<a name="crpg-walkthrough-stack-deletion"></a>

1. <a name="crpg-walkthrough-stack-deletion-customer-template"></a>O desenvolvedor do modelo exclui uma pilha que contém um recurso personalizado. O CloudFormation obtém as propriedades atuais especificadas no modelo de pilha em conjunto com o tópico do SNS e se prepara para fazer uma solicitação ao provedor de recursos personalizados.

1. <a name="crpg-walkthrough-stack-deletion-provider-request"></a>O CloudFormation envia uma notificação do Amazon SNS para o provedor de recursos com um `"RequestType" : "Delete"` que contém informações atuais sobre a pilha, as propriedades do recurso personalizado do modelo da pilha e um URL de S3 para a resposta.

   Sempre que você exclui uma pilha ou faz uma atualização que remove ou substitui o recurso personalizado, o CloudFormation compara o `PhysicalResourceId` entre os recursos personalizados antigos e novos. Se os recursos forem diferentes, o CloudFormation reconhecerá a atualização como uma substituição e enviará uma solicitação de exclusão para o recurso antigo (`OldPhysicalResource`), conforme mostrado no exemplo a seguir de uma solicitação `Delete`.

   ```
   {
      "RequestType" : "Delete",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      }
   }
   ```

   Para obter informações detalhadas sobre o objeto de solicitação para as solicitações `Delete`, consulte o tópico [Referência de solicitações e respostas](crpg-ref.md).

   `DescribeStackResource`, `DescribeStackResources`e `ListStackResources` exibem o nome definido pelo usuário caso ele tenha sido especificado.

1. <a name="crpg-walkthrough-stack-deletion-provider-response"></a>O provedor de recursos personalizados realiza o processamento dos dados enviados pelo CloudFormation e determina se a solicitação `Delete` ocorreu com êxito. O provedor de recursos usa o URL do S3 enviado pelo CloudFormation para enviar uma resposta de `SUCCESS` ou de `FAILED`. Para excluir com êxito uma pilha com um recurso personalizado, o custom resource provider devem responder com êxito a uma solicitação de exclusão.

   Este é um exemplo de uma resposta do custom resource provider a uma solicitação `Delete`:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1"
   }
   ```

   Para obter informações detalhadas sobre o objeto de resposta para as solicitações `Delete`, consulte o tópico [Referência de solicitações e respostas](crpg-ref.md).

   Os campos `StackId`, `RequestId` e `LogicalResourceId` devem ser copiados na íntegra da solicitação.

1. <a name="crpg-walkthrough-stack-updates-stack-status-delete"></a>O CloudFormation declara o status da pilha como `DELETE_COMPLETE` ou `DELETE_FAILED`.

# Recursos personalizados baseados no Lambda
<a name="template-custom-resources-lambda"></a>

Ao associar uma função do Lambda com um recurso personalizado, a função é invocada sempre que o recurso personalizado é criado, atualizado ou excluído. O CloudFormation chama uma API do Lambda para invocar a função e transferir todos os dados da solicitação (como o tipo de solicitação e as propriedades do recurso) para a função. A capacidade e a personalização das funções do Lambda em associação com o CloudFormation possibilitam uma ampla variedade de cenários, como a pesquisa dinâmica de IDs de AMI durante a criação da pilha ou a implementação e o uso de funções utilitárias, como as funções de reversão de string.

Para obter uma introdução aos recursos personalizados e como eles funcionam, consulte [Como os recursos personalizados funcionam](template-custom-resources.md#how-custom-resources-work).

**Topics**
+ [Instruções passo a passo: criar um mecanismo de atraso com um recurso personalizado apoiado pelo Lambda](walkthrough-lambda-backed-custom-resources.md)
+ [`cfn-response`Módulo](cfn-lambda-function-code-cfnresponsemodule.md)

# Instruções passo a passo: criar um mecanismo de atraso com um recurso personalizado apoiado pelo Lambda
<a name="walkthrough-lambda-backed-custom-resources"></a>

Este passo a passo mostra como configurar e executar um recurso personalizado com suporte do Lambda usando um modelo de exemplo do CloudFormation. Este modelo cria um mecanismo de atraso que pausa as implantações de pilha por um período especificado. Isso pode ser útil quando você precisa introduzir atrasos deliberados durante o provisionamento de recursos, como ao esperar que os recursos se estabilizem antes que os recursos dependentes sejam criados.

**nota**  
Embora os recursos personalizados baseados em Lambda tenham sido recomendados anteriormente para recuperar IDs de AMI, recomendamos utilizar parâmetros do AWS Systems Manager. Essa abordagem torna seus modelos mais reutilizáveis e fáceis de manter. Para obter mais informações, consulte [Obter um valor em texto simples do Systems Manager Parameter Store](dynamic-references-ssm.md). 

**Topics**
+ [Visão geral](#walkthrough-lambda-backed-custom-resources-overview)
+ [Modelo de exemplo](#walkthrough-lambda-backed-custom-resources-sample-template)
+ [Modelo de passo a passo](#walkthrough-lambda-backed-custom-resources-sample-template-walkthrough)
+ [Pré-requisitos](#walkthrough-lambda-backed-custom-resources-prerequisites)
+ [Iniciar a pilha](#walkthrough-lambda-backed-custom-resources-createfunction-createstack)
+ [Limpar os recursos](#walkthrough-lambda-backed-custom-resources-createfunction-cleanup)
+ [Informações relacionadas](#w2aac11c45b9c24b9c23)

## Visão geral
<a name="walkthrough-lambda-backed-custom-resources-overview"></a>

O modelo de pilha de exemplo usado neste passo a passo cria um recurso personalizado baseado no Lambda. Esse recurso personalizado introduz um atraso configurável (60 segundos por padrão) durante a criação da pilha. O atraso ocorre durante as atualizações da pilha somente quando as propriedades do recurso personalizado são modificadas.

Este modelo fornece os seguintes recursos:
+ um recurso personalizado,
+ uma função do Lambda e
+ um perfil do IAM que permite que o Lambda grave logs no CloudWatch.

Ele também define duas saídas:
+ O tempo que a função de fato esperou.
+ Um identificador único gerado durante cada execução da função do Lambda.



**nota**  
O CloudFormation é um serviço gratuito, mas o Lambda cobra com base no número de solicitações para suas funções e no tempo durante o qual seu código é executado. Para obter mais informações sobre preços do Lambda, consulte [Preços do AWS Lambda](https://aws.amazon.com/lambda/pricing/).

## Modelo de exemplo
<a name="walkthrough-lambda-backed-custom-resources-sample-template"></a>

É possível ver o modelo de amostra de recurso personalizado apoiado pelo Lambda com o mecanismo de atraso abaixo:

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-yaml"></a>

```
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
```

## Modelo de passo a passo
<a name="walkthrough-lambda-backed-custom-resources-sample-template-walkthrough"></a>

Os trechos a seguir explicam partes relevantes do modelo de amostra para ajudá-lo a entender como a função do Lambda está associada a um recurso personalizado e a entender a saída.

`CFNWaiter` do resource [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)  
O recurso `AWS::Lambda::Function` especifica o código-fonte, o nome do handler, o ambiente de runtime e o nome do recurso da Amazon (ARN) do perfil de execução da função.  
A propriedade `Handler` é definida como `index.handler`, pois usa um código-fonte do Python. Para mais informações sobre identificadores de manipuladores aceitos ao usar códigos-fonte de funções embutidas, consulte [ AWS::Lambda::Function Code](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-zipfile).  
O `Runtime` é especificado como `python3.9` porque o arquivo de origem é um código do Python.  
O `Timeout` é definido como 900 segundos.  
A propriedade `Role` usa a função `Fn::GetAtt` para obter o ARN do perfil de execução `LambdaExecutionRole` declarado no recurso `AWS::IAM::Role` do modelo.  
A propriedade `Code` define o código da função inline com uma função do Python. A função do Python no modelo de amostra faz o seguinte:  
+ Criar um ID exclusivo utilizando o UUID
+ Verificar se a solicitação é de criação ou atualização
+ Suspender pela duração especificada por `ServiceTimeout` durante solicitações `Create` ou `Update`
+ Retorna o tempo de espera e o ID exclusivo

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-json"></a>

```
...
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-yaml"></a>

```
...
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
...
```

`LambdaExecutionRole` do recurso [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)  
O recurso `AWS::IAM:Role` cria um perfil de execução para a função do Lambda, que inclui uma política de função de suposição que permite que o Lambda a use. Ele também contém uma política que permite o acesso aos logs do CloudWatch.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-json"></a>

```
...
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-yaml"></a>

```
...
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
...
```

Recurso [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html) `CFNWaiterCustomResource`  
O recurso personalizado se vincula à função do Lambda com seu ARN usando `!GetAtt CFNWaiter.Arn`. Ela implementará um tempo de espera de 60 segundos para operações de criação e atualização, conforme definido em `ServiceTimeout`. O recurso somente será chamado para uma operação de atualização se as propriedades forem modificadas.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-json"></a>

```
...
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-yaml"></a>

```
...
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
...
```

`Outputs`  
As `Outputs` desse modelo são `TimeWaited` e `WaiterId`. O valor `TimeWaited` usa uma função `Fn::GetAtt` para fornecer a quantidade de tempo que o recurso de espera realmente aguardou. `WaiterId` usa uma função `Fn::GetAtt` para fornecer o ID exclusivo que foi gerado e associado à execução.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-json"></a>

```
...
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-yaml"></a>

```
...
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
...
```

## Pré-requisitos
<a name="walkthrough-lambda-backed-custom-resources-prerequisites"></a>

Você deve ter permissões do IAM para usar todos os serviços correspondentes, como o Lambda e o CloudFormation.

## Iniciar a pilha
<a name="walkthrough-lambda-backed-custom-resources-createfunction-createstack"></a>

**Para criar a pilha**

1. Encontre o modelo de sua preferência (YAML ou JSON) na seção [Modelo de exemplo](#walkthrough-lambda-backed-custom-resources-sample-template) e salve-o na máquina com o nome `samplelambdabackedcustomresource.template`.

1. Abra o console do CloudFormation em [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/).

1. Na página **Pilhas**, escolha **Criar pilha** no canto superior direito e depois **Com novos recursos (padrão)**.

1. Em **Pré-requisito: preparar modelo**, escolha **Escolher um modelo existente**.

1. Para **Especificar modelo**, selecione **Carregar um arquivo de modelo** e depois **Escolher arquivo**.

1. Selecione o arquivo de modelo `samplelambdabackedcustomresource.template` salvou anteriormente.

1. Escolha **Próximo**.

1. Para **Nome da pilha**, digite **SampleCustomResourceStack** e escolha **Próximo**.

1. Para esta demonstração, você não precisa adicionar tags ou especificar configurações avançadas, portanto escolha **Próximo**.

1. Certifique-se de que o nome da pilha esteja correto e escolha **Criar**.

Pode levar alguns minutos para que o CloudFormation crie a pilha. Para monitorar o progresso, visualize os eventos da pilha. Para obter mais informações, consulte [Visualizar informações da pilha no console do CloudFormation](cfn-console-view-stack-data-resources.md).

Se a criação da pilha for bem-sucedida, todos os recursos da pilha, como a função do Lambda e o recurso personalizado, foram criados. Você usou com êxito uma função do Lambda e um recurso personalizado.

Se a função do Lambda retornar um erro, visualize os logs da função no [console](https://console.aws.amazon.com/cloudwatch/home#logs:) do CloudWatch Logs. O nome do stream de logs é o ID físico do recurso personalizado, que pode ser encontrado visualizando os recursos da pilha. Para obter mais informações, consulte [Visualizar dados de log](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData), no *Guia do usuário do Amazon CloudWatch*.

## Limpar os recursos
<a name="walkthrough-lambda-backed-custom-resources-createfunction-cleanup"></a>

Exclua a pilha para limpar todos os recursos de pilha criados; assim, você não será cobrado por recursos desnecessários.

**Para excluir a pilha**

1. No console do CloudFormation, escolha a pilha **SampleCustomResourceStack**.

1. Escolha **Ações** e, em seguida, **Excluir pilha**.

1. Na mensagem de confirmação, escolha **Sim, excluir**.

Todos os recursos que você criou serão excluídos.

Agora que você sabe como criar e usar o recurso personalizado apoiado pelo Lambda, pode usar o modelo de amostra e o código deste passo a passo para criar e experimentar outras pilhas e funções.

## Informações relacionadas
<a name="w2aac11c45b9c24b9c23"></a>
+ [Referência de recursos personalizados do CloudFormation](crpg-ref.md)
+ [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)

# `cfn-response`Módulo
<a name="cfn-lambda-function-code-cfnresponsemodule"></a>

No modelo do CloudFormation, é possível especificar uma função do Lambda como o destino de um recurso personalizado. Ao usar a propriedade `ZipFile` para especificar o código-fonte da [função](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html), você pode carregar o módulo `cfn-response` com a finalidade de enviar respostas da função do Lambda para um recurso personalizado. O módulo `cfn-response` corresponde a uma biblioteca que simplifica o envio de respostas para o recurso personalizado que invocou a função do Lambda. O módulo contém um método `send` que envia um [objeto de resposta](crpg-ref.md#crpg-ref-responses) para um recurso personalizado por meio de um URL do Amazon S3 assinado previamente (o `ResponseURL`).

O módulo `cfn-response` está disponível somente quando você usa a propriedade `ZipFile` para gravar o código-fonte. Ele não está disponível para o código-fonte armazenado nos buckets do Amazon S3. Para código em buckets do , você deve criar suas próprias funções para enviar respostas.

**nota**  
Depois de executar o método `send` a função do Lambda é encerrada, assim qualquer coisa que você grave após esse método é ignorada.

## Carregar o módulo `cfn-response`
<a name="cfn-lambda-function-code-cfnresponsemodule-loading"></a>

Para funções Node.js, use a função `require()` para carregar o módulo `cfn-response`. Para esclarecer, o código de exemplo a seguir cria um objeto `cfn-response` com o nome `response`:

```
var response = require('cfn-response');
```

Para Python, use a instrução `import` para carregar o módulo `cfnresponse`, conforme mostrado no seguinte exemplo:

**nota**  
Use essa exata declaração de importação. Se você usar outras variantes da instrução “import”, o CloudFormation não incluirá o módulo de resposta.

```
import cfnresponse
```

## `send`Parâmetros do método
<a name="cfn-lambda-function-code-cfnresponsemodule-send-parameters"></a>

Você pode usar os seguintes parâmetros com o método `send`.

`event`  
Os campos em uma [solicitação de recurso personalizado](crpg-ref.md#crpg-ref-requesttypes).

`context`  
Um objeto, específico às funções do Lambda que você pode usar para especificar quando a função e qualquer retorno de chamada tiverem concluído a execução ou para acessar informações no ambiente de execução do Lambda. Para obter mais informações, consulte [Construir funções do Lambda com Node.js](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) no *Guia do desenvolvedor do AWS Lambda*.

`responseStatus`  
Se a função foi concluída com êxito. Use as constantes do módulo `cfnresponse` para especificar o status: `SUCCESS` para execuções bem-sucedidas e `FAILED` para execuções com falha.

`responseData`  
O campo `Data` de um [objeto de resposta](crpg-ref.md#crpg-ref-responses) de um recurso personalizado. Os dados são uma lista de pares de nome-valor.

`physicalResourceId`  
Opcional. O identificador exclusivo do recurso personalizado que invocou a função. Por padrão, o módulo usa o nome do fluxo de log do Amazon CloudWatch Logs que está associado à função do Lambda.  
O valor retornado para um `PhysicalResourceId` pode alterar as operações de atualização de recursos personalizados. Se o valor retornado for o mesmo, a atualização é considerada normal. Se o valor retornado for diferente, o CloudFormation reconhecerá a atualização como uma substituição e enviará uma solicitação de exclusão para o recurso antigo. Para obter mais informações, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).

`noEcho`  
Opcional. Indica se é necessário mascarar a saída do recurso personalizado quando ela for recuperada usando a função `Fn::GetAtt`. Se definido como `true`, todos os valores retornados serão mascarados com asteriscos (\$1\$1\$1\$1\$1), exceto informações armazenadas nos locais especificados abaixo. Por padrão, esse valor é `false`.  
O uso do atributo `NoEcho` não mascara informações armazenadas no seguinte:  
+ A seção de modelo de `Metadata`. O CloudFormation não transforma, modifica nem edita nenhuma informação incluída na seção `Metadata`. Para obter mais informações, consulte [Metadados](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ A seção de modelo de `Outputs`. Para obter mais informações, consulte [Saídas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
+ O atributo `Metadata` de uma definição de recurso. Para obter mais informações, consulte o atributo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
É altamente recomendável não usar esses mecanismos para incluir informações confidenciais, como senhas ou segredos.
Para obter mais informações sobre como usar `NoEcho` para mascarar informações confidenciais, consulte a prática recomendada [Não incorporar credenciais em seus modelos](security-best-practices.md#creds).

## Exemplos
<a name="cfn-lambda-function-code-cfnresponsemodule-examples"></a>

### Node.js
<a name="cfn-lambda-function-code-zipfile-examplenodejs"></a>

No exemplo Node.js a seguir, a função do Lambda incorporada obtém um valor de entrada e multiplica por 5. As funções em linha são especialmente úteis para funções menores, pois permitem que você especifique o código-fonte diretamente no modelo, em vez de criar um pacote e carregá-lo em um bucket do Amazon S3. A função usa o método `cfn-response` `send` para enviar o resultado de volta para o recurso personalizado que a chamou.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplenodejs.json"></a>

```
"ZipFile": { "Fn::Join": ["", [
  "var response = require('cfn-response');",
  "exports.handler = function(event, context) {",
  "  var input = parseInt(event.ResourceProperties.Input);",
  "  var responseData = {Value: input * 5};",
  "  response.send(event, context, response.SUCCESS, responseData);",
  "};"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplenodejs-yaml"></a>

```
ZipFile: >
  var response = require('cfn-response');
  exports.handler = function(event, context) {
    var input = parseInt(event.ResourceProperties.Input);
    var responseData = {Value: input * 5};
    response.send(event, context, response.SUCCESS, responseData);
  };
```

### Python
<a name="cfn-lambda-function-code-zipfile-examplepython"></a>

No exemplo de Python a seguir, a função do Lambda em linha pega um valor inteiro e o multiplica por 5.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplepython.json"></a>

```
"ZipFile" : { "Fn::Join" : ["\n", [
  "import json",
  "import cfnresponse",
  "def handler(event, context):",
  "   responseValue = int(event['ResourceProperties']['Input']) * 5",
  "   responseData = {}",
  "   responseData['Data'] = responseValue",
  "   cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, \"CustomResourcePhysicalID\")"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplepython.yaml"></a>

```
ZipFile: |
  import json
  import cfnresponse
  def handler(event, context):
    responseValue = int(event['ResourceProperties']['Input']) * 5
    responseData = {}
    responseData['Data'] = responseValue
    cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID")
```

## Código-fonte do módulo
<a name="cfn-lambda-function-code-cfnresponsemodule-source"></a>

**Topics**
+ [Código-fonte assíncrono do Node.js](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async)
+ [Código fonte do Node.js](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs)
+ [Código-fonte Python](#cfn-lambda-function-code-cfnresponsemodule-source-python)

### Código-fonte assíncrono do Node.js
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async"></a>

Veja a seguir o código-fonte do módulo de resposta das funções do Node.js caso o handler seja assíncrono. Analise-o para entender o que o módulo faz e obter ajuda com a implementação de suas próprias funções de resposta.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0

exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    return new Promise((resolve, reject) => {
        var responseBody = JSON.stringify({
            Status: responseStatus,
            Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
            PhysicalResourceId: physicalResourceId || context.logStreamName,
            StackId: event.StackId,
            RequestId: event.RequestId,
            LogicalResourceId: event.LogicalResourceId,
            NoEcho: noEcho || false,
            Data: responseData
        });

        console.log("Response body:\n", responseBody);

        var https = require("https");
        var url = require("url");

        var parsedUrl = url.parse(event.ResponseURL);
        var options = {
            hostname: parsedUrl.hostname,
            port: 443,
            path: parsedUrl.path,
            method: "PUT",
            headers: {
                "content-type": "",
                "content-length": responseBody.length
            }
        };

        var request = https.request(options, function(response) {
            console.log("Status code: " + parseInt(response.statusCode));
            resolve(context.done());
        });

        request.on("error", function(error) {
            console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
            reject(context.done(error));
        });

        request.write(responseBody);
        request.end();
    })
}
 
function maskCredentialsAndSignature(message) {
    return message.replace(/X-Amz-Credential=[^&\s]+/i, 'X-Amz-Credential=*****')
        .replace(/X-Amz-Signature=[^&\s]+/i, 'X-Amz-Signature=*****');
}
```

### Código fonte do Node.js
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs"></a>

Veja a seguir o código-fonte do módulo de resposta das funções do Node.js caso o handler não seja assíncrono. Analise-o para entender o que o módulo faz e obter ajuda com a implementação de suas próprias funções de resposta.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0
 
exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    var responseBody = JSON.stringify({
        Status: responseStatus,
        Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
        PhysicalResourceId: physicalResourceId || context.logStreamName,
        StackId: event.StackId,
        RequestId: event.RequestId,
        LogicalResourceId: event.LogicalResourceId,
        NoEcho: noEcho || false,
        Data: responseData
    });

    console.log("Response body:\n", responseBody);

    var https = require("https");
    var url = require("url");

    var parsedUrl = url.parse(event.ResponseURL);
    var options = {
        hostname: parsedUrl.hostname,
        port: 443,
        path: parsedUrl.path,
        method: "PUT",
        headers: {
            "content-type": "",
            "content-length": responseBody.length
        }
    };

    var request = https.request(options, function(response) {
        console.log("Status code: " + parseInt(response.statusCode));
        context.done();
    });

    request.on("error", function(error) {
        console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
        context.done();
    });

    request.write(responseBody);
    request.end();
}
```

### Código-fonte Python
<a name="cfn-lambda-function-code-cfnresponsemodule-source-python"></a>

Veja a seguir o código-fonte do módulo de resposta das funções do Python:

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
 
from __future__ import print_function
import urllib3
import json
import re

SUCCESS = "SUCCESS"
FAILED = "FAILED"

http = urllib3.PoolManager()


def send(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False, reason=None):
    responseUrl = event['ResponseURL']

    responseBody = {
        'Status' : responseStatus,
        'Reason' : reason or "See the details in CloudWatch Log Stream: {}".format(context.log_stream_name),
        'PhysicalResourceId' : physicalResourceId or context.log_stream_name,
        'StackId' : event['StackId'],
        'RequestId' : event['RequestId'],
        'LogicalResourceId' : event['LogicalResourceId'],
        'NoEcho' : noEcho,
        'Data' : responseData
    }

    json_responseBody = json.dumps(responseBody)

    print("Response body:")
    print(json_responseBody)

    headers = {
        'content-type' : '',
        'content-length' : str(len(json_responseBody))
    }

    try:
        response = http.request('PUT', responseUrl, headers=headers, body=json_responseBody)
        print("Status code:", response.status)


    except Exception as e:

        print("send(..) failed executing http.request(..):", mask_credentials_and_signature(e))
 
 
def mask_credentials_and_signature(message):
    message = re.sub(r'X-Amz-Credential=[^&\s]+', 'X-Amz-Credential=*****', message, flags=re.IGNORECASE)
    return re.sub(r'X-Amz-Signature=[^&\s]+', 'X-Amz-Signature=*****', message, flags=re.IGNORECASE)
```

# Executar processamento personalizado em modelos do CloudFormation com macros de modelo
<a name="template-macros"></a>

As macros permitem realizar o processamento personalizado em modelos, desde ações simples, como operações de localizar e substituir, até transformações extensas de modelos inteiros.

Para ter uma ideia das possibilidades, considere as transformações `AWS::Include` e `AWS::Serverless`, ambas macros hospedadas pelo CloudFormation:
+ A [transformação AWS::Include](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html) permite que você insira trechos de modelos clichê em seus modelos.
+ A [transformação AWS::Serverless](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html) usa um modelo inteiro escrito na sintaxe do AWS Serverless Application Model (AWS SAM) e o transforma e expande em um modelo compatível com o CloudFormation. Para obter mais informações sobre aplicações sem servidor e o AWS SAM, consulte o [Guia do desenvolvedor do AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html).

**Topics**
+ [Faturamento](#template-macros-billing)
+ [Exemplos de macro](#template-macros-examples-list)
+ [Recursos relacionados](#template-macros-related-resources)
+ [Visão geral das macros do CloudFormation](template-macros-overview.md)
+ [Criar uma definição de macro do CloudFormation](template-macros-author.md)
+ [Exemplo de macro simples de substituição de string](macros-example.md)
+ [Solucionar problemas do modelo processado](template-macros-troubleshoot-processed-template.md)

## Faturamento
<a name="template-macros-billing"></a>

Quando uma macro é executada, o proprietário da função Lambda é cobrado por todos os custos relacionados à execução dessa função.

As transformações `AWS::Include` e `AWS::Serverless` são macros hospedadas pelo CloudFormation. Não há custo pelo uso desses recursos.

## Exemplos de macro
<a name="template-macros-examples-list"></a>

Além dos exemplos desta seção, você pode encontrar exemplos de macro, incluindo código-fonte e modelos, em nosso [repositório do GitHub](https://github.com/aws-cloudformation/aws-cloudformation-templates/tree/main/CloudFormation/MacrosExamples). Esses exemplos são fornecidos "como estão" para fins de instrução.

## Recursos relacionados
<a name="template-macros-related-resources"></a>
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html)
+ [Seção Transform do modelo do CloudFormation](transform-section-structure.md)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-transform.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-transform.html)
+ [AWS::Serverless Transformação](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html)
+ [AWS::Include Transformação](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html)

# Visão geral das macros do CloudFormation
<a name="template-macros-overview"></a>

Há duas etapas principais para processar modelos usando macros: criar a macro propriamente dita e, em seguida, usar essa macro para realizar o processamento nos seus modelos.

Para criar uma definição de macro, você deve criar o seguinte:
+ Uma função do Lambda para processar o modelo. Essa função Lambda aceita um trecho inteiro ou um modelo inteiro e quaisquer parâmetros adicionais que você definir. Ele retorna o trecho de modelo processado ou todo o modelo como uma resposta.
+ Um recurso do tipo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html), que permite que os usuários chamem a função do Lambda de dentro de modelos do CloudFormation. Esse recurso especifica o ARN da função Lambda a ser chamada para esta macro, além de propriedades opcionais adicionais para ajudar na depuração. Para criar esse recurso dentro de uma conta, crie um modelo de pilha que inclua o recurso `AWS::CloudFormation::Macro` e, depois, crie uma pilha ou um conjunto de pilhas com permissões autogerenciadas por meio do modelo. CloudFormation No momento, o StackSets não suporta a criação ou atualização de conjuntos de pilhas com permissões gerenciadas por serviço de modelos que fazem referência a macros do .

Para usar uma macro, faça referência a ela no seu modelo:
+ Para processar uma seção, ou parte, de um modelo, referencie a macro em uma função `Fn::Transform` localizada em relação ao conteúdo do modelo que você deseja transformar. Ao usar `Fn::Transform`, você também pode transmitir os parâmetros especificados.
+ Para processar um modelo inteiro, faça referência à macro na seção [Transform](transform-section-structure.md) do modelo.

Depois, normalmente você cria um conjunto de alterações e o executa. (O processamento de macros pode adicionar vários recursos dos quais você pode não estar ciente. Para garantir que você conheça todas as alterações apresentadas pelas macros, é altamente recomendável usar conjuntos de alterações.) O CloudFormation transmite o conteúdo do modelo especificado, além de qualquer outro parâmetro especificado, para a função do Lambda especificada no recurso de macro. A função Lambda retorna o conteúdo do modelo processado, seja um trecho ou um modelo inteiro.

Depois que todas as macros do modelo tiverem sido chamadas, o CloudFormation gerará um conjunto de alterações que inclui o conteúdo do modelo processado. Após revisar o conjunto de alterações, execute-o para aplicar as alterações.

![\[Use a função intrínseca Fn::Transform ou a seção Transform do modelo para passar o conteúdo do modelo e os parâmetros associados para a função do Lambda subjacente da macro, que retorna o conteúdo do modelo processado.\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/template-macro-use.png)


## Como criar pilhas diretamente
<a name="template-macros-change-sets"></a>

Para criar ou atualizar uma pilha usando um modelo que faz referência a macros, normalmente você cria um conjunto de alterações e o executa. Um conjunto de alterações descreve as ações que o CloudFormation executará com base no modelo processado. O processamento de macros pode adicionar vários recursos dos quais você não tem conhecimento. Para garantir que você esteja ciente de todas as alterações apresentadas pelas macros, sugerimos o uso de conjuntos de alterações. Após revisar o conjunto de alterações, você poderá executá-lo para realmente aplicar as alterações.

Uma macro pode adicionar recursos do IAM a seu modelo. Para esses recursos, o CloudFormation requer que você [confirme suas funcionalidades](control-access-with-iam.md#using-iam-capabilities). Como o CloudFormation não pode saber quais recursos são adicionados antes de processar o modelo, pode ser necessário confirmar as funcionalidades do IAM ao criar o conjunto de alterações, dependendo de as macros referenciadas incluírem ou não recursos do IAM. Dessa forma, quando você executar o conjunto de alterações, o CloudFormation terá os recursos necessários ao criar recursos do IAM.

Para criar ou atualizar uma pilha diretamente de um modelo processado sem primeiro analisar as alterações propostas em um conjunto de alterações, especifique o recurso `CAPABILITY_AUTO_EXPAND` durante uma solicitação de `CreateStack` ou `UpdateStack`. Você só deverá criar pilhas diretamente de um modelo de pilha que contém macros se souber o que o processamento da macro executa. Você não pode usar conjuntos de alterações com macros de conjunto de pilhas e deve atualizar seu conjunto de pilhas diretamente.

Para obter mais informações, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html) ou [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html) na *Referência de APIs do AWS CloudFormation*.

**Importante**  
Se o modelo do conjunto de pilhas fizer referência a uma ou mais macros, você deverá criar o conjunto de pilhas diretamente do modelo processado, sem primeiro revisar as alterações resultantes em um conjunto de alterações. O processamento de macros pode adicionar vários recursos dos quais você não tem conhecimento. Antes de criar ou atualizar um conjunto de pilhas de um modelo que faça referência a macros diretamente, certifique-se de saber qual processamento as macros executam.

Para reduzir o número de etapas para iniciar pilhas a partir de modelos que fazem referenciam macros, você pode usar os comandos `package` e `deploy` da AWS CLI. Para obter mais informações, consulte [Fazer upload de artefatos locais em um bucket do S3 com a AWS CLI](using-cfn-cli-package.md) e [Criar uma pilha que inclua transformações](service_code_examples.md#deploy-sdk).

## Considerações
<a name="template-macros-considerations"></a>

Ao trabalhar com macros, tenha em mente as seguintes observações e limitações:
+ As macros são compatíveis apenas com as Regiões da AWS em que o Lambda está disponível. Para obter uma lista de regiões em que o Lambda está disponível, consulte [Endpoints e cotas do AWS Lambda](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html).
+ Todos os trechos do modelo processado deve ser um JSON válido.
+ Quaisquer trechos de modelo processados devem passar por verificações de validação para uma operação de criação de pilha, atualização de pilha, criação de conjunto de pilhas ou atualização de conjunto de pilhas.
+ O CloudFormation resolve as macros primeiro e, depois, processa o modelo. O modelo resultante deve ser um JSON válido e não deve exceder o limite de tamanho do modelo.
+ Devido à ordem na qual o CloudFormation processa elementos em um modelo, uma macro não pode incluir módulos no conteúdo do modelo processado que ela retorna ao CloudFormation. Para obter mais informações, consulte [Ordem de avaliação de macros](template-macros-author.md#template-macros-order).
+ Ao usar o recurso de reversão de atualização, o CloudFormation utiliza uma cópia do modelo original. Ele reverterá para o modelo original, mesmo se o trecho incluído tiver sido alterado.
+ A inclusão de macros dentro de macros não funciona porque não processamos macros de modo recursivo.
+ No momento, a função intrínseca `Fn::ImportValue` não é compatível em macros.
+ As funções intrínsecas incluídas no modelo são avaliadas depois de quaisquer macros. Portanto, o conteúdo do modelo processado retornado pela macro pode incluir chamadas para funções intrínsecas, e estas são avaliadas como de costume.
+ No momento, o StackSets não permite a criação nem a atualização de conjuntos de pilhas com permissões gerenciadas por serviço de modelos que fazem referência a macros do CloudFormation.

## Escopo e permissões de conta das macros
<a name="template-macros-permissions"></a>

Você pode usar macros apenas na conta em que elas foram criadas como um recurso. O nome da macro deve ser exclusivo dentro de uma conta especificada. No entanto, você pode disponibilizar a mesma funcionalidade em várias contas, ativando o acesso entre contas na função Lambda subjacente e, em seguida, criando definições de macro que fazem referência a essa função em várias contas. No exemplo abaixo, três contas contêm definições de macro, cada uma apontando para a mesma função Lambda.

![\[Permitindo o acesso entre contas na função do Lambda, a AWS permite criar macros nas várias contas que referenciam essa função.\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/template-macro-accounts.png)


Para criar uma definição de macro, o usuário deve ter permissões para criar uma pilha ou um conjunto de pilhas dentro da conta especificada.

Para o CloudFormation executar com êxito uma macro incluída em um modelo, o usuário deve ter permissões `Invoke` para a função do Lambda subjacente. Para evitar um possível dimensionamento de permissões, o CloudFormation personifica o usuário ao executar a macro.

Para mais informações, consulte [Gerenciando permissões no AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html) no *Guia do desenvolvedor do AWS Lambda* e [Actions, resources, and condition keys for AWS Lambda](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslambda.html) na *Service Authorization Reference*.

# Criar uma definição de macro do CloudFormation
<a name="template-macros-author"></a>

Quando você cria uma definição de macro, ela disponibiliza a função do Lambda subjacente na conta especificada para que o CloudFormation possa invocá-la ao processar os modelos.

## Mapeamento de eventos
<a name="template-macros-event-mapping"></a>

Quando o CloudFormation invoca a função do Lambda de uma macro, ele envia uma solicitação no formato JSON com a seguinte estrutura:

```
{
    "region" : "us-east-1",
    "accountId" : "$ACCOUNT_ID",
    "fragment" : { ... },
    "transformId" : "$TRANSFORM_ID",
    "params" : { ... },
    "requestId" : "$REQUEST_ID",
    "templateParameterValues" : { ... }
}
```
+ `region`

  A região na qual a macro reside.
+ `accountId`

  O ID de conta da conta da qual a macro está invocando a função Lambda.
+ `fragment`

  O conteúdo do modelo disponível para processamento personalizado, no formato JSON.
  + Para macros incluídas no modelo `Transform`, essa seção é o modelo inteiro, exceto pela seção `Transform`.
  + Para macros incluídas em uma chamada de função intrínseca `Fn::Transform`, isso inclui todos os nós irmãos (e os filhos deles) com base na localização da função intrínseca no modelo, exceto pela função `Fn::Transform`. Para obter mais informações, consulte [Escopo de modelo de macro](#template-macros-scope).
+ `transformId`

  O nome da macro que invoca essa função.
+ `params`

  Para chamadas à função `Fn::Transform`, quaisquer parâmetros especificados para a função. O CloudFormation não avalia esses parâmetros antes de passá-los para a função.

  Para macros incluídas na seção do modelo `Transform`, essa seção é vazia.
+ `requestId`

  O ID da solicitação que invoca essa função.
+ `templateParameterValues`

  Quaisquer parâmetros especificados na seção [Parameters](parameters-section-structure.md) do modelo. O CloudFormation avalia esses parâmetros antes de passá-los para a função.

## Formato de resposta
<a name="template-macros-response-format"></a>

O CloudFormation espera que a função do Lambda subjacente retorne uma resposta no seguinte formato JSON:

```
{
    "requestId" : "$REQUEST_ID",
    "status" : "$STATUS",
    "fragment" : { ... },
    "errorMessage": "optional error message for failures"
}
```
+ `requestId`

  O ID da solicitação que invoca essa função. Isso deve corresponder ao ID de solicitação fornecido pelo CloudFormation ao invocar a função.
+ `status`

  O status da solicitação (não diferencia maiúsculas de minúsculas). Ele deve ser definido como `success`. O CloudFormation trata qualquer outra resposta como uma falha.
+ `fragment`

  O conteúdo do modelo processado para o CloudFormation incluir no modelo processado, incluindo irmãos. O CloudFormation substitui o conteúdo do modelo que é transmitido para a função do Lambda pelo fragmento de modelo que ele recebe na resposta do Lambda.

  O conteúdo do modelo processado deve ser um JSON válido, e sua inclusão no modelo processado deve resultar em um modelo válido.

  Se a função não chegar a alterar o conteúdo do modelo que o CloudFormation transmite a ela, mas você ainda precisar incluir esse conteúdo no modelo processado, a função precisará retornar conteúdo do modelo ao CloudFormation em sua resposta.
+ `errorMessage`

  A mensagem de erro que explica por que a transformação falhou. O CloudFormation exibe a mensagem de erro no painel **Events** (Eventos) da página **Stack details** (Detalhes da pilha) para sua nova pilha.

  Por exemplo:

  ```
  Error creating change set: Transform
                              Conta da AWS account
                              number::macro name failed with:
                              error message string.
  ```

## Criar uma definição de macro
<a name="create-a-macro-definition"></a>

**Para criar uma definição de macro do CloudFormation**

1. [Desenvolva uma função do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html) que processe o conteúdo de um modelo. Ela pode processar qualquer parte de um modelo, até o modelo inteiro. 

1. Crie um modelo do CloudFormation contendo um tipo de recurso `AWS::CloudFormation::Macro` e especifique as propriedades `Name` e `FunctionName`. A propriedade `FunctionName` deve conter o ARN da função do Lambda a ser invocada quando o CloudFormation executar a macro.

1. (opcional) Para ajudar na depuração, você também pode especificar as propriedades `LogGroupName` e `LogRoleArn` ao criar o tipo de recurso `AWS::CloudFormation::Macro` para a macro. Essas propriedades permitem especificar o grupo de logs do CloudWatch para o qual o CloudFormation envia informações de registro de erros em log ao invocar a função do Lambda subjacente da macro e o perfil que o CloudFormation deve assumir ao enviar entradas para esses logs.

1. [Crie uma pilha](cfn-console-create-stack.md) usando o modelo com a macro na conta em que você deseja usá-la. Ou [crie um conjunto de pilhas com permissões autogerenciadas](stacksets-getting-started-create-self-managed.md) usando o modelo com a macro na conta de administrador, depois crie instâncias de pilhas nas contas de destino.

1. Depois que o CloudFormation criar com êxito as pilhas que contêm a definição da macro, ela estará disponível para uso nessas contas. Você usa uma macro fazendo referência a ela em um modelo, no local apropriado relevante para o conteúdo do modelo que você deseja processar.

## Escopo de modelo de macro
<a name="template-macros-scope"></a>

Macros referenciadas na seção `Transform` de um modelo podem processar todo o conteúdo desse modelo.

Macros referenciadas em uma função `Fn::Transform` podem processar o conteúdo de qualquer um dos elementos irmãos (incluindo filhos) dessa função `Fn::Transform` no modelo.

Por exemplo, no modelo de exemplo abaixo, `AWS::Include` pode processar todas as propriedades `MyBucket` com base na localização da função `Fn::Transform` que o contém. `MyMacro` pode processar o conteúdo de todo o modelo devido à sua inclusão na seção `Transform`.

```
# Start of processable content for MyMacro
AWSTemplateFormatVersion: 2010-09-09 
 Transform: [MyMacro]
 Resources:
    WaitCondition:
      Type: AWS::CloudFormation::WaitCondition
    MyBucket:
      Type: AWS::S3::Bucket
      # Start of processable content for AWS::Include
      Properties:
        BucketName: amzn-s3-demo-bucket1
        Tags: [{"key":"value"}] 
        'Fn::Transform':
          - Name: 'AWS::Include'
              Parameters:
                Location: s3://amzn-s3-demo-bucket2/MyFileName.yaml
        CorsConfiguration: []
        # End of processable content for AWS::Include
    MyEc2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageID: ami-1234567890abcdef0
# End of processable content for MyMacro
```

## Ordem de avaliação de macros
<a name="template-macros-order"></a>

É possível fazer referência a várias macros em um determinado modelo, incluindo transformações hospedadas pelo CloudFormation, como [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html) e [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html).

As macros são avaliadas em ordem, com base na sua localização no modelo, da mais profundamente aninhada até a mais genérica. Macros no mesmo local do modelo são avaliadas em série com base na ordem em que estão listadas.

Transformações como `AWS::Include` e `AWS::Transform` são tratadas como qualquer outra macro em termos de ordem e escopo de ação.

Por exemplo, no modelo de exemplo abaixo, o CloudFormation avalia primeiro a macro `PolicyAdder`, pois ela é a mais profundamente aninhada no modelo. Depois, o CloudFormation avalia `MyMacro` antes de avaliar `AWS::Serverless` porque ela está listada antes de `AWS::Serverless` na seção `Transform`.

```
AWSTemplateFormatVersion: 2010-09-09
 Transform: [MyMacro, AWS::Serverless]
 Resources:
    WaitCondition:
      Type: AWS::CloudFormation::WaitCondition
    MyBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: amzn-s3-demo-bucket
        Tags: [{"key":"value"}]
        'Fn::Transform':
          - Name: PolicyAdder
        CorsConfiguration: []
    MyEc2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageID: ami-1234567890abcdef0
```

# Exemplo de macro simples de substituição de string
<a name="macros-example"></a>

O exemplo a seguir mostra todo o processo de uso das macros, desde a definição de uma macro em um modelo até a criação de uma função do Lambda para a macro e o uso da macro em um modelo.

Neste exemplo, criamos uma macro simples que insere a sequência especificada no lugar do conteúdo de destino especificado no modelo processado. E, em seguida, vamos usá-la para inserir um espaço em branco `WaitHandleCondition` no local especificado do modelo processado.

## Criar uma macro
<a name="macros-example-definiton"></a>

Antes de usar uma macro, é necessário concluir duas tarefas: criar a função do Lambda que executa o processamento de modelo desejado e, em seguida, disponibilizar essa função do Lambda ao CloudFormation, criando uma definição de macro.

O modelo de exemplo a seguir contém a definição da nossa macro de exemplo. Para tornar a macro disponível em uma Conta da AWS específica, crie uma pilha a partir do modelo. A definição da macro especifica o nome da macro, uma breve descrição e faz referência ao ARN da função Lambda que o CloudFormation invoca quando essa macro é usada em um modelo. (Não incluímos uma propriedade `LogGroupName` ou `LogRoleARN` para o registro em log de erros.) 

Neste exemplo, pressuponha que a pilha criada a partir desse modelo seja denominada `JavaMacroFunc`. Como a propriedade `Name` da macro é definida como o nome da pilha, a macro resultante também será denominada `JavaMacroFunc`.

```
AWSTemplateFormatVersion: 2010-09-09
  Resources:
    Macro:
      Type: AWS::CloudFormation::Macro
      Properties:
        Name: !Sub '${AWS::StackName}'
        Description: Adds a blank WaitConditionHandle named WaitHandle
        FunctionName: 'arn:aws:lambda:us-east-1:012345678910:function:JavaMacroFunc'
```

## Usar a macro
<a name="macros-example-usage"></a>

Para usar nossa macro, a incluímos em um modelo usando a função intrínseca `Fn::Transform`.

Quando você cria uma pilha usando o modelo a seguir, o CloudFormation chama nossa macro de exemplo. A função Lambda subjacente substitui uma sequência especificada por outra sequência especificada. Nesse caso, o resultado é que um `AWS::CloudFormation::WaitConditionHandle` em branco é inserido no modelo processado.

```
Parameters:
  ExampleParameter:
    Type: String
    Default: 'SampleMacro'

Resources:
  2a:
    Fn::Transform:
      Name: "JavaMacroFunc"
      Parameters:
        replacement: 'AWS::CloudFormation::WaitConditionHandle'
        target: '$$REPLACEMENT$$'
    Type: '$$REPLACEMENT$$'
```
+ A macro a ser invocada é especificada como `JavaMacroFunc`, do exemplo anterior de definição de macro.
+ A macro recebe dois parâmetros, `target` e `replacement`, que representam a sequência de destino e seu valor de substituição desejado.
+ A macro pode operar no conteúdo do nó `Type`, pois `Type` é um irmão da função `Fn::Transform` que referencia a macro.
+ O `AWS::CloudFormation::WaitConditionHandle` resultante se chama `2a`.
+ O modelo também contém um parâmetro de modelo, `ExampleParameter`, ao qual a macro também tem acesso (mas não usa neste caso).

## Dados de entrada do Lambda
<a name="macros-example-request"></a>

Quando o CloudFormation processa nosso exemplo de modelo durante a criação da pilha, ele transmite o mapeamento de eventos a seguir à função do Lambda referenciada na definição da macro `JavaMacroFunc`.
+ `region` : `us-east-1`
+ `accountId` : `012345678910`
+ `fragment` :

  ```
  {
    "Type": "$$REPLACEMENT$$"
  }
  ```
+ `transformId` : `012345678910::JavaMacroFunc`
+ `params` : 

  ```
  {
      "replacement": "AWS::CloudFormation::WaitConditionHandle",
      "target": "$$REPLACEMENT$$"
  }
  ```
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `templateParameterValues` :

  ```
  {
      "ExampleParameter": "SampleMacro"
  }
  ```

`fragment` contém um JSON que representa o fragmento de modelo que a macro pode processar. Esse fragmento consiste nos irmãos da chamada da função `Fn::Transform`, mas não a chamada de função propriamente dita. Além disso, `params` contém um JSON que representa os parâmetros da macro. Nesse caso, a substituição e o destino. Da mesma forma, `templateParameterValues` contém um JSON que representa os parâmetros especificados para o modelo como um todo.

## Código da função do Lambda
<a name="macros-example-function"></a>

O código a seguir é o código real para a função do Lambda subjacente ao exemplo da macro `JavaMacroFunc`. Ele itera sobre o fragmento de modelo incluído na resposta (seja em formato de sequência, lista ou mapa), procurando a sequência de destino especificada. Se ele encontrar a sequência de destino especificada, a função Lambda substituirá a sequência de destino pela sequência de substituição especificada. Caso contrário, a função deixará o fragmento de modelo inalterado. Em seguida, a função retorna um mapa das propriedades esperadas, discutido em detalhes abaixo, para o CloudFormation.

```
package com.macroexample.lambda.demo;

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<Map<String, Object>, Map<String, Object>> {

	private static final String REPLACEMENT = "replacement";
	private static final String TARGET = "target";
	private static final String PARAMS = "params";
	private static final String FRAGMENT = "fragment";
	private static final String REQUESTID = "requestId";
	private static final String STATUS = "status";
	private static final String SUCCESS = "SUCCESS";
	private static final String FAILURE = "FAILURE";
    @Override
    public Map<String, Object> handleRequest(Map<String, Object> event, Context context) {
        // TODO: implement your handler
    	final Map<String, Object> responseMap = new HashMap<String, Object>();
        responseMap.put(REQUESTID, event.get(REQUESTID));
        responseMap.put(STATUS, FAILURE);
    	try {
	        if (!event.containsKey(PARAMS)) {
	        	throw new RuntimeException("Params are required");
	        }
	    	
	        final Map<String, Object> params = (Map<String, Object>) event.get(PARAMS);
	        if (!params.containsKey(REPLACEMENT) || !params.containsKey(TARGET)) {
	        	throw new RuntimeException("replacement or target under Params are required");
	        }
	    	
	    	final String replacement = (String) params.get(REPLACEMENT);
	    	final String target = (String) params.get(TARGET);
	    	final Object fragment = event.getOrDefault(FRAGMENT, new HashMap<String, Object>());
	    	final Object retFragment;
	    	if (fragment instanceof String) {
	    		retFragment = iterateAndReplace(replacement, target, (String) fragment);
	    	} else if (fragment instanceof List) {
	    		retFragment = iterateAndReplace(replacement, target, (List<Object>) fragment);
	    	} else if (fragment instanceof Map) {
	    		retFragment = iterateAndReplace(replacement, target, (Map<String, Object>) fragment);
	    	} else {
	    		retFragment = fragment;
	    	}
	        responseMap.put(STATUS, SUCCESS);
	        responseMap.put(FRAGMENT, retFragment);
	        return responseMap;
    	} catch (Exception e) {
    		e.printStackTrace();
    		context.getLogger().log(e.getMessage());
    		return responseMap;
    	}
    }
    
    private Map<String, Object> iterateAndReplace(final String replacement, final String target, final Map<String, Object> fragment) {
    	final Map<String, Object> retFragment = new HashMap<String, Object>();
    	final List<String> replacementKeys = new ArrayList<>();
    	fragment.forEach((k, v) -> {
    		if (v instanceof String) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (String)v));
    		} else if (v instanceof List) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (List<Object>)v));
    		} else if (v instanceof Map ) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (Map<String, Object>) v));
    		} else {
    			retFragment.put(k, v);
    		}
    	});
    	return retFragment;
    }

    private List<Object> iterateAndReplace(final String replacement, final String target, final List<Object> fragment) {
    	final List<Object> retFragment = new ArrayList<>();
    	fragment.forEach(o -> {
    		if (o instanceof String) {
    			retFragment.add(iterateAndReplace(replacement, target, (String) o));
    		} else if (o instanceof List) {
    			retFragment.add(iterateAndReplace(replacement, target, (List<Object>) o));
    		} else if (o instanceof Map) {
    			retFragment.add(iterateAndReplace(replacement, target, (Map<String, Object>) o));
    		} else {
    			retFragment.add(o);
    		}
    	});
    	return retFragment;
    }
    
    private String iterateAndReplace(final String replacement, final String target, final String fragment) {
    	System.out.println(replacement + " == " + target + " == " + fragment );
    	if (fragment != null AND_AND fragment.equals(target))
    		return replacement;
    	return fragment;
    }
}
```

## Resposta da função do Lambda
<a name="macros-example-response"></a>

Veja a seguir o mapeamento que a função do Lambda retorna ao CloudFormation para processamento. 
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `status` : `SUCCESS`
+ `fragment` :

  ```
  {
    "Type": "AWS::CloudFormation::WaitConditionHandle"
  }
  ```

As correspondências de `requestId` enviadas do CloudFormation e um valor `status` de `SUCCESS` indica que a função Lambda processou com êxito o fragmento de modelo incluído na solicitação. Nessa resposta, `fragment` contém um JSON que representa o conteúdo a ser inserido no modelo processado no lugar do trecho de modelo original.

## Modelo processado resultante
<a name="macros-example-processed"></a>

Depois que o CloudFormation recebe uma resposta bem-sucedida da função do Lambda, ele insere o fragmento de modelo retornado no modelo processado.

Veja a seguir o modelo processado resultante para o nosso exemplo. A chamada da função intrínseca `Fn::Transform` que referenciava a macro `JavaMacroFunc` não está mais incluída. O fragmento de modelo retornado pela função do Lambda está incluído no local apropriado, com o resultado de que o conteúdo `"Type": "$$REPLACEMENT$$"` foi substituído por `"Type": "AWS::CloudFormation::WaitConditionHandle"`.

```
{
    "Parameters": {
        "ExampleParameter": {
            "Default": "SampleMacro",
            "Type": "String"
        }
    },
    "Resources": {
        "2a": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        }
    }
}
```

# Solucionar problemas do modelo processado
<a name="template-macros-troubleshoot-processed-template"></a>

Ao usar uma macro, o modelo processado pode ser encontrado no console do CloudFormation.

O estágio de um modelo indica seu status de processamento:
+ `Original`: o modelo que o usuário enviou originalmente para criar ou atualizar a pilha ou o conjunto de pilhas.
+ `Processed`: o modelo que o CloudFormation usou para criar ou atualizar a pilha ou o conjunto de pilhas após o processamento de todas as macros referenciadas. O modelo processado é formatado como JSON, mesmo que o modelo original tenha sido formatado como YAML.

Para solucionar problemas, use o modelo processado. Se um modelo não referenciar macros, os modelos original e processado serão idênticos.

Para obter mais informações, consulte [Visualizar informações da pilha no console do CloudFormation](cfn-console-view-stack-data-resources.md).

Para usar a AWS CLI para obter o modelo processado, use o comando [get-template](service_code_examples.md#get-template-sdk).

## Limitação de tamanho
<a name="template-macros-size-limitation"></a>

O tamanho máximo de um modelo de pilha processado é de 51.200 bytes quando transmitido diretamente em uma solicitação `CreateStack`, `UpdateStack` ou `ValidateTemplate`, ou 1 MB quando transmitido como um objeto do S3 usando um URL do modelo do Amazon S3. No entanto, durante o processamento, o CloudFormation atualiza o estado temporário do modelo enquanto ele processa serialmente as macros contidas no modelo. Por causa disso, o tamanho do modelo durante o processamento pode temporariamente exceder o tamanho permitido de um modelo totalmente processado. O CloudFormation permite um buffer para esses modelos em processamento. No entanto, você deve projetar modelos e macros tendo em mente o tamanho máximo permitido para um modelo de pilha processado.

Se o CloudFormation retornar um erro `Transformation data limit exceeded` ao processar seu modelo, é porque ele excedeu o tamanho máximo de modelo que o CloudFormation permite durante o processamento.

Para resolver esse problema, considere o seguinte:
+ Reestruture o modelo em vários modelos para evitar exceder o tamanho máximo de modelos em andamento. Por exemplo:
  + Use os modelos de pilha aninhada para encapsular partes do modelo. Para obter mais informações, consulte [Dividir um modelo em partes reutilizáveis usando pilhas aninhadas](using-cfn-nested-stacks.md).
  + Crie várias pilhas e use referências entre pilhas para trocar informações entre elas. Para obter mais informações, consulte [Consultar saídas de recurso em outra pilha do CloudFormation](walkthrough-crossstackref.md).
+ Reduza o tamanho do fragmento do modelo retornado por determinada macro. O CloudFormation não interfere no conteúdo de fragmentos retornados por macros.

# Dividir um modelo em partes reutilizáveis usando pilhas aninhadas
<a name="using-cfn-nested-stacks"></a>

À medida que sua infraestrutura cresce, você poderá se encontrar criando repetidamente configurações de recursos idênticas em vários modelos. Para evitar essa redundância, é possível separar essas configurações comuns em modelos dedicados. Depois, use o recuso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) em seu modelo para fazer referência a esses modelos dedicados, criando pilhas aninhadas.

Por exemplo, suponha que você tem uma configuração de balanceador de carga para a maioria de suas pilhas. Em vez de copiar e colar as mesmas configurações em seus modelos, é possível criar um modelo dedicado para o load balancer. Em seguida, você poderá fazer referência a esse modelo a partir de outros modelos que exigem a mesma configuração do balanceador de carga.

As pilhas aninhadas podem conter outras pilhas aninhadas, o que resulta em uma hierarquia de pilhas, conforme mostrado no diagrama a seguir. A *pilha raiz* é a pilha de nível superior à qual todas as pilhas aninhadas pertencem. Cada pilha aninhada tem uma pilha pai imediata. Para o primeiro nível de pilhas aninhadas, a pilha raiz também é a pilha pai.
+ Pilha A é a pilha raiz de todas as outras pilhas, aninhadas, na hierarquia.
+ Para a pilha B, a pilha A é a pilha pai e a pilha raiz.
+ Para a pilha D, a pilha C é a pilha pai; e, ao mesmo tempo, para a pilha C, a pilha B é a pilha pai.

![\[As pilhas aninhadas, que são criadas como parte de outra pilha, têm uma pilha pai imediata, e a pilha raiz de nível superior.\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [Exemplo de antes e depois da divisão de um modelo](#create-nested-stack-template)
+ [Exemplo de uma arquitetura de pilha aninhada](#nested-stack-examples)
+ [Executar operações de pilha em pilhas aninhadas](#perform-stack-operations-on-nested-stacks)
+ [Informações relacionadas](#nested-stacks-related-information)

## Exemplo de antes e depois da divisão de um modelo
<a name="create-nested-stack-template"></a>

Este exemplo demonstra como é possível pegar um modelo único e grande do CloudFormation e reorganizá-lo em um design mais estruturado e reutilizável usando modelos aninhados. Inicialmente, o modelo “Antes de aninhar pilhas” mostra todos os recursos definidos em um arquivo. Isso pode se tornar confuso e difícil de gerenciar à medida que o número de recursos aumenta. O modelo "Depois de aninhar pilhas" divide os recursos em modelos menores e separados, chamados de pilhas aninhadas. Cada pilha aninhada manipula um conjunto específico de recursos relacionados, tornando a estrutura geral mais organizada e fácil de manter.


| Antes de aninhar pilhas | Depois de aninhar pilhas | 
| --- | --- | 
| <pre>AWSTemplateFormatVersion: 2010-09-09<br />Parameters:<br />  InstanceType:<br />    Type: String<br />    Default: t2.micro<br />    Description: The EC2 instance type<br />  <br />  Environment:<br />    Type: String<br />    Default: Production<br />    Description: The deployment environment<br /><br />Resources:<br />  MyEC2Instance:<br />    Type: AWS::EC2::Instance<br />    Properties:<br />      ImageId: ami-1234567890abcdef0<br />      InstanceType: !Ref InstanceType<br /><br />  MyS3Bucket:<br />    Type: AWS::S3::Bucket</pre> | <pre>AWSTemplateFormatVersion: 2010-09-09<br />Resources:<br />  MyFirstNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        InstanceType: t3.micro<br /><br />  MySecondNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        Environment: Testing<br />    DependsOn: MyFirstNestedStack</pre> | 

## Exemplo de uma arquitetura de pilha aninhada
<a name="nested-stack-examples"></a>

Esta seção demonstra uma arquitetura de pilha aninhada que consiste em uma pilha de nível superior que faz referência a uma pilha aninhada. A pilha aninhada implanta uma função do Lambda em Node.js, recebe um valor de parâmetro da pilha de nível superior e retorna uma saída que é exposta por meio da pilha de nível superior.

**Topics**
+ [Etapa 1: criar um modelo para a pilha aninhada em seu sistema local](#create-a-nested-stack-template)
+ [Etapa 2: criar um modelo para a pilha de nível superior em seu sistema local](#create-a-nested-stack-parent-template)
+ [Etapa 3: empacotar e implantar os modelos](#create-a-nested-stack-parent-template)

### Etapa 1: criar um modelo para a pilha aninhada em seu sistema local
<a name="create-a-nested-stack-template"></a>

O exemplo a seguir mostra o formato do modelo da pilha aninhada.

#### YAML
<a name="nested-stack-child-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Nested stack template for Lambda function deployment
 3. Parameters:
 4.   MemorySize:
 5.     Type: Number
 6.     Default: 128
 7.     MinValue: 128
 8.     MaxValue: 10240
 9.     Description: Lambda function memory allocation (128-10240 MB)
10. Resources:
11.   LambdaFunction:
12.     Type: AWS::Lambda::Function
13.     Properties:
14.       FunctionName: !Sub "${AWS::StackName}-Function"
15.       Runtime: nodejs18.x
16.       Handler: index.handler
17.       Role: !GetAtt LambdaExecutionRole.Arn
18.       Code:
19.         ZipFile: |
20.           exports.handler = async (event) => {
21.             return {
22.               statusCode: 200,
23.               body: JSON.stringify('Hello from Lambda!')
24.             };
25.           };
26.       MemorySize: !Ref MemorySize
27.   LambdaExecutionRole:
28.     Type: AWS::IAM::Role
29.     Properties:
30.       AssumeRolePolicyDocument:
31.         Version: '2012-10-17'
32.         Statement:
33.           - Effect: Allow
34.             Principal:
35.               Service: lambda.amazonaws.com
36.             Action: sts:AssumeRole
37.       ManagedPolicyArns:
38.         - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
39. Outputs:
40.   LambdaArn:
41.     Description: ARN of the created Lambda function
42.     Value: !GetAtt LambdaFunction.Arn
```

### Etapa 2: criar um modelo para a pilha de nível superior em seu sistema local
<a name="create-a-nested-stack-parent-template"></a>

O exemplo a seguir mostra o formato do modelo de pilha de nível superior e o recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) que faz referência à pilha que você criou na etapa anterior.

#### YAML
<a name="nested-stack-parent-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Top-level stack template that deploys a nested stack
 3. Resources:
 4.   NestedStack:
 5.     Type: AWS::CloudFormation::Stack
 6.     Properties:
 7.       TemplateURL: /path_to_template/nested-template.yaml
 8.       Parameters:
 9.         MemorySize: 256
10. Outputs:
11.   NestedStackLambdaArn:
12.     Description: ARN of the Lambda function from nested stack
13.     Value: !GetAtt NestedStack.Outputs.LambdaArn
```

### Etapa 3: empacotar e implantar os modelos
<a name="create-a-nested-stack-parent-template"></a>

**nota**  
Ao trabalhar com modelos localmente, o comando **package** da AWS CLI pode ajudar você a preparar modelos para implantação. Ele gerencia automaticamente o upload de artefatos locais para o Amazon S3 (incluindo `TemplateURL`) e gera um novo arquivo de modelo com referências atualizadas a esses locais do S3. Para obter mais informações, consulte [Fazer upload de artefatos locais em um bucket do S3 com a AWS CLI](using-cfn-cli-package.md). 

Em seguida, você pode usar o comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) para carregar o modelo aninhado em um bucket do Amazon S3.

```
aws cloudformation package \
  --s3-bucket amzn-s3-demo-bucket \
  --template /path_to_template/top-level-template.yaml \
  --output-template-file packaged-template.yaml \
  --output json
```

O comando gera um novo modelo no caminho especificado por `--output-template-file`. Ele substitui a referência `TemplateURL` pelo local do Amazon S3, conforme mostrado abaixo.

**Modelo resultante**

```
AWSTemplateFormatVersion: 2010-09-09
Description: Top-level stack template that deploys a nested stack
Resources:
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template
      Parameters:
        MemorySize: 256
Outputs:
  NestedStackLambdaArn:
    Description: ARN of the Lambda function from nested stack
    Value:
      Fn::GetAtt:
      - NestedStack
      - Outputs.LambdaArn
```

Depois de executar o comando **package**, você pode implantar o modelo processado usando o comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/). Para pilhas aninhadas que contêm recursos do IAM, é necessário reconhecer os recursos do IAM com a inclusão da opção `--capabilities`.

```
aws cloudformation deploy \
  --template-file packaged-template.yaml \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM
```

## Executar operações de pilha em pilhas aninhadas
<a name="perform-stack-operations-on-nested-stacks"></a>

Ao trabalhar com pilhas aninhadas, você deverá manuseá-las cuidadosamente durante as operações. Algumas operações de pilha, como atualizações de pilha, devem ser iniciadas na pilha raiz em vez de serem realizadas diretamente em pilhas aninhadas. Quando você atualiza uma pilha raiz, somente as pilhas aninhadas com alterações de modelo serão atualizadas. 

Além disso, a presença das pilhas aninhadas pode afetar as operações na pilha raiz. Por exemplo, se uma pilha aninhada ficar aprisionada no estado `UPDATE_ROLLBACK_IN_PROGRESS`, a pilha raiz aguardará até que a pilha aninhada conclua a reversão antes de continuar. Antes de prosseguir com as operações de atualização, certifique-se de ter as permissões do IAM necessárias para cancelar uma atualização da pilha caso ela seja revertida. Para obter mais informações, consulte [Controle o acesso ao CloudFormation com o AWS Identity and Access Management](control-access-with-iam.md).

Use os procedimentos a seguir para encontrar a pilha raiz e as pilhas aninhadas.

**Para visualizar a pilha raiz de uma pilha aninhada**

1. Faça login no Console de gerenciamento da AWS e abra o console CloudFormation em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Na página **Pilhas**, escolha o nome da pilha aninhada da qual deseja exibir a pilha raiz.

   As pilhas aninhadas exibem **ANINHADA** ao lado do nome da pilha.

1. Na guia **Informações da pilha**, na seção **Visão geral**, selecione o nome da pilha listada como **Pilha raiz**.

**Para visualizar as pilhas aninhadas que pertencem a uma pilha raiz**

1. Escolha o nome da pilha raiz cujas pilhas aninhadas você deseja visualizar e, em seguida, escolha a guia **Recursos**.

1. Na coluna **Tipo**, procure recursos do tipo **AWS::CloudFormation::Stack**.

## Informações relacionadas
<a name="nested-stacks-related-information"></a>
+ [Aninhar uma pilha existente](resource-import-nested-stacks.md)
+ [Compreender atualização de comportamentos de recursos da pilha](using-cfn-updating-stacks-update-behaviors.md)
+ [Continue revertendo de atualizações de pilhas aninhadas que falharam](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [Falha na reversão de pilhas aninhadas](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)

# Criar condições de espera em um modelo do CloudFormation
<a name="using-cfn-waitcondition"></a>

Este tópico explica como criar uma condição de espera em um modelo para coordenar a criação de recursos de pilha ou acompanhar o progresso de um processo de configuração. Por exemplo, você pode iniciar a criação de outro recurso depois que a configuração de um aplicativo é parcialmente concluída, ou você pode enviar sinais durante um processo de instalação e configuração para acompanhar seu progresso. 

Quando o CloudFormation cria uma pilha que inclui uma condição de espera:
+ Ele cria uma condição de espera como qualquer outro recurso e define o status da condição de espera como `CREATE_IN_PROGRESS`.
+ O CloudFormation espera até receber o número necessário de sinais de sucesso ou até que o período de tempo limite da condição de espera seja atingido. 
+ Se ele receber o número necessário de sinais de sucesso antes que o período de tempo limite seja atingido:
  + Espere que o status da condição mude para `CREATE_COMPLETE`
  + A criação da pilha continua
+ Se o tempo limite for atingido ou um sinal de falha for recebido:
  + Espere que o status da condição mude para `CREATE_FAILED`
  + Reverter a pilha

**Importante**  
Para recursos do Amazon EC2 e do Auto Scaling, recomendamos usar um atributo CreationPolicy, em vez de condições de espera. Adicione um atributo CreationPolicy a esses recursos e use o script auxiliar cfn-signal para sinalizar quando um processo de criação de instância foi concluído com êxito.  
Para obter mais informações, consulte o atributo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-creationpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-creationpolicy.html).

**nota**  
Se você usar o AWS PrivateLink, os recursos do VPC que respondem a condições de espera deverão ter acesso aos buckets do Amazon Simple Storage Service (Amazon S3) específicos do CloudFormation. Recursos devem enviar respostas à condição de espera para um URL pré-assinado do Amazon S3. Se não puderem enviar respostas para o Amazon S3, o CloudFormation não receberá uma resposta e há falha na operação de pilha. Para obter mais informações, consulte [Acessar o CloudFormation usando um endpoint de interface (AWS PrivateLink)](vpc-interface-endpoints.md) e [Controlar o acesso a partir de VPC endpoints com políticas de bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html).

**Topics**
+ [Criar uma condição de espera no modelo](#creating-wait-condition)
+ [Sintaxe de sinal da condição de espera](#wait-condition-signal-syntax)
+ [Acessar dados de sinal](#wait-condition-access-signal-data)

## Criar uma condição de espera no modelo
<a name="creating-wait-condition"></a>

**1. Processamento de condição de espera**  
Você começa definindo um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitconditionhandle.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitconditionhandle.html) no modelo da pilha. Esse recurso gera o URL pré-assinado necessário para enviar sinais. Isso permite que você envie um sinal sem precisar fornecer as suas credenciais da AWS. Por exemplo: 

```
Resources:
  MyWaitHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

**2. Condição de espera**  
Depois, você define um recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitcondition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitcondition.html) no modelo da pilha. A estrutura básica de um recurso `AWS::CloudFormation::WaitCondition` é assim: 

```
  MyWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    Properties:
      Handle: String
      Timeout: String
      Count: Integer
```

O recurso `AWS::CloudFormation::WaitCondition` tem duas propriedades obrigatórias e uma propriedade opcional.
+ `Handle` (obrigatório): uma referência a um `WaitConditionHandle` declarado no modelo.
+ `Timeout` (obrigatório): o número de segundos que o CloudFormation deve esperar até o número necessário de sinais ser recebido. `Timeout` é uma propriedade de limite mínimo, o que significa que o tempo limite não ocorre antes do tempo especificado, mas pode ocorrer logo depois. O tempo máximo que você pode especificar é 43200 segundos (12 horas).
+ `Count` (opcional): o número de sinais de sucesso que o CloudFormation deve receber antes de definir o status dessa condição de espera como `CREATE_COMPLETE` e continuar criando a pilha. Se não for especificado, o valor padrão é 1.

Normalmente, você quer que uma condição de espera comece imediatamente após a criação de um determinado recurso. Para isso, adicione o atributo `DependsOn` a uma condição de espera. Quando você adiciona um atributo `DependsOn` a uma condição de espera, o CloudFormation primeiro cria o recurso no atributo `DependsOn` e depois cria a condição de espera. Para obter mais informações, consulte o atributo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html).

O seguinte exemplo ilustra uma condição de espera que: 
+ Começa após a criação bem-sucedida do recurso `MyEC2Instance`
+ Usa o recurso `MyWaitHandle` como `WaitConditionHandle`
+ Tem um tempo limite de 4.500 segundos
+ Tem a `Count` padrão de 1 (já que nenhuma propriedade `Count` está especificada)

```
  MyWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    DependsOn: MyEC2Instance
    Properties:
      Handle: !Ref MyWaitHandle
      Timeout: '4500'
```

**3. Enviar um sinal**  
Para sinalizar sucesso ou falha para o CloudFormation, você normalmente executa algum código ou script. Por exemplo, uma aplicação em execução em uma instância do EC2 pode realizar algumas tarefas de configuração adicionais e enviar um sinal para o CloudFormation para indicar a conclusão.

O sinal deve ser enviado para o URL pré-assinado gerado pelo identificador da condição de espera. Você usa o URL pré-assinado para sinalizar sucesso ou falha.

**Para enviar um sinal**

1. Para recuperar o URL pré-assinado no modelo, use a função intrínseca `Ref` com o nome lógico do identificador da condição de espera. 

   Conforme mostrado no exemplo a seguir, o modelo pode declarar uma instância do Amazon EC2 e passar o URL pré-assinado para instâncias EC2 usando a propriedade `UserData` do Amazon EC2. Isso permite que scripts ou aplicações executados nessas instâncias sinalizem sucesso ou falha para o CloudFormation.

   ```
     MyEC2Instance:
       Type: AWS::EC2::Instance
       Properties:
       InstanceType: t2.micro  # Example instance type
       ImageId: ami-055e3d4f0bbeb5878  # Change this as needed (Amazon Linux 2023 in us-west-2)
       UserData:
         Fn::Base64: 
           Fn::Join: 
             - ""
             - - "SignalURL="
               - { "Ref": "MyWaitHandle" }
   ```

   Isso gera uma saída `UserData` assim:

   ```
   SignalURL=https://amzn-s3-demo-bucket.s3.amazonaws.com/....
   ```

   Observação: no Console de gerenciamento da AWS e nas ferramentas de linha de comando, o URL pré-assinado é exibido como um ID físico do identificador de condição de espera.

1. (Opcional) Para detectar quando a pilha entra na condição de espera, você pode usar um dos seguintes métodos:
   + Se você criar a pilha com notificações habilitadas, o CloudFormation publicará uma notificação para cada evento da pilha no tópico especificado. Se você ou seu aplicativo se inscrever nesse tópico, você poderá monitorar as notificações do evento de criação do identificador de condição de espera e recuperará o pre-signed URL na mensagem de notificação.
   + Você também pode monitorar os eventos da pilha usando o Console de gerenciamento da AWS, a AWS CLI ou um SDK.

1. Para enviar um sinal, envie uma mensagem de solicitação HTTP usando o pre-signed URL. O método de solicitação deve ser `PUT`, e o cabeçalho `Content-Type` deve ser omitido ou uma string vazia. A mensagem de solicitação deve ser uma estrutura JSON do formulário especificado em [Sintaxe de sinal da condição de espera](#wait-condition-signal-syntax).

   É necessário enviar o número de sinais de sucesso especificados pela propriedade `Count` para que o CloudFormation continue a criar a pilha. Se a propriedade `Count` for maior do que 1, o valor do `UniqueId` de cada sinal deverá ser exclusivo em todos os sinais enviados a uma condição de espera específica. O `UniqueId` é uma string alfanumérica arbitrária.

   Um comando `curl` é uma forma de enviar um sinal. O exemplo a seguir mostra uma linha do comando `curl` que sinaliza o êxito para uma condição de espera.

   ```
   $ curl -T /tmp/a \
     "https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
   ```

   em que o arquivo *`/tmp/a`* contém a seguinte estrutura JSON:

   ```
   {
      "Status" : "SUCCESS",
      "Reason" : "Configuration Complete",
      "UniqueId" : "ID1234",
      "Data" : "Application has completed configuration."
   }
   ```

   Este exemplo mostra uma linha do comando `curl` que envia o mesmo sinal de êxito, exceto que ele envia a estrutura JSON como um parâmetro na linha de comando.

   ```
   $ curl -X PUT \
     -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' \
     "https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
   ```

## Sintaxe de sinal da condição de espera
<a name="wait-condition-signal-syntax"></a>

Ao enviar sinais para o URL gerado pela condição de espera, você deve usar o seguinte formato JSON:

```
{
  "Status" : "StatusValue",
  "UniqueId" : "Some UniqueId",
  "Data" : "Some Data",
  "Reason" : "Some Reason"
}
```

### Propriedades
<a name="wait-condition-signal-properties"></a>

O campo `Status` pode ter um dos seguintes valores:
+ `SUCCESS`
+ `FAILURE`

O campo `UniqueId` identifica o sinal para o CloudFormation. Se a propriedade `Count` da condição de espera for maior que 1, o valor de `UniqueId` deverá ser exclusivo em todos os sinais enviados de uma determinada condição de espera; caso contrário, o CloudFormation considerará o sinal uma retransmissão dos sinais enviados anteriormente com o mesmo `UniqueId` e o ignorará.

O campo `Data` pode conter qualquer informação que você deseje enviar de volta com o sinal. Você pode acessar o valor `Data` chamando a função [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt) no modelo.

O campo `Reason` é uma string sem nenhuma outra restrição em seu conteúdo além de conformidade com JSON.

## Acessar dados de sinal
<a name="wait-condition-access-signal-data"></a>

Para acessar os dados enviados por sinais válidos, você pode criar um valor de saída para a condição de espera no modelo do CloudFormation. Por exemplo:

```
Outputs:
  WaitConditionData:
    Description: The data passed back as part of signalling the WaitCondition
    Value: !GetAtt MyWaitCondition.Data
```

Você pode visualizar esses dados usando o comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html) ou a guia **Saídas** do console do CloudFormation.

A função `Fn::GetAtt` retorna o `UniqueId` e os `Data` como um par de nome/valor em uma estrutura JSON. Por exemplo:

```
{"Signal1":"Application has completed configuration."}
```

# Criar configurações de recursos reutilizáveis que podem ser incluídas em modelos com os módulos do CloudFormation
<a name="modules"></a>

Os *módulo*s são uma maneira de empacotar configurações de recursos para inclusão entre modelos de pilha, de modo transparente, gerenciável e repetível. Os módulos podem encapsular configurações comuns de serviço e práticas recomendadas como blocos de construção modulares e personalizáveis para você incluir em seus modelos de pilha. Os módulos permitem que você inclua configurações de recursos que incorporem práticas recomendadas, conhecimento especializado em áreas específicas e diretrizes aceitas (para áreas como segurança, conformidade, governança e regulamentações setoriais) aos seus modelos, sem precisar adquirir conhecimento profundo sobre as complexidades da implementação de recursos.

Por exemplo, um especialista na área de rede pode criar um módulo que contenha grupos de segurança integrados e regras de entrada/saída que sigam as diretrizes de segurança. Em seguida, você pode incluir esse módulo em seu modelo para provisionar infraestrutura de rede segura em sua pilha, sem precisar gastar tempo entendendo o funcionamento de VPCs, sub-redes, grupos de segurança e gateways. Além disso, como os módulos têm versionamento, se houver mudança nas diretrizes de segurança ao longo do tempo, o autor do módulo pode criar uma nova versão do módulo que incorpore essas alterações.

As características do uso de módulos em seus modelos incluem:
+ **Previsibilidade**: um módulo precisa aderir ao esquema em que foi registrado no registro do CloudFormation para que você possa saber para quais recursos ele pode resolver após incluí-lo em seu modelo.
+ **Reutilização**: você pode usar o mesmo módulo em vários modelos e contas.
+ **Rastreabilidade**: o CloudFormation retém o conhecimento sobre quais recursos em uma pilha foram provisionados com base em um módulo, permitindo que você entenda facilmente a origem das alterações de recursos.
+ **Capacidade de gerenciamento**: após registrar um módulo, você pode gerenciá-lo por meio do registro do CloudFormation, incluindo versionamento e disponibilidade de conta e regional.

Um módulo pode conter:
+ Um ou mais recursos a serem provisionados com base no módulo, juntamente com quaisquer dados associados, como saídas ou condições.
+ Qualquer parâmetro de módulo, permitindo que você especifique valores personalizados sempre que o módulo for usado.

Para obter informações sobre como desenvolver módulos, consulte [Desenvolver módulos](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/modules.html) no *Guia do usuário da CLI do CloudFormation*.

**Topics**
+ [Considerações sobre o uso de módulos](#module-considerations)
+ [Entender o versionamento de módulos](module-versioning.md)
+ [Usar módulos do registro privado do CloudFormation](modules-using.md)
+ [Usar parâmetros para especificar valores de módulo](module-using-params.md)
+ [Recursos do módulo de referência nos modelos do CloudFormation](module-ref-resources.md)

## Considerações sobre o uso de módulos
<a name="module-considerations"></a>
+ Não há cobrança adicional pelo uso de módulos. Você paga apenas pelos recursos para os quais os módulos resolvem em suas pilhas.
+ As cotas do CloudFormation, como o número máximo de recursos permitidos em uma pilha ou o tamanho máximo do corpo do modelo, aplicam-se ao modelo processado independentemente de os recursos incluídos nesse modelo serem ou não provenientes de módulos. Para obter mais informações, consulte [Entender as cotas do CloudFormation](cloudformation-limits.md).
+ As tags especificadas para a pilha são atribuídas aos recursos individuais derivados do módulo.
+ Scripts auxiliares especificados no módulo não se propagam para os recursos individuais contidos no módulo quando o CloudFormation processa o modelo.
+ As saídas especificadas no módulo são propagadas para saídas no modelo.

  Cada saída receberá um ID lógico que é uma concatenação do nome lógico do módulo e o nome de saída, conforme definido no módulo. Para obter mais informações, consulte [Obter resultados exportados de uma pilha do CloudFormation implantada](using-cfn-stack-exports.md).
+ Os parâmetros especificados no módulo não são propagados para parâmetros no nível do modelo.

  No entanto, você pode criar parâmetros no âmbito de modelos que fazem referência a parâmetros de módulo. Para obter mais informações, consulte [Usar parâmetros para especificar valores de módulo](module-using-params.md).

# Entender o versionamento de módulos
<a name="module-versioning"></a>

O registro do CloudFormation atua como um repositório onde você pode registrar e gerenciar módulos para uso em sua região e Conta da AWS. Você pode registrar módulos de várias fontes, incluindo AWS, publicadores externos e suas próprias extensões personalizadas, dentro da sua conta e da sua região. Para obter mais informações, consulte [Gerenciar extensões com o registro do CloudFormation](registry.md).

Os módulos podem ter versões diferentes para que você possa especificar qual versão do módulo deseja usar. Esse recurso de versionamento é particularmente útil quando você precisa atualizar ou modificar um módulo sem quebrar as pilhas existentes que dependem dele.

Tenha em mente as seguintes considerações ao usar várias versões de um módulo:
+ Durante operações de pilha, o CloudFormation usa a versão do módulo que está registrada atualmente como padrão na região e na Conta da AWS em que a operação de pilha está sendo executada. Isso inclui módulos que estejam aninhados a outros módulos.

  Portanto, lembre-se: se houver versões diferentes do mesmo módulo registradas como a versão padrão em diferentes contas ou regiões, o uso do mesmo modelo pode gerar resultados diferentes.
+ Durante operações de pilha, o CloudFormation usa a versão do recurso que está registrada como a versão padrão na região e na Conta da AWS nas quais a operação de pilha está sendo executada. Isso inclui os recursos gerados pela inclusão de módulos.
+ A alteração da versão padrão de um módulo não inicia nenhuma operação de atualização de pilha. No entanto, na próxima vez que você executar uma operação de pilha com qualquer modelo contendo o respectivo módulo, como uma atualização de pilha, o CloudFormation usará a nova versão padrão na operação.

  A única exceção a isso é a execução de uma atualização de pilha com a opção **usar modelo anterior** especificada, conforme descrito abaixo.
+ Para operações de atualização de pilha, se você especificar a opção **usar modelo anterior**, o CloudFormation usará o modelo processado anteriormente para a atualização de pilha e não reprocessará o módulo para nenhuma alteração que você possa ter feito nele.
+ Para garantir resultados uniformes, se estiver incluindo módulos em um modelo de pilha para uso com conjuntos de pilha, certifique-se de que a mesma versão do módulo esteja definida como a versão padrão em todas as contas e regiões nas quais você está planejando implantar suas instâncias de pilha. Isso inclui módulos que estejam aninhados a outros módulos. Para obter mais informações, consulte [Gerenciar pilhas em todas as contas e regiões com StackSets](what-is-cfnstacksets.md).

## Requisitos para ativar módulos públicos de terceiros
<a name="requirements-for-modules"></a>

Para ativar com êxito um módulo público de terceiros em sua conta e região, o seguinte deve ser verdadeiro para cada extensão pública de terceiros (recurso ou módulo) incluída nesse módulo:
+ **Ativação da extensão**: a extensão deve estar ativada na conta e na região em que você deseja usá-la. Para obter mais informações, consulte [Usar extensões públicas de terceiros do registro do CloudFormation](registry-public.md).
+ **Registro do alias**: se a extensão no módulo utilizar um alias de nome de tipo, ela deverá ser registrada na sua conta e região utilizando o mesmo alias de nome de tipo. Para obter mais informações, consulte [Usar aliases para fazer referência a extensões](registry-public.md#registry-public-enable-alias).
+ **Compatibilidade de versões**: a versão da extensão ativada no momento deve ser uma das principais versões com suporte dessa extensão especificada no módulo.

Se você não tiver as extensões públicas de terceiros corretas e versões de extensão ativadas, o CloudFormation falhará na operação com um erro listando as extensões e versões que precisam ser ativadas antes que o módulo possa ser ativado com êxito.

# Usar módulos do registro privado do CloudFormation
<a name="modules-using"></a>

Este tópico explica como usar módulos em modelos do CloudFormation. Pense nos módulos como pacotes predefinidos de recursos que você pode adicionar aos seus modelos.

Para usar um módulo, as etapas são as seguintes:
+ **Registre o módulo**: registre módulos no registro do CloudFormation como extensões privadas. Verifique se ele está registrado na região e na Conta da AWS em que você está trabalhando. Para obter mais informações, consulte [Conceitos do registro do CloudFormation](registry-concepts.md).
+ **Inclua-o em seu modelo**: adicione o módulo à seção [Resources](resources-section-structure.md) do seu modelo do CloudFormation, assim como você faria com outros recursos. Você também precisará fornecer todas as propriedades necessárias para o módulo.
+ **Crie ou atualize a pilha**: quando você inicia uma operação de pilha, o CloudFormation gera um modelo processado que resolve todos os módulos incluídos nos recursos apropriados. 
+ **Pré-visualize as alterações**: antes de fazer alterações, você pode usar um conjunto de alterações para ver quais recursos serão adicionados ou alterados. Para obter mais informações, consulte [Atualizar pilhas do CloudFormation usando conjuntos de alterações](using-cfn-updating-stacks-changesets.md).

Considere o exemplo a seguir: você tem um modelo que contém recursos e módulos. O modelo contém um recurso individual, `ResourceA`, e um módulo, `ModuleParent`. Esse módulo contém dois recursos, `ResourceB` e `ResourceC`, bem como um módulo aninhado, `ModuleChild`. `ModuleChild` contém um único recurso, `ResourceD`. Se você criar uma pilha com base nesse modelo, o CloudFormation o processará e resolverá os módulos para os recursos apropriados. A pilha resultante tem quatro recursos: `ResourceA`, `ResourceB`, `ResourceC` e `ResourceD`.

![\[Durante uma operação de pilha, o CloudFormation resolve os dois módulos incluídos no modelo de pilha nos quatro recursos adequados.\]](http://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/images/modules-resource-inclusion.png)


O CloudFormation acompanha quais recursos em uma pilha foram criados com base em módulos. Você pode visualizar essas informações nas guias **Events** (Eventos), **Resources** (Recursos) e **Drifts** (Desvios) de uma determinada pilha. Elas também estão incluídas nas visualizações do conjunto de alterações.

É possível fazer a distinção entre módulos e recursos em um modelo porque eles aderem à seguinte convenção de nomenclatura com quatro partes, em contraste com a convenção habitual de três partes usada por recursos:

```
organization::service::use-case::MODULE
```

# Usar parâmetros para especificar valores de módulo
<a name="module-using-params"></a>

No CloudFormation, é possível usar parâmetros de modelos para personalizar suas pilhas ao fornecer valores de entrada durante a criação ou atualização da pilha. Esses parâmetros permitem que você altere certos aspectos da pilha com base em suas necessidades. Para obter mais informações sobre a definição de parâmetros do modelo, consulte [Sintaxe de Parameters de modelo do CloudFormation](parameters-section-structure.md).

Da mesma forma, os módulos também podem ter parâmetros. Esses parâmetros de módulo permitem que você insira valores personalizados no módulo com base no modelo (ou outro módulo) que o está usando. Assim, o módulo pode usar esses valores personalizados para definir as propriedades dos recursos nele contidos.

Você também pode definir parâmetros de modelo que definem propriedades de módulo para poder inserir valores que são passados para o módulo no momento da operação de pilha. 

Se um módulo contiver um módulo aninhado que possua seus próprios parâmetros do módulo, você poderá:
+ Especificar os valores para os parâmetros do módulo aninhado diretamente no módulo pai.
+ Definir os parâmetros correspondentes do módulo no módulo pai que permitem que os parâmetros do módulo aninhado sejam definidos pelo modelo (ou módulo) no qual o módulo pai está contido.

## Como usar parâmetros de modelo para especificar valores de parâmetro de módulo
<a name="module-using-params-example-1"></a>

O exemplo a seguir mostra como definir parâmetros de modelo que repassam valores para um módulo.

Este modelo que contém `My::S3::SampleBucket::MODULE` define um parâmetro de modelo, `BucketName`, que permite que o usuário especifique um nome de bucket do S3 durante a operação de pilha.

```
# Template containing My::S3::SampleBucket::MODULE
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: 'My::S3::SampleBucket::MODULE'
    Properties:
      BucketName: !Ref BucketName
```

## Como especificar propriedades em recursos em um módulo filho com base no módulo pai
<a name="module-using-params-example-2"></a>

O exemplo a seguir ilustra como especificar valores de parâmetro em um módulo que esteja aninhado dentro de outro módulo.

Este primeiro módulo, `My::S3::SampleBucketPrivate::MODULE`, será o módulo filho. Ele define dois parâmetros: `BucketName` e `AccessControl`. Os valores especificados para esses parâmetros são usados para especificar as propriedades `BucketName` e `AccessControl` do recurso `AWS::S3::Bucket` que o módulo contém. Abaixo apresentamos o fragmento de modelo para `My::S3::SampleBucketPrivate::MODULE`.

```
# My::S3::SampleBucketPrivate::MODULE
AWSTemplateFormatVersion: 2010-09-09
Description: A sample S3 Bucket with Versioning and DeletionPolicy.
Parameters:
  BucketName:
    Description: Name for the bucket
    Type: String
  AccessControl:
    Description: AccessControl for the bucket
    Type: String
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      AccessControl: !Ref AccessControl
      DeletionPolicy: Retain
      VersioningConfiguration:
        Status: Enabled
```

Em seguida, o módulo anterior é aninhado em um módulo pai, `My::S3::SampleBucket::MODULE`. O módulo pai, `My::S3::SampleBucket::MODULE`, define os parâmetros do módulo filho das seguintes maneiras:
+ Ele define o parâmetro `AccessControl` de `My::S3::SampleBucketPrivate::MODULE` para `Private`.
+ Para `BucketName`, ele define um parâmetro de módulo, que permitirá que o nome do bucket seja especificado no modelo (ou módulo) que contém `My::S3::SampleBucket::MODULE`.

```
# My::S3::SampleBucket::MODULE
AWSTemplateFormatVersion: 2010-09-09
Description: A sample S3 Bucket. With Private AccessControl.
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: 'My::S3::SampleBucketPrivate::MODULE'
    Properties:
      BucketName: !Ref BucketName
      AccessControl: Private
```

## Como especificar restrições para parâmetros de módulo
<a name="modules-using-parameters-constraints"></a>

Os parâmetros de módulo não são compatíveis com a imposição de restrições. Para executar a verificação de restrição em um parâmetro de módulo, crie um parâmetro de modelo com as restrições desejadas. Em seguida, faça referência a esse parâmetro de modelo no seu parâmetro de módulo. Para obter mais informações sobre a definição de parâmetros do modelo, consulte [Sintaxe de Parameters de modelo do CloudFormation](parameters-section-structure.md).

# Recursos do módulo de referência nos modelos do CloudFormation
<a name="module-ref-resources"></a>

Nos modelos do CloudFormation, muitas vezes é necessário definir as propriedades em um recurso com base no nome ou na propriedade de outro recurso. Para obter mais informações, consulte [Fazer referência a recursos](resources-section-structure.md#using-cross-resource-references).

Para fazer referência um recurso contido em um módulo em seu modelo do CloudFormation, é necessário combinar dois nomes lógicos:
+ O nome lógico que você atribuiu ao próprio módulo ao incluí-lo em seu modelo.
+ O nome lógico do recurso específico nesse módulo.

É possível combinar esses dois nomes lógicos usando ou não um ponto (.) entre eles. Por exemplo, se o nome lógico do módulo for `MyModule` e o nome lógico do recurso for `MyBucket`, você poderá se referir a esse recurso como `MyModule.MyBucket` ou `MyModuleMyBucket`.

Para encontrar os nomes lógicos dos recursos dentro de um módulo, é possível consultar o esquema do módulo, que está disponível no registro do CloudFormation, ou via operação [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html). O esquema lista todos os recursos e seus nomes lógicos que fazem parte do módulo.

Depois de ter o nome lógico completo, você pode usar funções do CloudFormation, `GetAtt` como `Ref` e, para acessar valores de propriedade em recursos do módulo. 

Por exemplo, você tem um módulo `My::S3::SampleBucket::MODULE` que contém um recurso `AWS::S3::Bucket` com o nome lógico `S3Bucket`. Para se referir ao nome desse bucket usando a função `Ref`, combine o nome do módulo em seu modelo (`MyBucket`) com o nome lógico do recurso no módulo (`S3Bucket`). O nome lógico completo é `MyBucket.S3Bucket` ou `MyBucketS3Bucket`.

**Exemplo de modelo**  
O modelo de exemplo a seguir cria um bucket do S3 usando o módulo `My::S3::SampleBucket::MODULE`. Ele também cria uma fila do Amazon SQS e define seu nome para ser igual ao nome do bucket do módulo. Além disso, o modelo produz o nome do recurso da Amazon (ARN) do bucket de S3 criado.

```
# Template that uses My::S3::SampleBucket::MODULE
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: My::S3::SampleBucket::MODULE
    Properties:
      BucketName: !Ref BucketName
  exampleQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Ref MyBucket.S3Bucket
Outputs:
  BucketArn:
    Value: !GetAtt MyBucket.S3Bucket.Arn
```