

# Escrever um script o canário do Python
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python"></a>

Esse script é executado com êxito e retorna uma string. Para ver como é um canário com falha, altere fail = False to fail = True

```
def basic_custom_script():
    # Insert your code here
    # Perform multi-step pass/fail check
    # Log decisions made and results to /tmp
    # Be sure to wait for all your code paths to complete 
    # before returning control back to Synthetics.
    # In that way, your canary will not finish and report success
    # before your code has finished executing
    fail = False
    if fail:
        raise Exception("Failed basicCanary check.")
    return "Successfully completed basicCanary checks."
def handler(event, context):
    return basic_custom_script()
```

## Empacotamento dos arquivos do canário para Python
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_package"></a>

Se você tiver mais de um arquivo .py ou se o script tiver uma dependência, será possível agrupá-los em um único arquivo ZIP. Se você usar o runtime `syn-python-selenium-1.1`, o arquivo ZIP deverá conter o arquivo .py canário principal dentro de uma pasta `python`, como `python/my_canary_filename.py`. Se você usar ` syn-python-selenium-1.1` ou posterior, poderá usar uma pasta diferente, como `python/myFolder/my_canary_filename.py`.

Este arquivo ZIP deverá conter todas as pastas e arquivos necessários, mas os outros arquivos não precisam estar na pasta `python`.

Defina o ponto de entrada do script o canário como ` my_canary_filename.functionName` para corresponder ao nome do arquivo e ao nome da função do ponto de entrada do script. Se você estiver usando o runtime `syn-python-selenium-1.0`, `functionName` deverá ser `handler`. Se estiver usando ` syn-python-selenium-1.1` ou posterior, essa restrição de nome do manipulador não se aplicará, e você também poderá, opcionalmente, armazenar o canário em uma pasta separada, como ` python/myFolder/my_canary_filename.py`. Se você armazenar em uma pasta separada, especifique esse caminho no ponto de entrada do script, como ` myFolder/my_canary_filename.functionName`. 

## Alterar um script existente do Selenium para ser usado como canário do Synthetics
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_Selenium"></a>

É possível modificar rapidamente um script existente para Python e Selenium a ser usado como canário. Para obter mais informações sobre o Selenium, consulte [www.selenium.dev/](https://www.selenium.dev/).

Neste exemplo, começaremos com o seguinte script Selenium:

```
from selenium import webdriver

def basic_selenium_script():
    browser = webdriver.Chrome()
    browser.get('https://example.com')
    browser.save_screenshot('loaded.png')

basic_selenium_script()
```

As etapas de conversão são as seguintes.

**Para converter um script Selenium para ser usado como canário**

1. Altere a instrução `import` para usar o Selenium a partir do módulo ` aws_synthetics`:

   ```
   from aws_synthetics.selenium import synthetics_webdriver as webdriver
   ```

   O módulo Selenium a partir de `aws_synthetics` garante que o canário poderá emitir métricas e logs, gerar um arquivo HAR e trabalhar com outros recursos do CloudWatch Synthetics.

1. Crie uma função de manipulador e chame seu método Selenium. O manipulador é a função de ponto de entrada para o script.

   Se estiver usando `syn-python-selenium-1.0`, a função do manipulador deverá ser nomeada `handler`. Se estiver usando `syn-python-selenium-1.1` ou posterior, a função poderá ter qualquer nome, mas deverá ser o mesmo nome usado no script. Além disso, se você estiver usando `syn-python-selenium-1.1` ou posterior, poderá armazenar scripts em qualquer pasta e especificar essa pasta como parte do nome do manipulador.

   ```
   def handler(event, context):
       basic_selenium_script()
   ```

Agora, o script é atualizado para ser um canário do CloudWatch Synthetics. Veja a seguir o script atualizado:

O `webdriver` é uma instância da classe [SyntheticsWebDriver](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver) e o navegador retornado por `webdriver.Chrome()` é uma instância de [SyntheticsBrowser](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsBrowser).

```
from aws_synthetics.selenium import synthetics_webdriver as webdriver

def basic_selenium_script():
    browser = webdriver.Chrome()
    browser.get('https://example.com')
    browser.save_screenshot('loaded.png')

def handler(event, context):
    basic_selenium_script()
```

## Como alterar um script existente do Puppeteer Synthetics para autenticar certificados não padrão
<a name="Canaries_Non-Standard_Certificates"></a>

Um caso de uso importante dos canários Synthetics é monitorar seus próprios endpoints. Se você quiser monitorar um endpoint que não esteja pronto para tráfego externo, esse monitoramento poderá, às vezes, significar que você não tenha um certificado adequado assinado por uma autoridade de certificação terceirizada confiável.

Duas soluções possíveis para esse cenário são as seguintes:
+ Para autenticar um certificado de cliente, consulte [Como validar a autenticação usando o Amazon CloudWatch Synthetics – Parte 2](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-using-amazon-cloudwatch-synthetics-part-2/).
+ Para autenticar um certificado autoassinado, consulte [Como validar a autenticação com certificados autoassinados no Amazon CloudWatch Synthetics](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-with-self-signed-certificates-in-amazon-cloudwatch-synthetics/)

Você não está limitado a essas duas opções ao usar os canários CloudWatch Synthetics. Você pode estender esses recursos e adicionar sua lógica de negócios estendendo o código canário.

**nota**  
Os canários Synthetics executados em runtimes do Python têm o sinalizador ` --ignore-certificate-errors` habilitado de forma inata, portanto, esses canários não devem ter problemas para acessar sites com configurações de certificado não padrão.