

# 编写 Python 金丝雀脚本
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python"></a>

此脚本将成功通过一次运行，并返回一个字符串。要查看失败的金丝雀示例，请将 fail = False 更改为 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()
```

## 将 Python 金丝雀文件打包
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_package"></a>

如果您有多个 .py 文件或脚本具有依赖项，则您可以将它们捆绑到单个 ZIP 格式文件中。如果您使用 `syn-python-selenium-1.1` 运行时，此 ZIP 格式文件必须将主金丝雀 .py 文件包含在 `python` 文件夹中，例如 `python/my_canary_filename.py`。如果您使用 ` syn-python-selenium-1.1` 或之后版本，您可以选择使用其他文件夹，例如 `python/myFolder/my_canary_filename.py`。

此 ZIP 格式文件应包含所有必要的文件夹和文件，但其他文件不需要位于 `python` 文件夹中。

请务必将您的金丝雀脚本入口点设置为 ` my_canary_filename.functionName`，以匹配脚本入口点的文件名和函数名称。如果您使用 `syn-python-selenium-1.0` 运行时，则 `functionName` 必须是 `handler`。如果您使用 ` syn-python-selenium-1.1` 或之后版本，该处理程序名称限制不适用，您也可以选择将金丝雀存储在单独的文件夹中，例如 ` python/myFolder/my_canary_filename.py`。如果将其存储在单独的文件夹中，请在脚本入口点中指定该路径，例如 ` myFolder/my_canary_filename.functionName`。

## 更改现有 Puppeteer 脚本以使用 Synthetics 金丝雀
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_Selenium"></a>

您可以快速修改用于 Python 和 Selenium 的现有脚本以用作金丝雀。有关 Selenium 的更多信息，请参阅 [www.selenium.dev/](https://www.selenium.dev/)。

在本示例中，将从以下 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()
```

转换步骤如下。

**转换 Selenium 脚本以用作金丝雀**

1. 更改 `import` 语句以使用 ` aws_synthetics` 模块中的 Selenium：

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

   `aws_synthetics` 模块中的 Selenium 确保金丝雀可以发出指标和日志、生成 HAR 文件及使用其他 CloudWatch Synthetics 功能。

1. 创建一个处理程序函数并调用您的 Selenium 方法。处理程序是脚本的入口点函数。

   如果您使用 `syn-python-selenium-1.0`，处理程序函数必须命名为 `handler`。如果您使用 `syn-python-selenium-1.1` 或之后版本，函数可以有任何名称，但必须与脚本中使用的名称相同。此外，如果您使用 `syn-python-selenium-1.1` 或之后版本，您可以将脚本存储在任何文件夹下，并将该文件夹指定为处理程序名称的一部分。

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

脚本现已更新为 CloudWatch Synthetics 金丝雀。更新的脚本如下：

`webdriver` 是 [SyntheticsWebDriver](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver) 类的实例，而由 `webdriver.Chrome()` 返回的浏览器则是 [SyntheticsBrowser](https://docs.amazonaws.cn/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()
```

## 更改现有的 Puppeteer Synthetics 脚本以验证非标准证书
<a name="Canaries_Non-Standard_Certificates"></a>

Synthetics Canary 的一个重要用例是让您监测自己的端点。如果您想监测尚未准备好接收外部流量的端点，这种监测有时可能意味着您尚未拥有由可信的第三方证书颁发机构签署的正确证书。

对于这种情况，有如下两种可能的解决方案：
+ 要对客户端证书进行身份验证，请参阅 [How to validate authentication using Amazon CloudWatch Synthetics – Part 2](https://www.amazonaws.cn/blogs/mt/how-to-validate-authentication-using-amazon-cloudwatch-synthetics-part-2/)。
+ 要对自签名证书进行身份验证，请参阅 [ How to validate authentication with self-signed certificates in Amazon CloudWatch Synthetics](https://www.amazonaws.cn/blogs/mt/how-to-validate-authentication-with-self-signed-certificates-in-amazon-cloudwatch-synthetics/)

使用 CloudWatch Synthetics Canary 时，您的选择并不局限于以上两种。您可以通过扩展 Canary 代码来扩展这些功能并添加业务逻辑。

**注意**  
在 Python 运行时上运行的 Synthetics Canary 本身就启用了 ` --ignore-certificate-errors` 标志，因此这些 Canary 在访问具有非标准证书配置的网站时，不应出现任何问题。