

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 合成監控 ( Canary)
<a name="CloudWatch_Synthetics_Canaries"></a>

您可以使用 Amazon CloudWatch Synthetics 來建立 *Canary* (這是在排程上執行的可設定指令碼)，來監控端點和 API。Canary 遵循相同的路由並執行與客戶相同的動作，即使您的應用程式沒有任何客戶流量，也能持續驗證您的客戶體驗。透過使用 Canary，您可以在客戶之前發現問題。

Canary 是以 Node.js、Python 或 Java 撰寫的指令碼。Canary 會使用 Node.js、Python 或 Java 作為執行時期，在您的帳戶中建立 Lambda 函式。Canary 透過 HTTP 和 HTTPS 通訊協定運作。Canary 使用包含 CloudWatch Synthetics 程式庫的 Lambda 圖層。程式庫包含 NodeJS、Python 和 Java 的 CloudWatch Synthetics 實作。

Node.js 和 Python 執行時期中的 Canary 提供透過 Playwright、Puppeteer 或 Selenium Webdriver 程式化存取無周邊瀏覽器的功能。支援多個瀏覽器，包括無周邊 Google Chrome 瀏覽器和 Mozilla Firefox。如需 Playwright 的詳細資訊，請參閱 [Playwright](https://playwright.dev/)。如需 Puppeteer 的詳細資訊，請參閱 [Puppeteer](https://developer.chrome.com/docs/puppeteer/)。如需 Selenium 的詳細資訊，請參閱 [Selenium](https://www.selenium.dev/)。Selenium 上的 Canary 僅支援 Chrome 瀏覽器。Java 中的 Canary 專為彈性監控任何類型的服務或應用程式而設計，不包含瀏覽器支援或架構。

Canary 會檢查端點的可用性和延遲，並可儲存 UI 的載入時間資料和螢幕擷取畫面。它們會監控您的 REST API、URL 和網站內容，並且可以檢查來自網路釣魚、程式碼插入和跨網站指令碼的未經授權變更。

 CloudWatch Synthetics 與 [Application Signals](CloudWatch-Application-Monitoring-Sections.md) 整合，可探索並監控您的應用程式服務、用戶端、Synthetics Canaries 和服務相依性。使用 Application Signals 查看服務清單或視覺化地圖，根據您的服務等級目標 (SLO) 檢視運作狀態指標，並深入了解相關的 X-Ray 追蹤以取得更詳細的疑難排解。若要在 Application Signals 中查看您的 Canaries，請[開啟 X-Ray 作用中追蹤](CloudWatch_Synthetics_Canaries_tracing.md)。您的 Canary 會顯示在與您的服務相連的[應用程式地圖](ServiceMap.md)以及它們呼叫之服務的[服務詳細資訊](ServiceDetail.md)頁面中。

如需 Canary 的影片示範，請參閱以下內容：
+  [Amazon CloudWatch Synthetics 簡介](https://www.youtube.com/watch?v=MItluIsvfTo) 
+  [Amazon CloudWatch Synthetics 示範](https://www.youtube.com/watch?v=hF3NM9j-u7I) 
+  [使用 Amazon CloudWatch Synthetics 建立 Canary](https://www.youtube.com/watch?v=DSx65wW7lr0) 
+  [使用 Amazon CloudWatch Synthetics 進行視覺化監控](https://www.youtube.com/watch?v=_PCs-ucZz7E) 



您可以只執行一次 Canary，也可以定期執行。Canary 可以每分鐘執行一次。您可以使用 Cron 與 Rate 表達式來排程 Canary。

如需建立和執行 Canary 之前要考量之安全性問題的相關資訊，請參閱[Synthetics Canary 的安全考量](servicelens_canaries_security.md)。

根據預設，Canary 會在 `CloudWatchSynthetics` 命名空間中建立數個 CloudWatch 指標。這些指標具有 `CanaryName` 的維度。使用函數庫中 `executeStep()` 或 `executeHttpStep()` 函數的 Canary 也具有 `StepName` 的維度。如需 Canary 函數庫的詳細資訊，請參閱[適用於 Canary 指令碼的程式庫函數](CloudWatch_Synthetics_Canaries_Function_Library.md)。

CloudWatch Synthetics 可與 X-Ray 追蹤地圖完美整合，以使用 CloudWatch 搭配 AWS X-Ray 提供服務的端對端檢視，協助您更有效率地找出效能瓶頸，並找出受影響的使用者。您利用 CloudWatch Synthetics 建立的 Canary 會顯示在追蹤地圖上。如需詳細資訊，請參閱 [X-Ray 追蹤地圖](https://docs.aws.amazon.com/xray/latest/devguide/xray-console-servicemap.html)。

CloudWatch Synthetics 目前適用於所有商業 AWS 區域和 GovCloud 區域。

**注意**  
在亞太區域 （大阪） AWS PrivateLink 不支援 。在亞太區域 (雅加達), AWS PrivateLink 與 X-Ray 不受支援。

**Topics**
+ [CloudWatch Canary 的必要角色和許可](CloudWatch_Synthetics_Canaries_Roles.md)
+ [建立 Canary](CloudWatch_Synthetics_Canaries_Create.md)
+ [Groups (群組)](CloudWatch_Synthetics_Groups.md)
+ [在本地測試 Canary](CloudWatch_Synthetics_Debug_Locally.md)
+ [對失敗的 Canary 進行故障診斷](CloudWatch_Synthetics_Canaries_Troubleshoot.md)
+ [Canary 指令碼的範本程式碼](CloudWatch_Synthetics_Canaries_Samples.md)
+ [Canary 和 X-Ray 追蹤](CloudWatch_Synthetics_Canaries_tracing.md)
+ [在 VPC 上執行 Canary](CloudWatch_Synthetics_Canaries_VPC.md)
+ [加密 Canary 成品](CloudWatch_Synthetics_artifact_encryption.md)
+ [檢視 Canary 統計資料和詳細資訊](CloudWatch_Synthetics_Canaries_Details.md)
+ [Canary 公佈的 CloudWatch 指標](CloudWatch_Synthetics_Canaries_metrics.md)
+ [編輯或刪除 Canary](synthetics_canaries_deletion.md)
+ [啟動、停止、刪除或更新多個 Canary 的執行階段](synthetics_canaries_multi-action.md)
+ [使用 Amazon EventBridge 監控 Canary 事件](monitoring-events-eventbridge.md)
+ [執行安全 Canary 更新](performing-safe-canary-upgrades.md)

# CloudWatch Canary 的必要角色和許可
<a name="CloudWatch_Synthetics_Canaries_Roles"></a>

建立和管理 Canary 的使用者以及 Canary 本身都必須具有特定許可。

# 管理 CloudWatch Canary 的使用者的必要角色和許可
<a name="CloudWatch_Synthetics_Canaries_UserPermissions"></a>

若要檢視 Canary 詳細資訊和 Canary 執行的結果，您必須以已連接 `CloudWatchSyntheticsFullAccess` 或 ` CloudWatchSyntheticsReadOnlyAccess` 政策的使用者身分登入。若要讀取主控台中的所有 Synthetics 資料，您還需要 `AmazonS3ReadOnlyAccess` 和 ` CloudWatchReadOnlyAccess` 政策。若要檢視 Canary 使用的原始程式碼，您也需要 `AWSLambda_ReadOnlyAccess` 政策。

若要建立 Canary，您必須以具有 ` CloudWatchSyntheticsFullAccess` 政策或類似許可集合的使用者身分登入。若要為 Canary 建立 IAM 角色，您還需要下列內嵌政策陳述式：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:CreatePolicy",
                "iam:AttachRolePolicy"
            ],
            "Resource": [
                "arn:aws:iam::*:role/service-role/CloudWatchSyntheticsRole*",
                "arn:aws:iam::*:policy/service-role/CloudWatchSyntheticsPolicy*"
            ]
        }
    ]
}
```

------

**重要**  
將 `iam:CreateRole`、`iam:CreatePolicy` 和 ` iam:AttachRolePolicy` 許可授與使用者，可給予該使用者對您 AWS 帳戶的完整管理存取權。例如，擁有這些許可的使用者，可以建立具有所有資源完整許可的政策，並可將該政策連接至任何角色。對於您授與這些許可的對象，請務必謹慎。

如需連接政策和授與許可給使用者的資訊，請參閱[變更 IAM 使用者的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)和[嵌入使用者或角色的內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#embed-inline-policy-console)。

# Canary 的必要角色和許可
<a name="CloudWatch_Synthetics_Canaries_CanaryPermissions"></a>

每個 Canary 必須與連接特定許可的 IAM 角色相關聯。當您使用 CloudWatch 主控台建立 Canary 時，您可以選擇讓 CloudWatch Synthetics 為 Canary 建立 IAM 角色。若您這樣做，則角色將具備所需要的許可。

如果您想要自己建立 IAM 角色，或者建立在使用 AWS CLI 或 API 建立 Canary 時可以使用的 IAM 角色，該角色必須包含本節中列出的許可。

Canary 的所有 IAM 角色必須包含以下信任政策陳述式。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

此外，Canary 的 IAM 角色需要以下陳述式之一。

 **不使用 AWS KMS 或需要 Amazon VPC 存取的基本 Canary** 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::path/to/your/s3/bucket/canary/results/folder"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::name/of/the/s3/bucket/that/contains/canary/results"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:CreateLogGroup"
            ],
            "Resource": [
            "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/cwsyn-canary_name-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "xray:PutTraceSegments"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": "*",
            "Action": "cloudwatch:PutMetricData",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": "CloudWatchSynthetics"
                }
            }
        }
    ]
}
```

------

 **使用 AWS KMS 加密 Canary 成品，但不需要 Amazon VPC 存取的 Canary** 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::path/to/your/S3/bucket/canary/results/folder"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::name/of/the/S3/bucket/that/contains/canary/results"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:CreateLogGroup"
            ],
            "Resource": [
            "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/cwsyn-canary_name-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "xray:PutTraceSegments"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": "*",
            "Action": "cloudwatch:PutMetricData",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": "CloudWatchSynthetics"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/KMS_key_id",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": [
                        "s3.us-east-1.amazonaws.com"
                    ]
                }
            }
        }
    ]
}
```

------

 **不使用 AWS KMS 但需要 Amazon VPC 存取的 Canary** 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::path/to/your/S3/bucket/canary/results/folder"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::name/of/the/S3/bucket/that/contains/canary/results"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:CreateLogGroup"
            ],
            "Resource": [
            "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/cwsyn-canary_name-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "xray:PutTraceSegments"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": "*",
            "Action": "cloudwatch:PutMetricData",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": "CloudWatchSynthetics"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

 **Canary 使用 AWS KMS 加密 Canary 成品，也需要 Amazon VPC 存取** 

如果您更新非 VPC Canary 以開始使用 VPC，則需要更新 Canary 的角色以包含以下政策中列出的網路介面許可。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::path/to/your/S3/bucket/canary/results/folder"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::name/of/the/S3/bucket/that/contains/canary/results"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:CreateLogGroup"
            ],
            "Resource": [
            "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/cwsyn-canary_name-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "xray:PutTraceSegments"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": "*",
            "Action": "cloudwatch:PutMetricData",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": "CloudWatchSynthetics"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/KMS_key_id",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": [
                        "s3.us-east-1.amazonaws.com"
                    ]
                }
            }
        }
    ]
}
```

------

## AWS CloudWatch Synthetics 的 受管政策
<a name="CloudWatch_Synthetics_IAMManagedPolicies"></a>

若要新增許可給使用者、群組和角色，使用 AWS 受管政策比自行撰寫政策更容易。建立 IAM 客戶受管政策需要時間和專業知識，而受管政策可為您的團隊提供其所需的許可。若要快速開始使用，您可以使用我們的 AWS 受管政策。這些政策涵蓋常見的使用案例，可在您的帳戶中使用 AWS 。如需 AWS 受管政策的詳細資訊，請參閱《IAM 使用者指南》中的[AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) AWS 受管政策。

AWS 服務會維護和更新 AWS 受管政策。您無法變更 AWS 受管政策中的許可。服務偶爾會變更 AWS 受管政策中的許可。此類型的更新會影響已連接政策的所有身分識別 (使用者、群組和角色)。

### AWS 受管政策的 CloudWatch Synthetics 更新
<a name="CloudWatch_Synthetics_IAMManagedPolicies_Updates"></a>

檢視自 CloudWatch Synthetics 開始追蹤這些變更以來， AWS 受管政策更新的詳細資訊。如需有關此頁面變更的自動提醒，請訂閱 CloudWatch 文件歷史記錄頁面上的 RSS 摘要。


| 變更 | 描述 | Date | 
| --- | --- | --- | 
|  已從 **CloudWatchSyntheticsFullAccess** 中移除冗餘動作  |  CloudWatch Synthetics 從 ** CloudWatchSyntheticsFullAccess** 政策中移除 `s3:PutBucketEncryption`和 ` lambda:GetLayerVersionByArn`動作，因為這些動作與政策中的其他許可重複。移除的動作並未提供任何許可，而且政策授予的許可沒有網路變更。  | 2021 年 3 月 12 日 | 
|  CloudWatch Synthetics 開始追蹤變更  |  CloudWatch Synthetics 開始追蹤其 AWS 受管政策的變更。  | 2021 年 3 月 10 日 | 

 **CloudWatchSyntheticsFullAccess** 

以下是 `CloudWatchSyntheticsFullAccess` 政策的內容：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": [
                "synthetics:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket",
                "s3:PutEncryptionConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::cw-syn-results-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:ListRoles",
                "s3:ListAllMyBuckets",
                "xray:GetTraceSummaries",
                "xray:BatchGetTraces",
                "apigateway:GET"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::cw-syn-*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::aws-synthetics-library-*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::*:role/service-role/CloudWatchSyntheticsRole*"
            ],
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": [
                        "lambda.amazonaws.com",
                        "synthetics.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:ListAttachedRolePolicies"
            ],
            "Resource": [
                "arn:aws:iam::*:role/service-role/CloudWatchSyntheticsRole*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:GetMetricData",
                "cloudwatch:GetMetricStatistics"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricAlarm",
                "cloudwatch:DeleteAlarms"
            ],
            "Resource": [
                "arn:aws:cloudwatch:*:*:alarm:Synthetics-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:DescribeAlarms"
            ],
            "Resource": [
                "arn:aws:cloudwatch:*:*:alarm:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:GetLogRecord",
                "logs:DescribeLogStreams",
                "logs:StartQuery",
                "logs:GetLogEvents",
                "logs:FilterLogEvents",
                "logs:GetLogGroupFields"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:/aws/lambda/cwsyn-*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": "${aws:PrincipalAccount}"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:AddPermission",
                "lambda:PublishVersion",
                "lambda:UpdateFunctionCode",
                "lambda:UpdateFunctionConfiguration",
                "lambda:GetFunctionConfiguration",
                "lambda:GetFunction",
                "lambda:DeleteFunction",
                "lambda:ListTags",
                "lambda:TagResource",
                "lambda:UntagResource"
            ],
            "Resource": [
                "arn:aws:lambda:*:*:function:cwsyn-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:GetLayerVersion",
                "lambda:PublishLayerVersion",
                "lambda:DeleteLayerVersion"
            ],
            "Resource": [
                "arn:aws:lambda:*:*:layer:cwsyn-*",
                "arn:aws:lambda:*:*:layer:Synthetics:*",
                "arn:aws:lambda:*:*:layer:Synthetics_Selenium:*",
                "arn:aws:lambda:*:*:layer:AWS-CW-Synthetics*:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeVpcs",
                "ec2:DescribeSubnets",
                "ec2:DescribeSecurityGroups"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "sns:ListTopics"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "sns:CreateTopic",
                "sns:Subscribe",
                "sns:ListSubscriptionsByTopic"
            ],
            "Resource": [
                "arn:*:sns:*:*:Synthetics-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:ListAliases"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:*:*:key/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:*:*:key/*",
            "Condition": {
                "StringLike": {
                    "kms:ViaService": [
                        "s3.*.amazonaws.com"
                    ]
                }
            }
        }
    ]
}
```

------

 **CloudWatchSyntheticsReadOnlyAccess** 

以下是 `CloudWatchSyntheticsReadOnlyAccess` 政策的內容：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "synthetics:Describe*",
                "synthetics:Get*",
                "synthetics:List*"
            ],
            "Resource": "*"
        }
    ]
}
```

------

# 限制使用者檢視特定的 canary
<a name="CloudWatch_Synthetics_Canaries_Restricted"></a>

您可限制使用者檢視有關 canary 資訊的能力，讓他們只能查看您指定的 canary相關資訊。如要執行此作業，請使用具有類似下列內容之 ` Condition` 陳述式的 IAM 政策，並將此政策連接至使用者或 IAM 角色。

下列範例限制使用者僅可查看 ` name-of-allowed-canary-1` 和 `name-of-allowed-canary-2` 的相關資訊。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "synthetics:DescribeCanaries",
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "synthetics:Names": [
                        "name-of-allowed-canary-1",
                        "name-of-allowed-canary-2"
                    ]
                }
            }
        }
    ]
}
```

------

CloudWatch Synthetics 支援 `synthetics:Names` 陣列中列出的最多五個項目。

您還可建立於允許的 canary 名稱中使用 \$1** 作為萬用字元的政策，如下列範例所示：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "synthetics:DescribeCanaries",
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "synthetics:Names": [
                        "my-team-canary-*"
                    ]
                }
            }
        }
    ]
}
```

------

使用連結的其中一個政策登入的任何使用者皆不可使用 CloudWatch 主控台檢視任何 canary 的資訊。他們只能檢視政策所授權之 canary 的 canary 資訊，且只能透過使用 [DescribeCanaries](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_DescribeCanaries.html) API 或 [describe-canaries](https://docs.aws.amazon.com/cli/latest/reference/synthetics/describe-canaries.html) AWS CLI 命令。

# 建立 Canary
<a name="CloudWatch_Synthetics_Canaries_Create"></a>

**重要**  
請確認您使用 Synthetics Canary 來監控只有您擁有許可 (或您是擁有者) 的端點和 API。取決於 Canary 頻率設定，這些端點可能會遭遇增加的流量。

當您使用 CloudWatch 主控台建立 Canary 時，您可以使用 CloudWatch 提供的藍圖建立 Canary，或者也可以撰寫自己的指令碼。如需詳細資訊，請參閱[使用 Canary 藍圖](CloudWatch_Synthetics_Canaries_Blueprints.md)。

 CloudFormation 如果您使用自己的 Canary 指令碼，也可以使用 建立 Canary。如需詳細資訊，請參閱*AWS CloudFormation 《 使用者指南*》中的 [ AWS::Synthetics::Canary](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html)。

如果您正在編寫自己的指令碼，您可以使用 CloudWatch Synthetics 內建在程式庫中的多個函數。如需詳細資訊，請參閱[Synthetics 執行時間版本](CloudWatch_Synthetics_Canaries_Library.md)。

**注意**  
當您建立 Canary 時，其中一個建立的圖層是前面加上 ` Synthetics` 的 Synthetics 圖層。此圖層由 Synthetics 服務帳戶擁有，包含執行時期程式碼。

**建立 Canary**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

   

1. 選擇 **Create Canary (建立 Canary)**。

1. 選擇下列其中一項：
   + 若要讓 Canary 以藍圖指令碼為基礎，請選擇 **Use a blueprint (使用藍圖)**，然後選擇您要建立的 Canary 類型。。如需每種藍圖類型之用途的詳細資訊，請參閱[使用 Canary 藍圖](CloudWatch_Synthetics_Canaries_Blueprints.md)。
   + 若要上傳您自己的 Node.js 指令碼以建立自訂 Canary，請選擇 **Upload a script (上傳指令碼)**。

     然後，您可以將指令碼拖曳到 **Script (指令碼)** 中，或選擇 **Browse files (瀏覽檔案)** 以瀏覽至檔案系統中的指令碼。
   + 若要從 S3 儲存貯體匯入指令碼，請選擇 **Import from S3 (從 S3 匯入)**。在 **Sourse location (來源位置)** 下方輸入 Canary 的完整路徑，或選擇 **Browse S3 (瀏覽 S3)**。

     您必須擁有您使用之 S3 儲存貯體的 `s3:GetObject` 和 `s3:GetObjectVersion` 許可。儲存貯體必須位於您建立 Canary 的相同 AWS 區域中。

1. 在 **Name (名稱)** 下方輸入 Canary 的名稱。此名稱會用於許多頁面，因此我們建議您使用描述性的名稱，以與其他 Canary 區別。

1. 在 **Application or endpoint URL (應用程式或端點 URL)** 下方，輸入您要 Canary 進行測試的 URL。此 URL 必須包含通訊協定 (例如 https://)。

   如果您想要讓 Canary 在 VPC 上測試端點，您稍後在本程序中也必須輸入 VPC 的相關資訊。

1. 如果您為 Canary 使用您自己的指令碼，則請在 **Lamdba handler (Lambda 處理常式)** 下方輸入您希望 Canary 開始的進入點。如需 Lambda 處理常式格式的資訊，請參閱 [Synthetics 執行時期版本](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html)。

1. 在**指令碼編輯器**、**執行時期版本**下，選取 Synthetics 執行時期版本以執行 Canary。如需 Synthetics 執行時期版本的資訊，請參閱 [Synthetics 執行時期版本](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html)。

   在**瀏覽器組態**下，您可以啟用瀏覽器以測試 Canary。必須至少選擇一個瀏覽器。

1. 如果您在指令碼中使用環境變數，選擇 **Environment variables** (環境變數)，然後為指令碼中定義的每個環境變數指定一個數值。如需詳細資訊，請參閱[環境變數](CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup.md#CloudWatch_Synthetics_Environment_Variables)。

1. 在 **Schedule** (排程) 下，選擇只執行此 Canary 一次、使用 Rate 表達式連續執行，或使用 Cron 表達式對其進行排程。
   + 當您使用 CloudWatch 主控台建立連續執行的 Canary 時，您可以在每分鐘一次到每小時一次之間選擇一種速率。
   + 如需撰寫 Canary 排程的 Cron 表達式的詳細資訊，請參閱 [使用 Cron 排程 Canary 執行](CloudWatch_Synthetics_Canaries_cron.md)。

1. (選用) 如要設定 canary 的逾時值，請選擇 **Additional configuration** (其他組態)，然後指定逾時值。使其不短於 15 秒，以允許 Lambda 冷啟動和啟動 canary 儀器所需的時間。

1. 在 **Data retention (資料保留)** 下方，指定要將 Canary 執行失敗和成功的資訊保留多長時間。範圍是 1-455 天。

   此設定會影響 [GetCanaryRuns](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_GetCanaryRuns.html) 操作傳回的資訊範圍，以及 Synthetics 主控台中顯示的資訊範圍。

   它不會影響存放在 Amazon S3 儲存貯體中的資料，也不會影響金絲雀發布的日誌或指標。

   無論 Canary 的資料保留期間為何，主控台中顯示的資訊範圍都有特定限制。在 Synthetics 主控台主檢視中，相對和絕對時間範圍都限制為 7 天。在特定 Canary 的 Synthetics 主控台檢視中，相對時間範圍限制為 7 天，絕對時間範圍限制為 30 天。

1. 在**資料儲存體**下方，選取 Amazon S3 儲存貯體以用來儲存來自 Canary 執行的資料。儲存貯體名稱不能包含句點 (.)。如果您將此保留為空白，則會使用或建立預設的 Amazon S3 儲存貯體。

1. （選用） 在預設情況下，Canary 會將成品存放在 Amazon S3，並使用 AWS受管 AWS KMS 金鑰靜態加密成品。您可以使用不同的加密選項，方法是選擇 **Data Storage** (資料儲存) 區段中的 **Additional configuration** (其他組態)。然後您可以選擇要用於加密的金鑰類型。如需詳細資訊，請參閱[加密 Canary 成品](CloudWatch_Synthetics_artifact_encryption.md)。

1. 在 **Access permissions** (存取許可) 下方，選擇是要建立 IAM 角色來執行 Canary，還是使用現有角色。

   如果您讓 CloudWatch Synthetics 建立角色，則其會自動包含所有必要的許可。如果您想要自行建立角色，請參閱 [Canary 的必要角色和許可](CloudWatch_Synthetics_Canaries_CanaryPermissions.md) 以瞭解有關必要許可的資訊。

   如果您在建立 Canary 時使用 CloudWatch 主控台來建立 Canary 的角色，則無法將該角色重複用於其他 Canary，因為這些角色專屬於一個 Canary。如果您已手動建立可供多個 Canary 使用的角色，則可使用現有的角色。

   若要使用現有角色，您必須具有將該角色傳遞給 Synthetics 和 Lambda 的 `iam:PassRole` 許可。您也必須擁有 `iam:GetRole` 許可。

1. (選用) 在 **Alarms** (警示) 下方，選擇是否要為此 Canary 建立預設 CloudWatch 警示。如果您選擇建立警示，則會以下列名稱慣例建立警示：`Synthetics-Alarm-canaryName -index `

   `index` 是代表為此 Canary 建立的每個不同警示的數字。第一個警示的索引為 1，第二個警示的索引為 2，以此類推。

1. (選用) 若要在 VPC 上的端點執行此 Canary 測試，請選擇 **VPC settings (VPC 設定)**，然後執行下列操作：

   1. 選取託管端點的 VPC。

   1. 在 VPC 上選取一或多個子網路。您必須選取私有子網路，因為當 IP 地址無法在執行期間指派給 Lambda 執行個體時，則 Lambda 執行個體無法設定為在公有子網路中執行。如需詳細資訊，請參閱[設定 Lambda 函數以存取 VPC 中的資源](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html)。

   1. 在 VPC 上選取一或多個安全群組。

   1. 若要允許為此 Canary 傳出 IPv6 流量，請選取**允許雙堆疊子網路的 IPv6 流量**。這可讓 Canary 透過 IPv6 監控僅支援 IPv6 及啟用雙堆疊的端點。

      可以透過授與 Canary 網際網路存取權並適當設定 VPC 子網路，來監控 VPC 外部的端點。如需詳細資訊，請參閱[在 VPC 上執行 Canary](CloudWatch_Synthetics_Canaries_VPC.md)。

   如果端點位於 VPC 上，則必須啟用 Canary 以將資訊傳送至 CloudWatch 和 Simple Storage Service (Amazon S3)。如需詳細資訊，請參閱[在 VPC 上執行 Canary](CloudWatch_Synthetics_Canaries_VPC.md)。

1. (選用) 在 **Tags (標籤)** 下方，新增一或多個鍵/值對，作為此 Canary 的標籤。標籤可協助您識別和組織 AWS 資源，並追蹤 AWS 成本。如需詳細資訊，請參閱[標記您的 Amazon CloudWatch 資源](CloudWatch-Tagging.md)。

   如果您希望套用於 Canary 的標籤也套用至 Canary 使用的 Lambda 函式，請在**標籤複寫**下選擇 **Lambda 函式**。如果選擇此選項，CloudWatch Synthetics 會讓 Canary 和 Lambda 函式上的標籤保持同步：
   + Synthetics 會將您在此處指定的相同標籤套用至 Canary 和 Lambda 函式。
   + 如果您稍後更新 Canary 的標籤並保持選取此選項，Synthetics 會修改 Lambda 函式上的標籤，與 Canary 保持同步。

1. (選用) 在 **Active tracing** (主動追蹤) 中，選擇是否為此 Canary 啟用 X-Ray 主動追蹤。主動追蹤僅適用於 Puppeteer 和 Java 執行時期。如需詳細資訊，請參閱[Canary 和 X-Ray 追蹤](CloudWatch_Synthetics_Canaries_tracing.md)。

## 為 Canary 建立的資源
<a name="CloudWatch_Synthetics_Canaries_Resources_Created"></a>

當您建立 Canary 時，會建立下列資源：
+ 具有 `CloudWatchSyntheticsRole-canary-name -uuid` 名稱的 IAM 角色 (如果您使用 CloudWatch 主控台建立 Canary 並指定要為 Canary 建立新角色)
+ 具有 `CloudWatchSyntheticsPolicy- canary-name-uuid` 名稱的 IAM 政策。
+ 具有 `cw-syn-results-accountID -region` 名稱的 S3 儲存貯體。
+ 具有 `Synthetics-Alarm-MyCanaryName` 名稱的警示 (如果您希望為 Canary 建立警示)
+ Lambda 函數和圖層 (如果您使用藍圖來建立 Canary)。這些資源具有字首 `cwsyn-MyCanaryName`。
+ 具有 `/aws/lambda/cwsyn-MyCanaryName -randomId` 名稱的 CloudWatch Logs 日誌群組。

# 使用 Canary 藍圖
<a name="CloudWatch_Synthetics_Canaries_Blueprints"></a>

本節提供有關每個 Canary 藍圖以及每個藍圖最適合工作的詳細資訊。提供的藍圖適用於下列 Canary 類型：

**Topics**
+ [活動訊號監控](#CloudWatch_Synthetics_Canaries_Blueprints_Heartbeat)
+ [API Canary](#CloudWatch_Synthetics_Canaries_Blueprints_API)
+ [中斷的連結檢查程式](#CloudWatch_Synthetics_Canaries_Blueprints_Broken_Links)
+ [視覺化監控藍圖](#CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting)
+ [Canary 記錄器](#CloudWatch_Synthetics_Canaries_Blueprints_Recorder)
+ [GUI 工作流程建置器](#CloudWatch_Synthetics_Canaries_Blueprints_GUI_Workflow)
+ [多檢查藍圖](#CloudWatch_Synthetics_Canaries_Blueprints_Multichecks_Blueprint)
+ [建立多檢查藍圖 Canary](CloudWatch_Synthetics_Canaries_MultiCheck_Blueprint.md)

當您使用藍圖建立 Canary 時，在填寫 CloudWatch 主控台中的欄位時，頁面的 **Script editor** (指令碼編輯器) 區域會顯示您正在建立作為 Node.js 指令碼的 Canary。您也可以在此區域編輯您的 Canary 以進一步自訂。

## 活動訊號監控
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Heartbeat"></a>

活動訊號指令碼會載入指定的 URL，並儲存頁面的螢幕擷取畫面和 HTTP 封存檔案 (HAR 檔案)。它們也會儲存被存取 URL 的日誌。

您可以使用 HAR 檔案來檢視有關網頁的詳細效能資料。您可以分析 Web 請求的清單，並掌握效能問題，例如項目載入的時間。

若您的 Canary 使用 `syn-nodejs-puppeteer-3.1` 或更新的執行時間版本，您可使用活動訊號監控藍圖來監控多個 URL，並查看 Canary 執行報告之步驟摘要中每個 URL 的狀態、持續時間、相關聯的螢幕擷取畫面和失敗原因。

## API Canary
<a name="CloudWatch_Synthetics_Canaries_Blueprints_API"></a>

API Canary 可以測試 REST API 的基本讀取和寫入功能。REST 代表*具象狀態傳輸*，是開發人員在建立 API 時遵循的一組規則。其中一個規則指出，指向特定 URL 的連結應該傳回一段資料。

Canary 可以使用任何 API 並測試所有類型的功能。每個 Canary 可以進行多個 API 呼叫。

在使用 `syn-nodejs-2.2` 或更新的執行時間版本的 Canary 中，API Canary 藍圖支援多步驟 Canary，將 API 作為 HTTP 步驟進行監控。您可以在單一 Canary 中測試多個 API。每個步驟都是個別請求，可存取不同的 URL、使用不同的標頭，並使用不同的規則來確定是否擷取標頭和回應內文。藉由不擷取標頭和回應內文，您可以防止記錄敏感資料。

API Canary 中的每個請求都包含下列資訊：
+ *端點*，也就是您請求的 URL。
+ *方法*，這是傳送到伺服器的請求類型。REST API 支援 GET (讀取)、POST (寫入)、PUT (更新)、PATCH (更新) 和 DELETE (刪除) 操作。
+ *標頭*，同時提供資訊給用戶端和伺服器。它們用於身分驗證並提供內文內容的相關資訊。如需有效標頭的清單，請參閱 [HTTP 標頭](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)。
+ *資料* (或*內文*)，包含要傳送到伺服器的資訊。這僅用於 POST、PUT、PATCH 或 DELETE 請求。

**注意**  
Playwright 執行時期不支援 API Canary 藍圖。

API Canary 藍圖支援 GET 和 POST 方法。當您使用此藍圖時，必須指定標頭。例如，您可以將 指定**Authorization**為**金鑰**，並將必要的授權資料指定為該金鑰**的值**。

如果您要測試 POST 請求，您也可以在**資料**欄位中指定要張貼的內容。

 **與 API Gateway 的整合** 

API 藍圖與 Amazon API Gateway 整合。這可讓您從與 Canary 相同的 AWS 帳戶和區域選取 API Gateway API 和階段，或從 API Gateway 上傳 Swagger 範本以進行跨帳戶和跨區域 API 監控。然後，您可以在主控台中選擇其餘的詳細資訊來建立 Canary，而不是從頭開始輸入。如需 API Gateway 的詳細資訊，請參閱[什麼是 Amazon API Gateway？](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 

 **使用私有 API** 

您可以在 Amazon API Gateway 中建立使用私有 API 的 Canary。如需詳細資訊，請參閱[是否在 Amazon API Gateway 中建立私有 API？](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html)

## 中斷的連結檢查程式
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Broken_Links"></a>

中斷連結檢查程式會使用 `document.getElementsByTagName('a')` 收集您正在測試之 URL 內的所有連結。它最多只會測試您指定的連結數目，而 URL 本身可計為第一個連結。例如，如果您想要檢查包含五個連結之頁面上的所有連結，您必須指定要讓 Canary 跟隨六個連結。

中斷連結檢查程式 Canary 使用 `syn-nodejs-2.0-beta` 執行時間或更新版本支援下列額外的功能：
+ 提供一份報告，其中包含已檢查的連結、狀態碼、失敗原因 (如果有的話)，以及來源和目的地頁面螢幕擷取畫面。
+ 檢視 Canary 結果時，您可以篩選僅查看中斷的連結，然後根據失敗的原因修正連結。
+ 此版本會擷取每個連結的附註來源頁面螢幕擷取畫面，並反白顯示找到連結的錨點。不會對隱藏的元件對象標註。
+ 您可以將此版本設定為擷取來源和目的地頁面、僅來源頁面或僅目的地頁面的螢幕擷取畫面。
+ 此版本修正了舊版中的問題，亦即，即使從第一頁湊集了更多連結，Canary 指令碼也會在第一個中斷的連結後停止。

**注意**  
Playwright 執行時期不支援中斷的連結檢查程式藍圖。

如果您想使用 `syn-1.0` 更新現有 Canary，以使用新的執行時期，必須刪除並重新建立 Canary。將現有的 Canary 更新到新的執行時間不會使這些功能可用。

中斷連結檢查程式 Canary 會偵測下列類型的連結錯誤：
+ 404 找不到網頁
+ 無效的主機名稱
+ URL 錯誤。例如，URL 缺少一個括號、有額外的斜線，或者使用錯誤的通訊協定。
+ 無效的 HTTP 回應代碼。
+ 主機伺服器傳回沒有內容也沒有回應代碼的空回應。
+ 在 Canary 執行期間，HTTP 請求不斷逾時。
+ 主機持續中斷連線，因為它設定錯誤或太忙碌。

## 視覺化監控藍圖
<a name="CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting"></a>

視覺化監控藍圖包含可比較在 Canary 執行期間擷取的螢幕擷取畫面與基準 Canary 執行期間擷取的螢幕擷取畫面的程式碼。如果兩個螢幕擷取畫面之間的差異超過閾值百分比，則 Canary 失敗。在執行 **syn-puppeteer-node-3.2** 或更新版本的 Canary 中支援視覺化監控。目前，執行 Python 和 Selenium 或者使用 Playwright 執行時期的 Canary 不支援它。

視覺化監控藍圖在預設藍圖 Canary 指令碼中包含下列程式碼行，可啟用視覺化監控。

```
syntheticsConfiguration.withVisualCompareWithBaseRun(true);
```

將此行新增至指令碼之後，Canary 第一次成功執行時，它會使用該執行期間擷取的螢幕擷取畫面作為比較基準。在第一次 Canary 執行之後，您可以使用 CloudWatch 主控台編輯 Canary 來執行以下任何操作：
+ 將 Canary 的下一個執行設定為新基準。
+ 在目前的基準螢幕擷取畫面上繪製邊界，以指定要在視覺化比較期間忽略的螢幕擷取畫面區域。
+ 移除用於視覺化監控的螢幕擷取畫面。

如需使用 CloudWatch 主控台編輯 Canary 的詳細資訊，請參閱 [編輯或刪除 Canary](synthetics_canaries_deletion.md)。

您還可以使用 ` nextrun` 或 `lastrun` 參數，或是在 [UpdateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_UpdateCanary.html) API 中指定 Canary 執行 ID，進而變更 Canary 執行。

當您使用視覺化監控藍圖時，請輸入要擷取螢幕擷取畫面的 URL，並將差異閾值指定為百分比。執行基準後，未來執行 Canary 可偵測大於該閾值的視覺化差異，進而觸發 Canary 失敗。執行基線後，您也可以編輯 Canary，在基線螢幕擷取畫面上「繪製」邊界，這些邊界要在視覺化監控期間忽略。

視覺化監控功能由 ImageMagick 開放原始碼軟體工具組提供支援。如需詳細資訊，請參閱 [ ImageMagick。 ](https://imagemagick.org/index.php)

## Canary 記錄器
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Recorder"></a>

使用 Canary 記錄器藍圖，您可以使用 CloudWatch Synthetics Recorder 來記錄您在網站上的點按和輸入動作，並自動產生 Node.js 指令碼，而該指令碼可用於建立遵循相同步驟的 Canary。CloudWatch Synthetics Recorder 是由 Amazon 提供的 Google Chrome 延伸。使用 Playwright 執行時期的 Canary 不支援 Canary 記錄器。

**點數**：CloudWatch Synthetics Recorder 是以[無周邊記錄器](https://github.com/checkly/headless-recorder)為基礎。

如需詳細資訊，請參閱[使用適用於 Google Chrome 的 CloudWatch Synthetics Recorder](CloudWatch_Synthetics_Canaries_Recorder.md)。

## GUI 工作流程建置器
<a name="CloudWatch_Synthetics_Canaries_Blueprints_GUI_Workflow"></a>

GUI 工作流程建置器藍圖會驗證是否可以在您的網頁上採取動作。例如，如果您有一個包含登入表單的網頁，Canary 可以填入使用者和密碼欄位並提交表單，以確認網頁是否正常運作。

當您使用藍圖建立此類型的 Canary 時，請指定希望 Canary 在網頁上採取的動作。您可以使用的動作如下：
+ **按一下**— 選取您指定的元素，並模擬使用者按一下或選擇元素。

  若要指定 Node.js 指令碼中的元素，請使用 `[id=]` 或 ` a[class=]`。

  若要指定 Python 指令碼中的元素，請使用 `xpath //*[@id=]` 或 ` //*[@class=]`。
+ **驗證選擇器**— 驗證指定的元素是否存在於網頁上。此測試有助於驗證先前的動作是否導致正確的元素填入頁面。

  若要指定要在 Node.js 指令碼中驗證的元素，請使用 `[id=]` 或 ` a[class=]`。

  若要指定要在 Python 指令碼中驗證的元素，請使用 `xpath //*[@id=]` 或 `//*[class=]`。
+ **驗證文字**— 驗證指定的字串是否包含在目標元素中。此測試有助於驗證先前的動作是否導致顯示正確的文字。

  若要指定 Node.js 指令碼中的元素，請使用 ` div[@id=]//h1` 之類的格式，因為此動作使用 Puppeteer 中的 `waitForXPath` 函數。

  若要指定 Python 指令碼中的元素，請使用 ` //*[@id=] ` 或 //\$1[@class=] 之類的 xpath 格式，因為此動作使用 Selenium 中的 `implicitly_wait` 函數。
+ **輸入文字**— 在目標元素中寫入指定的文字。

  若要指定要在 Node.js 指令碼中驗證的元素，請使用 `[id=]` 或 ` a[class=]`。

  若要指定要在 Python 指令碼中驗證的元素，請使用 `xpath //*[@id=]` 或 `//*[@class=]`。
+ **按一下並導覽**— 選擇指定的元素後等待整個頁面載入。這很適合用於需要重新載入頁面時。

  若要指定 Node.js 指令碼中的元素，請使用 `[id=]` 或 ` a[class=]`。

  若要指定 Python 指令碼中的元素，請使用 `xpath //*[@id=]` 或 ` //*[@class=]`。

例如，以下藍圖使用 Node.js。其會按一下指定 URL 上的 **firstButton**，驗證是否出現了具有預期文字的預期選擇器，在 **Name** (名稱) 欄位中輸入名稱 `Test_Customer`，按一下 **Login** (登入) 按鈕，然後檢查下一頁的 **Welcome** (歡迎) 文字，驗證是否成功登入。

![\[主控台中的建立 Canary 頁面，欄位中已填入 GUI 工作流程藍圖。\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/canary_create_gui_workflow.PNG)


使用下列執行時間的 GUI 工作流程 Canary 也會提供針對每個 Canary 執行而執行的步驟摘要。您可以使用與每個步驟相關聯的螢幕擷取畫面和錯誤訊息，以尋找失敗的根本原因。
+ `syn-nodejs-2.0` 或更新版本
+ `syn-python-selenium-1.0` 或更新版本

## 多檢查藍圖
<a name="CloudWatch_Synthetics_Canaries_Blueprints_Multichecks_Blueprint"></a>

多檢查藍圖可簡化 Canary 建立。它使用簡單的 JSON 組態來降低成本，該組態提供out-of-the-box可用的功能來執行 HTTP、DNS、SSL 和 TCP 檢查。您最多可以設定 10 個檢查。將每個檢查設定為依序執行的數值步驟，以清楚了解 Canary 流程。

多檢查藍圖支援：
+ 基本 HTTP 請求、TCP 請求、驗證 DNS 記錄和監控 SSL 憑證
+ 與 Secrets Manager 整合的 HTTP 身分驗證方法，例如 Basic、API Key、OAuth 和 Sigv4 
+ 每個檢查的宣告

如需詳細資訊，請參閱[建立 Canary](CloudWatch_Synthetics_Canaries_Create.md)。

# 建立多檢查藍圖 Canary
<a name="CloudWatch_Synthetics_Canaries_MultiCheck_Blueprint"></a>

Amazon CloudWatch Synthetics 多檢查藍圖透過提供簡單的 JSON 組態，協助您建立 Synthetics Canary。您可以透過以步驟式循序方式綁定最多 10 種不同類型的 HTTP/DNS/SSL/TCP 檢查，以節省成本。每個檢查都包含針對檢查結果提供基本驗證的聲明。

多重檢查 Canary 是專為簡單使用案例而設計，只需要基本檢查，無需無周邊瀏覽器。如需更複雜的使用案例，請檢閱 Amazon CloudWatch Synthetics 提供的其他 Canary 類型。

**Topics**
+ [先決條件](#CloudWatch_Synthetics_MultiCheck_Prerequisites)
+ [限制](#CloudWatch_Synthetics_MultiCheck_Limitations)
+ [封裝結構、JSON 結構描述和組態設定](#CloudWatch_Synthetics_MultiCheck_Packaging)
+ [在 中建立多檢查 Canary AWS 管理主控台](#CloudWatch_Synthetics_MultiCheck_Console)
+ [使用 Synthetics APIs AWS 建立多檢查 Canary](#CloudWatch_Synthetics_MultiCheck_API)
+ [在 中建立多檢查 Canary CloudFormation](#CloudWatch_Synthetics_MultiCheck_CloudFormation)
+ [身分驗證組態](#CloudWatch_Synthetics_MultiCheck_Authentication)
+ [疑難排解](#CloudWatch_Synthetics_MultiCheck_Troubleshooting)

## 先決條件
<a name="CloudWatch_Synthetics_MultiCheck_Prerequisites"></a>
+ 必須使用 syn-nodejs-3.0\$1 才能建立多檢查 Canary
+ 使用 Authentication and Secrets Manager 組態時，您必須確保 Canary [ ExecutionRoleArn](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html) 允許 存取這些秘密的許可
+ 使用 Sigv4 身分驗證時，您必須確保 Canary [ ExecutionRoleArn](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html) 允許 許可存取相關角色

## 限制
<a name="CloudWatch_Synthetics_MultiCheck_Limitations"></a>
+ HTTP 回應大小不能大於 1 MB
+ 最多 10 個定義的變數。
+ 使用 JSON RFC 時，Checks JSON 可能提供重複的欄位，但只會使用最後一個序列欄位
+ 在 中 AWS 管理主控台，多檢查 Canary 預設為顯示多檢查步驟指標，以輕鬆識別每個檢查的可用性。移除檢查時，此圖表可能仍會在可用性圖表中顯示檢查，直到指標停止作用中至少 3 小時為止

## 封裝結構、JSON 結構描述和組態設定
<a name="CloudWatch_Synthetics_MultiCheck_Packaging"></a>

將用於 Canary 的 JSON Checks 組態必須命名為 ` blueprint-config.json`。組態必須遵循[結構描述](https://github.com/aws-samples/synthetics-canary-local-debugging-sample/tree/main)，並遵循 下的指示[撰寫 Node.js 多重檢查藍圖的 JSON 組態](CloudWatch_Synthetics_WritingCanary_Multichecks.md)。

將 壓縮`blueprint-config.json`為 ZIP 檔案，並在下列其中一個建立工作流程中提供它。有`synthetics.json`組態時，也會壓縮在相同的 ZIP 檔案中。以下是名為 的 zip 檔案範例`multi-checks.zip`。

```
multi-checks.zip
├── blueprint-config.json
└── synthetics.json
```

## 在 中建立多檢查 Canary AWS 管理主控台
<a name="CloudWatch_Synthetics_MultiCheck_Console"></a>

1. 開啟 Amazon CloudWatch Synthetics主控台。

1. 選擇 **Create Canary (建立 Canary)**。

1. **在使用藍圖**下，選擇**多重檢查** 。

   在**設定檢查**下，您會看到兩個索引標籤：**檢查**和 **Canary 組態**。

1. 選取執行時間版本 **syn-nodejs-3.0 **或更新版本。

1. 遵循 下的程序[撰寫 Node.js 多重檢查藍圖的 JSON 組態](CloudWatch_Synthetics_WritingCanary_Multichecks.md)來描述您要執行的檢查。或者，主控台提供您可以建置的預設 JSON 組態。

1. 選擇 **Create Canary (建立 Canary)**。

## 使用 Synthetics APIs AWS 建立多檢查 Canary
<a name="CloudWatch_Synthetics_MultiCheck_API"></a>

使用 `CreateCanary` API 並在 `Code` 參數內提供 欄位/值，`BlueprintTypes="multi-checks"`而非 ` Handler`。同時指定 `Handler` `BlueprintTypes`和 時，`ValidationException`會顯示 。提供的執行時間版本必須是 `syn-nodejs-3.0`或更新版本。

```
aws synthetics create-canary \
    --name my-multi-check-canary \
    --code ZipFile="ZIP_BLOB",BlueprintTypes="multi-checks" \
    --runtime-version syn-nodejs-3.0 \
    ...

// Or if you wanted to use S3 to provide your code.

aws synthetics create-canary \
    --name my-multi-check-canary \
    --code S3Bucket="my-code-bucket",S3Key="my-zip-code-key",BlueprintTypes="multi-checks" \
    ...
```

## 在 中建立多檢查 Canary CloudFormation
<a name="CloudWatch_Synthetics_MultiCheck_CloudFormation"></a>

在多重檢查 Canary 的 CloudFormation 範本中，在 `Code` 參數內提供 欄位/值，`BlueprintTypes="multi-checks"`而非 ` Handler`。同時指定 `Handler` `BlueprintTypes`和 時，`ValidationException`會顯示 。提供的執行時間版本必須是 `syn-nodejs-3.0 or later`。

範本範例：

```
SyntheticsCanary:
    Type: 'AWS::Synthetics::Canary'
    Properties:
      Name: MyCanary
      RuntimeVersion: syn-nodejs-3.0
      Schedule: {Expression: 'rate(5 minutes)', DurationInSeconds: 3600}
      ...
      Code:
        S3Bucket: "my-code-bucket"
        S3Key: "my-zip-code-key"
        BlueprintTypes: ["multi-checks"]
      ...
```

## 身分驗證組態
<a name="CloudWatch_Synthetics_MultiCheck_Authentication"></a>

當您的 Canary 對已驗證的端點提出 HTTP 請求時，您可以將藍圖 Canary 的步驟設定為使用四種身分驗證類型之一：基本、API 金鑰、OAuth 用戶端登入資料和 SigV4。與其自行設定請求標頭，您可以在藍圖定義中指定身分驗證類型，而 Synthetics 會遵循指定的身分驗證類型，將提供的身分驗證資訊填入 HTTP 請求的元件。

您可以在藍圖步驟中使用身分驗證區段指定身分驗證類型。您可以指定要使用的身分驗證機制、所選身分驗證機制所需的屬性，以及 Synthetics 會使用提供的資訊來建構 HTTP 請求的身分驗證標頭。

由於以純文字儲存秘密 （例如密碼或 API 金鑰） 是安全問題，因此 Synthetics 支援與 整合 AWS Secrets Manager。當您想要在 Synthetics 藍圖 Canary 中驗證 HTTP 請求時，您可以參考存放身分驗證資訊的秘密，而 Synthetics 會處理擷取秘密並將其快取到您的 Canary 中。此方法為 Synthetics 提供秘密，同時安全地存放秘密，而無需在藍圖組態中以純文字指定秘密。

如需詳細資訊 AWS Secrets Manager，請參閱[什麼是 AWS Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)

### 基本身分驗證
<a name="CloudWatch_Synthetics_MultiCheck_BasicAuth"></a>

Synthetics 實作 RFC 7617 中定義的基本 HTTP 身分驗證機制。程序的運作方式如下：
+ 使用者名稱和密碼對是從藍圖組態提供。
+ 使用者傳遞是透過串連使用者名稱、單一冒號 ("：") 字元和密碼來建立。
+ user-pass 是 UTF-8 編碼，然後轉換為 base64 編碼字串。
+ 此 base64 編碼的 user-pass 以下列格式在「授權」標頭中提供：授權：基本 \$1base64-encoded-user-pass\$1

例如，如果使用者代理程式想要傳送 user-id "Aladdin" 和密碼 "open sesame"，則會使用下列標頭欄位：Authoric： Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

範例組態：

```
"Authentication": {
    "type": "BASIC",
    "username": MY_USERNAME, // Required
    "password": MY_PASSWORD // Required
}
```

### API 金鑰身分驗證
<a name="CloudWatch_Synthetics_MultiCheck_APIKeyAuth"></a>

您可以提供 API 金鑰來驗證 HTTP 請求。當您使用 API 金鑰驗證時，您提供的 API 金鑰會放入 "X-API-Key" HTTP 標頭。如果您有自訂資源在標頭中尋找此標頭以外的 API 金鑰標頭，您可以選擇指定不同的標頭名稱，讓 Synthetics 將 API 金鑰放入其中。

範例組態：

```
"Authentication": {
    "type": "API_KEY",
    "apiKey": S0A1M2P3L4E5, // Required
    "header": X-Specific-Header // Optional, defaults to "X-API-Key"
}
```

### SigV4 身分驗證
<a name="CloudWatch_Synthetics_MultiCheck_SigV4Auth"></a>

AWS SigV4 （簽章第 4 版） 是將身分驗證資訊新增至 AWS API 請求的 AWS 簽署通訊協定。若要提出 SigV4-authenticated，您需要指定您要提出請求的區域和服務，以及識別您希望 Canary 在提出此 SigV4 請求時擔任之 IAM 角色的 ARN (AWS 資源名稱）。Synthetics 會擔任 roleArn 中提供的 IAM 角色，並使用它來驗證您的 AWS API 請求。

範例組態：

```
"Authentication": {
    "type": "SIGV4",
    "region": us-west-2, // Required
    "service": s3, // Required
    "roleArn": arn:AWS:iam:12345678912:role/SampleRole // Required
}
```

#### SigV4 考量事項
<a name="CloudWatch_Synthetics_MultiCheck_SigV4Considerations"></a>

若要讓 Synthetics 擔任您在 SigV4 身分驗證區段中提供的角色，必須設定連接至該角色的信任政策，以允許 Canary 擔任提供的 roleArn。您需要信任的 AWS 委託人是 Canary 擔任的角色 AWS STS。它採用 ` aws:sts::{account_running_the_canary}:assumed-role/<canary_name>/<assumed_role_name>` arn 格式：。

例如，如果您在帳戶 0123456789012 中有一個名為 test-canary 的 Canary，且其擔任的角色名為 canary-assume-role，則信任政策需要包含此陳述式，Canary 才能正確擔任 roleArn for SigV4 身分驗證：

```
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:AWS:sts::123456789012:assumed-role/test-canary/"
    },
    "Action": "sts:AssumeRole"
}
```

### OAuth 用戶端憑證
<a name="CloudWatch_Synthetics_MultiCheck_OAuthAuth"></a>

Synthetics 會實作 RFC 6479 第 4.4 節中定義的 OAuth 用戶端憑證授予類型。如果您想要對使用 OAuth 權杖端點發行的承載字符進行身分驗證的端點發出 HTTP 請求，Synthetics 可以代表您請求和管理承載字符。當您使用 OAuth 機制時，Synthetics 會執行下列步驟：
+ 搭配 clientId 和 clientSecret 使用基本身分驗證機制來驗證對 tokenUrl 的請求，這是發出承載字符的端點
+ 如果您提供選用的範圍、對象和資源參數，這些參數會包含在字符請求中
+ 使用 tokenUrl 傳回的存取字符來驗證您的 HTTP 請求
+ 安全地存放從 tokenUrl 傳回的重新整理權杖，以供未來的權杖請求使用

範例組態：

```
"Authentication": {
    "type": "OAUTH_CLIENT_CREDENTIALS",
    "tokenUrl": ..., // Required
    "clientId": ..., // Required
    "clientSecret": ..., // Required
    "scope": ..., // Optional
    "audience": ..., // Optional
    "resource": ..., // Optional
}
```

#### OAuth 考量事項
<a name="CloudWatch_Synthetics_MultiCheck_OAuthConsiderations"></a>

Synthetics 會在傳回 401 或 407 回應時重新整理 OAuth 權杖。

### AWS Secrets Manager 整合
<a name="CloudWatch_Synthetics_MultiCheck_SecretsManager"></a>

為了避免以純文字形式存放秘密值 （例如密碼或 API 金鑰），Synthetics 提供與 的整合 AWS Secrets Manager。您可以使用 格式 參考藍圖組態中的整個秘密值` ${aws_SECRET:<secret_name>}`，或參考特定金鑰 ` ${aws_SECRET:<secret_name>:<secret_key>}`。

例如，如果您有名為 login/basic-auth-credentials 的秘密，請使用下列 JSON 結構存放使用者名稱和密碼：

```
{
    "username": "Aladdin",
    "password": "open sesame"
}
```

您可以在藍圖組態中參考使用者名稱和密碼，如下所示，而 Synthetics 會處理擷取秘密值，並使用其金鑰來驗證您的請求：

```
"Authentication": {
    "type": "BASIC",
    "username": ${AWS_SECRET:login/basic-auth-credentials:username},
    "password": ${AWS_SECRET:login/basic-auth-credentials:password}
}
```

若要允許 Synthetics 擷取指定的秘密，Canary 擔任的角色 ARN 需要具有 secretsManager：GetSecretValue 許可。如果秘密是使用客戶受管金鑰而非 AWS 受管金鑰 AWS/secretsmanager 加密，則您也需要該金鑰的 kms:Decrypt 許可。

範例許可：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:AWS:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
        },
        {
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:AWS:kms:us-east-1:123456789012:key/key-id"
        }
    ]
}
```

## 疑難排解
<a name="CloudWatch_Synthetics_MultiCheck_Troubleshooting"></a>

### 常見的故障診斷失敗
<a name="CloudWatch_Synthetics_MultiCheck_Common_Failures"></a>

多檢查藍圖的基礎程式碼是以 Typescript 撰寫。請參閱 Canary 故障診斷頁面以取得常見故障：[故障診斷失敗的 Canary](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Troubleshoot.html)。

### JSON 檢查組態語法錯誤
<a name="CloudWatch_Synthetics_MultiCheck_JSON_Errors"></a>

當有任何與 Canary 的 JSON 檢查組態相關的語法錯誤時， AWS 管理主控台 會在您嘗試建立 Canary 時為您提供失敗原因。如果您使用 API 或 建立 Canary CloudFormation，您會在第一次執行 Canary 時看到失敗。建議針對多重檢查 Canary 使用安全 Canary 更新工作流程。如需詳細資訊，請參閱[執行安全 Canary 更新。 ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/performing-safe-canary-upgrades.html)

### 網路或逾時失敗
<a name="CloudWatch_Synthetics_MultiCheck_Network_Failures"></a>

對於任何與逾時相關的間歇性或一致性故障，網路連線故障 （例如 ENOTFOUND、ECONNRESET) 會考慮開啟` DEBUG`日誌，以便以下執行會提供檢查失敗原因的更多其他詳細資訊。若要這樣做，請提供環境變數 CW\$1SYNTHETICS\$1LOG\$1LEVEL： "DEBUG"。

如果仍有無法偵錯的故障，請考慮聯絡 AWS Support 或檢查 CloudWatch Synthetics 提供的任何其他 Canary 類型是否更符合您的使用案例。

# 使用適用於 Google Chrome 的 CloudWatch Synthetics Recorder
<a name="CloudWatch_Synthetics_Canaries_Recorder"></a>

Amazon 提供了 CloudWatch Synthetics Recorder，可幫助您更輕鬆地建立 Canary。記錄器是 Google Chrome 延伸。

記錄器記錄了您在網站上的點按和輸入動作，並自動產生 Node.js 指令碼，而該指令碼可用於建立遵循相同步驟的 Canary。

開始記錄後，CloudWatch Synthetics Recorder 會在瀏覽器中偵測您的動作，並將其轉換為指令碼。您可以視需要暫停和繼續記錄。當您停止記錄時，記錄器會產生動作的 Node.js 指令碼，而您可以使用 **Copy to Clipboard** (複製到剪貼簿) 按鈕輕鬆進行複製。然後，您可以使用此指令碼在 CloudWatch Synthetics 中建立 Canary。

**點數**：CloudWatch Synthetics Recorder 是以[無周邊記錄器](https://github.com/checkly/headless-recorder)為基礎。

## 安裝適用於 Google Chrome 的 CloudWatch Synthetics Recorder 延伸
<a name="CloudWatch_Synthetics_Canaries_Recorder-install"></a>

若要使用 CloudWatch Synthetics Recorder，您可以開始建立 Canary 並選擇 **Canary Recorder** (Canary 記錄器) 藍圖。如果您在尚未下載記錄器時執行此動作，CloudWatch Synthetics 主控台會提供下載連結。

或者，您可以依照這些步驟直接下載及安裝記錄器。

**若要安裝 CloudWatch Synthetics Recorder**

1. 使用 Google Chrome，前往此網站：[https://chrome.google.com/webstore/detail/cloudwatch-synthetics-rec/bhdnlmmgiplmbcdmkkdfplenecpegfno ](https://chrome.google.com/webstore/detail/cloudwatch-synthetics-rec/bhdnlmmgiplmbcdmkkdfplenecpegfno)

1. 選擇 **Add to Chrome** (新增至 Chrome)，然後選擇 **Add extension** (新增延伸)。

## 使用適用於 Google Chrome 的 CloudWatch Synthetics Recorder
<a name="CloudWatch_Synthetics_Canaries_Recorder-using"></a>

若要使用 CloudWatch Synthetics Recorder 來協助您建立 Canary，您可以在 CloudWatch 主控台中選擇 **Create canary** (建立 Canary)，然後選擇 **Use a blueprint** (使用藍圖)、**Canary Recorder** (Canary 記錄器)。如需詳細資訊，請參閱[建立 Canary](CloudWatch_Synthetics_Canaries_Create.md)。

或者，您可以使用記錄器來記錄步驟，而不需立即使用它們來建立 Canary。

**若要使用 CloudWatch Synthetics Recorder 記錄您在網站上的動作**

1. 導覽至您想要監控的頁面。

1. 選擇 Chrome 延伸圖示，然後選擇 **CloudWatch Synthetics Recorder**。

1. 選擇 **Start Recording** (開始記錄)。

1. 執行您想要記錄的步驟。若要暫停錄製，請選擇**暫停**。

1. 完成記錄工作流程時，選擇 **Stop recording** (停止錄製)。

1. 選擇 **Copy to clipboard** (複製到剪貼簿)，將產生的指令碼複製到剪貼簿。或者，如果您想要重新開始，請選擇 **New recording** (新的記錄)。

1. 若要使用複製的指令碼建立 Canary，您可以將複製的指令碼貼到記錄器藍圖內置編輯器中，或將其儲存到 Simple Storage Service (Amazon S3) 儲存貯體中並從其中匯入。

1. 如果您不是要立即建立 Canary，則可以將記錄的指令碼儲存到檔案中。

## CloudWatch Synthetics Recorder 的已知限制
<a name="CloudWatch_Synthetics_Canaries_Recorder-limitations"></a>

適用於 Google Chrome 的 CloudWatch Synthetics Recorder 目前有以下限制。
+ 沒有 ID 的 HTML 元素將使用 CSS 選擇器。如果網頁結構稍後發生變更，這可能會破壞 Canary。我們計劃在未來版本的記錄器中提供一些組態選項 (例如使用 data-id)。
+ 記錄器不支援按兩下或複製/貼上等動作，也不支援 CMD\$10 之類的按鍵組合。
+ 若要驗證頁面上是否存在元素或文字，使用者必須在產生指令碼之後新增聲明。記錄器不支援驗證元素而不對該元素執行任何動作。這類似於 Canary 工作流程建置器中的「驗證文字」或「驗證元素」選項。我們計劃在未來版本的記錄器中新增一些聲明支援。
+ 記錄器會在啟動記錄的標籤中記錄所有動作。它不會記錄快顯 (例如，允許位置追蹤)，也不會從快顯導覽至不同的頁面。

# Synthetics 執行時間版本
<a name="CloudWatch_Synthetics_Canaries_Library"></a>

當您建立或更新 Canary 時，您需要為 Canary 選擇 Synthetics 執行時間版本。Synthetics 執行時間是 Synthetics 程式碼的組合，可呼叫指令碼處理常式，以及組合依存項目的 Lambda 層。

CloudWatch Synthetics 目前支援使用 Node.js、Python 或 Java 語言的執行時期。支援的架構包括 Puppeteer、Playwright 和 Selenium。

建議您一律使用最新版的 Canary 執行時間，這樣才能使用最新功能和 Synthetics 程式庫的最新更新。

**請注意**：每當您執行 Canary 以使用新版本的 Synthetics 執行期時，Canary 使用的所有 Synthetics 程式庫函數也會自動移至 Synthetics 執行期支援的相同 NodeJS 版本。

**Topics**
+ [使用 Java 的執行時期版本](CloudWatch_Synthetics_Library_Java.md)
+ [使用 Node.js 和 Playwright 的執行時期版本](CloudWatch_Synthetics_Library_nodejs_playwright.md)
+ [使用 Node.js 和 Puppeteer 的執行時間版本](CloudWatch_Synthetics_Library_nodejs_puppeteer.md)
+ [執行時間版本使用 Python 和 Selenium Webdriver](CloudWatch_Synthetics_Library_python_selenium.md)
+ [使用 Node.js 的執行時間版本](CloudWatch_Synthetics_Library_Nodejs.md)
+ [執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)
+ [執行時間版本更新](CloudWatch_Synthetics_Runtime_Version_Update.md)

# 使用 Java 的執行時期版本
<a name="CloudWatch_Synthetics_Library_Java"></a>

下一節包含適用於 Java 的 CloudWatch Synthetics 執行時間版本的相關資訊。此執行時期不包含任何瀏覽器或架構。

這些執行時間版本的命名慣例為 `syn-language -majorversion.minorversion`。

## syn-java-1.0
<a name="Synthetics_runtimeversion-syn-java-1.0"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Java 21

 **功能** 
+ *CloudWatch Logs 整合*：您可以透過 CloudWatch Synthetics 主控台查詢和篩選日誌。每則日誌訊息都包含唯一的 ` canaryRunId`，方便您搜尋特定 Canary 執行的日誌。
+ *指標*：您可以透過 CloudWatch 指標監控 Canary 執行成功百分比和持續時間。您也可以設定警示，以便在 Canary 偵測到問題時收到提醒。
+ *Canary 成品*：每個 Canary 執行都會上傳對應於執行的詳細報告，以及執行中可透過 Amazon S3 存取的步驟。
+ *支援追蹤*：您可以針對 Canary 透過 X-Ray 提出的所有請求發出追蹤。每個 Canary 執行與一個追蹤 ID 關聯。

# 使用 Node.js 和 Playwright 的執行時期版本
<a name="CloudWatch_Synthetics_Library_nodejs_playwright"></a>

以下區段包含適用於 Node.js 和 Playwright 的 CloudWatch Synthetics 執行時期版本的相關資訊。Playwright 是適用於瀏覽器測試的開放原始碼自動化程式庫。如需 Playwright 的詳細資訊，請參閱 [ https：//https://playwright.dev/](https://playwright.dev) 

這些執行時間版本的命名慣例為 `syn-language -framework-majorversion. minorversion`。

## syn-nodejs-playwright-6.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-6.0"></a>

**重要**  
從 Synthetics `syn-nodejs-playwright-5.1`和更新版本開始，Synthetics 執行時間會使用新的命名空間。請遷移 Canary 指令碼以使用新的命名空間。未來版本中將棄用舊版命名空間。  
@amzn/synthetics-playwright → @aws/synthetics-playwright

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 22.x
+ Playwright 1.58.2 版
+ Playwright/test 1.58.2 版
+ Chromium 145.0.7632.77 版
+ Firefox 146.0.1 版

 **syn-nodejs-playwright-6.0 的變更** 
+ 套用安全性修補程式和更新的 Playwright 和瀏覽器版本。

如需詳細資訊，請參閱下列內容：
+  [Playwright 變更日誌 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 參考](https://playwright.dev/docs/api/class-playwright) 

## Node.js 和 Playwright 的先前執行時期版本
<a name="Previousversions-nodejs-playwright"></a>

仍支援下列較舊執行時期版本的 Node.js 和 Playwright。

### syn-nodejs-playwright-5.1
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-5.1"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 22.x
+ Playwright 1.57.0 版
+ Playwright/test 1.57.0 版
+ Chromium 143.0.7499.169 版
+ Firefox 142.0.1 版

 **syn-nodejs-playwright-5.1 的變更** 
+ Synthetics 執行時間命名空間遷移。
+ 類型定義可在 [npm 登錄](https://www.npmjs.com/package/@aws/synthetics-playwright)檔中使用。請確定類型定義套件版本符合您 Canary 的執行時間版本。

如需詳細資訊，請參閱下列內容：
+  [Playwright 變更日誌 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 參考](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-5.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-5.0"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 22.x
+ Playwright 1.57.0 版
+ Playwright/test 1.57.0 版
+ Chromium 143.0.7499.4 版
+ Firefox 142.0.1 版

 **syn-nodejs-playwright-5.0 的變更** 
+ 套用安全性修補程式和更新的 Playwright 和瀏覽器版本。

如需詳細資訊，請參閱下列內容：
+  [Playwright 變更日誌 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 參考](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-4.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-4.0"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 22.x
+ Playwright 1.55.0 版
+ Playwright/test 1.55.0 版
+ Chromium 140.0.7339.16 版
+ Firefox 141.0 版

 **syn-nodejs-playwright-4.0 的變更** 
+ 套用安全性修補程式和更新的 Playwright 和瀏覽器版本。

如需詳細資訊，請參閱下列內容：
+  [Playwright 變更日誌 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 參考](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-3.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-3.0"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 20.x
+ Playwright 1.53.0 版
+ Playwright/test 1.53.0 版
+ Chromium 138.0.7204.168 版

 **syn-nodejs-playwright-3.0 中的變更** 
+ 多瀏覽器支援：您現在可以在 Firefox 或 Chrome 中執行 nodejs puppeteer Canary
+ 支援視覺化呈現監控

如需詳細資訊，請參閱下列內容：
+  [Playwright 變更日誌 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 參考](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-2.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-2.0"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 20.x
+ Playwright 1.49.1 版
+ Playwright/test 1.49.1 版
+ Chromium 131.0.6778.264 版

 **syn-nodejs-playwright-2.0 中的變更** 
+ HAR 檔案中，針對指定請求的總持續時間與各時段時間總和之間存在不一致的問題已修正。
+ 支援 Canary 的模擬執行，允許臨機操作執行或執行安全的 Canary 更新。

如需詳細資訊，請參閱下列內容：
+  [Playwright 變更日誌 ](https://playwright.dev/docs/release-notes) 
+  [Playwright API 參考](https://playwright.dev/docs/api/class-playwright) 

### syn-nodejs-playwright-1.0
<a name="Synthetics_runtimeversion-syn-nodejs-playwright-1.0"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 20.x
+ Playwright 1.44.1 版
+ Playwright/test 1.44.1 版
+ Chromium 126.0.6478.126 版

**功能：**
+ **PlayWright 支援**：您可以使用 Playwright 自動化架構撰寫 Canary 指令碼。您可以將現有的 Playwright 指令碼作為 Canary 執行，並透過 AWS 監控功能強化其效能。
+ **CloudWatch Logs 整合**：您可以透過 CloudWatch Synthetics 主控台查詢和篩選日誌。每則日誌訊息都包含唯一的 `canaryRunId`，方便您搜尋特定 Canary 執行的日誌。
+ **指標和 Canary 成品**：您可以透過 CloudWatch 指標監控 Canary 執行通過率，並設定警示以在 Canary 偵測到問題時收到提醒。
+ **螢幕擷取畫面和步驟關聯**：您可以使用原生 Playwright 功能擷取螢幕畫面，以視覺化呈現 Canary 指令碼在每次執行時的階段狀態。螢幕擷取畫面會自動與 Canary 步驟建立關聯，並上傳至 Amazon S3 儲存貯體。
+ **多個索引標籤**：您可以建立開啟多個瀏覽器索引標籤的 Canary，並從每個索引標籤存取螢幕擷取畫面。您可以在 Synthetics 中建立多個索引標籤和多個步驟的使用者工作流程。

# 使用 Node.js 和 Puppeteer 的執行時間版本
<a name="CloudWatch_Synthetics_Library_nodejs_puppeteer"></a>

Node.js 和 Puppeteer 的第一個執行時間版本名稱為 `syn-1.0`。較新的執行時間版本具有命名慣例 `syn-language -majorversion.minorversion`。從 `syn-nodejs-puppeteer-3.0` 開始，命名慣例為 `syn- language-framework-majorversion .minorversion` 

額外 `-beta` 尾碼顯示執行時間版本目前處於 Beta 預覽版。

具有相同主要版本編號的執行時間版本可回溯相容。

Canary 中 Lambda 程式碼的記憶體上限會設定為 1 GB。Canary 的每次執行都會在設定的逾時值後逾時。若未針對 Canary 指定逾時值，CloudWatch 會根據 Canary 的頻率選擇逾時值。若您設定逾時值，請使其不短於 15 秒，以允許 Lambda 冷啟動和啟動 canary 儀器所需的時間。

## syn-nodejs-puppeteer-15.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-15.0"></a>

`syn-nodejs-puppeteer-15.0` 是 Node.js 和 Puppeteer 的最新 Synthetics 執行時期。

**重要**  
從 Synthetics `syn-nodejs-puppeteer-13.1`和更新版本開始，Synthetics 執行時間會使用新的命名空間。請遷移 Canary 指令碼以使用新的命名空間。未來版本中將棄用舊版命名空間。  
Synthetics → @aws/synthetics-puppeteer
SyntheticsLink → @aws/synthetics-link
SyntheticsLogger → @aws/synthetics-logger
SyntheticsLogHelper → @aws/synthetics-log-helper
BrokenLinkCheckerReport → @aws/synthetics-broken-link-checker-report

**重要**  
Synthetics 執行期`syn-nodejs-puppeteer-11.0`和更新版本僅支援下列步驟層級組態覆寫：  
 `screenshotOnStepStart` 
 `screenshotOnStepSuccess` 
 `screenshotOnStepFailure` 
 `stepSuccessMetric` 
 `stepDurationMetric` 
 `continueOnStepFailure/continueOnHttpStepFailure` 
 `stepsReport` 

如需詳細資訊，請參閱下列內容：
+  [Puppeteer 變更日誌](https://pptr.dev/CHANGELOG#24375-2026-02-19) 
+  [Puppeteer API 參考](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.37.5/docs/api/index.md) 

**主要相依性**：
+ Lambda 執行期 Node.js 22.x
+ Puppeteer-core 24.37.5 版
+ Chromium 145.0.7632.77 版
+ Firefox 147.0.4 版

 **syn-nodejs-puppeteer-15.0 的變更** 
+ 套用安全性修補程式和更新的 Puppeteer 和瀏覽器版本。
+ 已修正未遵守 continueOnHttpStepFailure 的錯誤，導致 Canary 執行在發生 HTTP 步驟失敗時錯誤標示為成功。

## Node.js 和 Puppeteer 的先前執行時期版本
<a name="Previousversions-nodejs-puppeteer"></a>

仍支援下列較舊執行時期版本的 Node.js 和 Puppeteer。

### syn-nodejs-puppeteer-14.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-14.0"></a>

如需詳細資訊，請參閱下列內容：
+  [Puppeteer 變更日誌](https://pptr.dev/CHANGELOG#24340-2025-12-19) 
+  [Puppeteer API 參考](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.34.0/docs/api/index.md) 

**主要相依性**：
+ Lambda 執行期 Node.js 22.x
+ Puppeteer-core 24.34.0 版
+ Chromium 143.0.7499.169 版
+ Firefox 146.x 版

 **syn-nodejs-puppeteer-14.0 的變更** 
+ 套用安全性修補程式和更新的 Puppeteer 和瀏覽器版本。

### syn-nodejs-puppeteer-13.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-13.1"></a>

`syn-nodejs-puppeteer-13.1` 是 Node.js 和 Puppeteer 的最新 Synthetics 執行時期。

如需詳細資訊，請參閱下列內容：
+  [Puppeteer 變更日誌](https://pptr.dev/CHANGELOG#24250-2025-10-15) 
+  [Puppeteer API 參考](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**主要相依性**：
+ Lambda 執行期 Node.js 22.x
+ Puppeteer-core 24.25.0 版
+ Chromium 142.0.7444.175 版
+ Firefox 145.x 版

 **syn-nodejs-puppeteer-13.1 的變更** 
+ Synthetics 執行時間命名空間遷移。
+ 類型定義可在 npm 登錄檔中使用。請確定類型定義套件版本符合您 Canary 的執行時間版本。
  +  [ @aws/synthetics-puppeteer](https://www.npmjs.com/package/@aws/synthetics-puppeteer) 
  +  [ @aws/synthetics-link](https://www.npmjs.com/package/@aws/synthetics-link) 
  +  [ @aws/synthetics-broken-link-checker-report](https://www.npmjs.com/package/@aws/synthetics-broken-link-checker-report) 
  +  [ @aws/synthetics-log-helper](https://www.npmjs.com/package/@aws/synthetics-log-helper) 
  +  [ @aws/synthetics-logger](https://www.npmjs.com/package/@aws/synthetics-logger) 

### syn-nodejs-puppeteer-13.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-13.0"></a>

如需詳細資訊，請參閱下列內容：
+  [Puppeteer 變更日誌](https://pptr.dev/CHANGELOG#24250-2025-10-15) 
+  [Puppeteer API 參考](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**主要相依性**：
+ Lambda 執行期 Node.js 22.x
+ Puppeteer-core 24.25.0 版
+ Chromium 142.0.7444.175 版
+ Firefox 145.x 版

 **syn-nodejs-puppeteer-13.0 的變更** 
+ 套用安全性修補程式和更新的 Puppeteer 和瀏覽器版本。
+ 錯誤修正 – 修正並行映射存取導致的間歇性執行時間延伸當機問題

### syn-nodejs-puppeteer-12.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-12.0"></a>

如需詳細資訊，請參閱下列內容：
+  [Puppeteer 變更日誌](https://pptr.dev/CHANGELOG#24221-2025-09-23) 
+  [Puppeteer API 參考](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.22.1/docs/api/index.md) 

**主要相依性**：
+ Lambda 執行期 Node.js 22.x
+ Puppeteer-core 24.22.1 版
+ Chromium 140.0.7339.185 版
+ Firefox 143.0.1 版

 **syn-nodejs-puppeteer-12.0 的變更** 
+ 套用安全性修補程式和更新的 Puppeteer 和瀏覽器版本。
+ 受限標頭修訂的錯誤修正 – 修正在某些情況下，在 executeHttpStep() 中未修訂受限標頭的問題。行為現在與 Puppeteer 10.0 一致。
+ includeResponseBody 組態的錯誤修正 – 修正在某些情況下，產生 HAR 檔案可能會誤用 includeResponseBody 組態設定的問題。HAR 現在可確保在設定 時排除回應內文。
+ 請求擷取生命週期已修正 – 已修正在某些情況下，HTTP 請求擷取器可能會導致請求持續彙總的問題。錄製現在會在每個步驟執行後正確終止。

### syn-nodejs-puppeteer-11.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-11.0"></a>

如需詳細資訊，請參閱下列內容：
+  [Puppeteer 變更日誌](https://pptr.dev/CHANGELOG) 
+  [Puppeteer API 參考](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**主要相依性**：
+ Lambda 執行時期 Node.js 20.x
+ Puppeteer-core 24.15.0 版
+ Chromium 138.0.7204.168 版

 **syn-nodejs-puppeteer-11.0 中的變更** 
+ 多瀏覽器支援：您現在可以在 Firefox 或 Chrome 中執行 Node.js Puppeteer Canary
+ 簡化封裝：直接在根目錄下封裝指令碼，而不使用 Node.js/node\$1modules 目錄結構
+ 螢幕擷取畫面整合：使用原生 Puppeteer 函式擷取螢幕畫面，以視覺化呈現 Canary 指令碼的階段狀態。Synthetics 會自動將螢幕擷取畫面與 Canary 步驟建立關聯，並將其上傳至 Amazon S3
+ 增強型日誌查詢：透過 CloudWatch Insights 主控台查詢和篩選日誌。每則日誌訊息都包含唯一的 `canaryRunId`，以利搜尋
+ 設定檔支援：使用 Synthetics.json 檔案定義和更新 Synthetics 設定。將組態與指令碼邏輯分離，可提升維護性與可重複使用性
+ 支援多個索引標籤：建立 Canary 以開啟多個瀏覽器索引標籤，並從每個索引標籤存取螢幕擷取畫面。在 Synthetics 中建置多個索引標籤和多個步驟的使用者工作流程
+ 安全性修正
+ 視覺化監控錯誤修正
+ 新增對具有可設定日誌層級之結構化 JSON 記錄的支援 – 日誌現在會以 JSON 格式發出，以便在 CloudWatch 中更輕鬆地剖析和查詢。日誌層級可透過環境變數設定 (例如 DEBUG、INFO、TRACE)，允許使用者根據自己的需求控制詳細程度
+ 支援 ES 語法

### syn-nodejs-puppeteer-10.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-10.0"></a>

如需詳細資訊，請參閱下列內容：
+  [Puppeteer 變更日誌](https://pptr.dev/CHANGELOG) 
+  [Puppeteer API 參考](https://github.com/puppeteer/puppeteer/blob/puppeteer-v24.2.0/docs/api/index.md) 

**主要相依性**：
+ Lambda 執行時期 Node.js 20.x
+ Puppeteer-core 24.2.0 版
+ Chromium 131.0.6778.264 版

 **syn-nodejs-puppeteer-10.0 中的變更** 
+ 與關閉花費過多時間的瀏覽器相關錯誤已修正。
+ 支援 Canary 的模擬執行，允許臨機操作執行或執行安全的 Canary 更新。

### syn-nodejs-puppeteer-9.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.1"></a>

**主要相依性**：
+ Lambda 執行時期 Node.js 20.x
+ Puppeteer-core 22.12.1 版
+ Chromium 126.0.6478.126 版

**syn-nodejs-puppeteer-9.1 中的變更**：與日期範圍及 HAR 檔案中待處理請求相關的錯誤已修正。

### syn-nodejs-puppeteer-9.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.0"></a>

**主要相依性**：
+ Lambda 執行時期 Node.js 20.x
+ Puppeteer-core 22.12.1 版
+ Chromium 126.0.6478.126 版

**syn-nodejs-puppeteer-9.0 中的變更**：啟用視覺化監控功能的錯誤已修正。

### syn-nodejs-puppeteer-8.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-8.0"></a>

**警告**  
由於錯誤，`syn-nodejs-puppeteer-8.0` 執行時期不支援在 Canary 中使用視覺化監控。升級至 [syn-nodejs-puppeteer-9.0](#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-9.0) 可修正視覺化監控錯誤。

**重要**  
Lambda Node.js 18 及更新版本執行時間使用適用於 JavaScript V3 的 AWS SDK。如果您需要從較早的執行時間遷移 Canary，請遵循 GitHub 上的 [aws-sdk-js-v3 遷移研討會](https://github.com/aws-samples/aws-sdk-js-v3-workshop)。如需適用於 JavaScript AWS 的 SDK 第 3 版的詳細資訊，請參閱[此部落格文章](https://aws.amazon.com/blogs/developer/modular-aws-sdk-for-javascript-is-now-generally-available/)。

**主要相依性**：
+ Lambda 執行時期 Node.js 20.x
+ Puppeteer-core 22.10.0 版
+ Chromium 125.0.6422.112 版

**syn-nodejs-puppeteer-8.0 中的更新**：
+  **支援雙重身分驗證** 
+ **錯誤修正**：Node.js SDK V3 回應中部分服務用戶端遺失資料的相關錯誤已修正。

## Node.js 和 Puppeteer 的已棄用執行時期版本
<a name="CloudWatch_Synthetics_nodejs-puppeteer-Deprecated"></a>

下列 Node.js 和 Puppeteer 的執行時期已棄用。如需執行時期棄用日期的相關資訊，請參閱 [CloudWatch Synthetics 執行時期棄用日期](CloudWatch_Synthetics_Runtime_Support_Policy.md#runtime_deprecation_dates)。

### syn-nodejs-puppeteer-7.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-7.0"></a>

**主要相依性**：
+ Lambda 執行時間 Node.js 18.x
+ Puppeteer-core 21.9.0 版
+ Chromium 121.0.6167.139 版

**程式碼大小**：

您可以在此執行時期中封裝的程式碼和相依項大小為 80 MB。

**syn-nodejs-puppeteer-7.0 中的更新**：
+ **已更新 Puppeteer 和 Chromium 中綁定程式庫的版本**：Puppeteer 和 Chromium 相依項更新為新版本。
**重要**  
從 Puppeteer 19.7.0 移至 Puppeteer 21.9.0 引入了有關測試和篩選條件的重大變更。如需詳細資訊，請參閱 [puppeteer: v20.0.0](https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-v20.0.0) 和 [puppeteer-core: v21.0.0](https://github.com/puppeteer/puppeteer/releases/tag/puppeteer-core-v21.0.0) 中的**重大變更**章節。

 **建議升級至 AWS SDK v3** 

Lambda nodejs18.x 執行時間不支援 AWS SDK v2。我們強烈建議您遷移至 AWS SDK v3。

### syn-nodejs-puppeteer-6.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.2"></a>

**主要相依性**：
+ Lambda 執行時間 Node.js 18.x
+ Puppeteer-core 19.7.0 版
+ Chromium 111.0.5563.146 版

**syn-nodejs-puppeteer-6.2 中的變更**：
+  **已更新 Chromium 中綁定程式庫的版本** 
+ **臨時儲存空間監控**：此執行時期在客戶帳戶中新增臨時儲存空間監控功能。
+  **錯誤修正** 

### syn-nodejs-puppeteer-6.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.1"></a>

**主要相依性**：
+ Lambda 執行時間 Node.js 18.x
+ Puppeteer-core 19.7.0 版
+ Chromium 111.0.5563.146 版

**syn-nodejs-puppeteer-6.1 中的更新**：
+ **穩定性改進** – 新增用於處理間歇性 Puppeteer 啟動錯誤的自動重試邏輯。
+ **相依性升級** – 升級某些第三方相依套件。
+ **沒有 Amazon S3 許可的 Canaries** – 錯誤修正，使得沒有任何 Amazon S3 許可的 Canary 仍然可以執行。這些沒有 Amazon S3 許可的 Canary 將無法將螢幕擷取畫面或其他成品上傳到 Amazon S3。如需有關 Canaries 的許可詳細資訊，請參閱 [Canary 的必要角色和許可](CloudWatch_Synthetics_Canaries_CanaryPermissions.md)。

**重要**  
重要：隨附的適用於 JavaScript v2 的 AWS SDK 相依性將被移除並更新，以在未來執行時間版本中使用適用於 JavaScript v3 的 AWS SDK。發生這種情況時，您可以更新 Canary 程式碼引用。或者，您也可以將其作為相依性新增至原始程式碼 zip 檔案，繼續參考並將包含的 AWS SDK 用於 JavaScript v2 相依性。

### syn-nodejs-puppeteer-6.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-6.0"></a>

**主要相依性**：
+ Lambda 執行時間 Node.js 18.x
+ Puppeteer-core 19.7.0 版
+ Chromium 111.0.5563.146 版

**syn-nodejs-puppeteer-6.0 中的更新**：
+ **相依性升級** — Node.js 相依性已更新至 18.x。
+ **攔截模式支援** – Puppeteer 合作攔截模式支援已新增至 Synthetics 金絲雀執行期程式庫。
+ **追蹤行為變更** – 已變更預設追蹤行為，僅追蹤擷取和 xhr 請求，而不追蹤資源請求。您可設定 `traceResourceRequests` 選項來啟用資源請求追蹤。
+ **持續時間指標** – ` Duration` 指標現在會排除金絲雀部署用於上傳成品、擷取螢幕擷取畫面和產生 CloudWatch 指標的操作時間。`Duration` 指標值會報告給 CloudWatch，並且您還可在 Synthetics 主控台中查看這些指標值。
+ **錯誤修復** – 清理 Chromium 在金絲雀部署執行期間崩潰時產生的核心傾印。

**重要**  
重要：隨附的適用於 JavaScript v2 的 AWS SDK 相依性將被移除並更新，以在未來執行時間版本中使用適用於 JavaScript v3 的 AWS SDK。發生這種情況時，您可以更新 Canary 程式碼引用。或者，您也可以將其作為相依性新增至原始程式碼 zip 檔案，繼續參考並將包含的 AWS SDK 用於 JavaScript v2 相依性。

### syn-nodejs-puppeteer-5.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.2"></a>

**主要相依性**：
+ Lambda 執行階段 Node.js 16.x
+ Puppeteer-core 19.7.0 版
+ Chromium 111.0.5563.146 版

**syn-nodejs-puppeteer-5.2 中的更新**：
+  **已更新 Chromium 中綁定程式庫的版本** 
+  **錯誤修正** 

### syn-nodejs-puppeteer-5.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1"></a>

**主要相依性**：
+ Lambda 執行階段 Node.js 16.x
+ Puppeteer-core 19.7.0 版
+ Chromium 111.0.5563.146 版

**syn-nodejs-puppeteer-5.1 中的錯誤修正**：
+ **錯誤修復** - 此執行期修復了 ` syn-nodejs-puppeteer-5.0` 中的一個錯誤，即 Canary 建立的 HAR 檔案缺少請求標頭。

### syn-nodejs-puppeteer-5.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0"></a>

**主要相依性**：
+ Lambda 執行階段 Node.js 16.x
+ Puppeteer-core 19.7.0 版
+ Chromium 111.0.5563.146 版

**syn-nodejs-puppeteer-5.0 中的更新**：
+ **相依性升級** — Puppeteer-core 版本已更新至 19.7.0。Chromium 版本已升級至 111.0.5563.146。

**重要**  
新 Puppeteer-core 版本與舊版 Puppeteer 不完全回溯相容。此版本中的部分變更可能會導致使用已移除 Puppeteer 函數的現有 Canary 失敗。如需詳細資訊，請在 [Puppeteer change logs](https://github.com/puppeteer/puppeteer/releases?q=breaking&expanded=true) 中，參閱 Puppeteer-core 19.7.0 至 6.0 版變更日誌中的重大變更。

### syn-nodejs-puppeteer-4.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0"></a>

**主要相依性**：
+ Lambda 執行階段 Node.js 16.x
+ Puppeteer-core 5.5.0 版
+ Chromium 92.0.4512 版

**syn-nodejs-puppeteer-4.0 中的更新**：
+ **相依性升級** — Node.js 相依性已更新至 16.x。

### syn-nodejs-puppeteer-3.9
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9"></a>

**重要**  
此執行時期版本已於 2024 年 1 月 8 日被棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 14.x
+ Puppeteer-core 5.5.0 版
+ Chromium 92.0.4512 版

**syn-nodejs-puppeteer-3.9 中的更新**：
+ **相依性升級** — 升級某些第三方相依套件。

### syn-nodejs-puppeteer-3.8
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8"></a>

**重要**  
此執行時期版本已於 2024 年 1 月 8 日被棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 14.x
+ Puppeteer-core 5.5.0 版
+ Chromium 92.0.4512 版

**syn-nodejs-puppeteer-3.8 中的更新**：
+ **設定檔清理**：現在每次 Canary 執行後，都會清理 Chromium 設定檔。

**syn-nodejs-puppeteer-3.8 中的錯誤修正**：
+ **錯誤修正**：以前，在沒有螢幕擷取畫面的情況下，視覺化監控 Canary 有時會在執行後停止正常工作。現在已修正。

### syn-nodejs-puppeteer-3.7
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7"></a>

**重要**  
此執行時期版本已於 2024 年 1 月 8 日被棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 14.x
+ Puppeteer-core 5.5.0 版
+ Chromium 92.0.4512 版

**syn-nodejs-puppeteer-3.7 中的更新**：
+ **記錄增強功能**：即使逾時或當機，Canary 也會將日誌上傳到 Amazon S3。
+ **Lambda 層大小減少**：用於 Canary 的 Lambda 層大小減少 34%。

**syn-nodejs-puppeteer-3.7 中的錯誤修正**：
+ **錯誤修正**：日文、簡體中文和繁體中文字型會正確顯示。

### syn-nodejs-puppeteer-3.6
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6"></a>

**重要**  
此執行時期版本已於 2024 年 1 月 8 日被棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 14.x
+ Puppeteer-core 5.5.0 版
+ Chromium 92.0.4512 版

**syn-nodejs-puppeteer-3.6 中的更新**：
+ **更精確的時間戳記**：金絲雀執行的開始時間和停止時間現在已精確至毫秒。

### syn-nodejs-puppeteer-3.5
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5"></a>

**重要**  
此執行時期版本已於 2024 年 1 月 8 日被棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 14.x
+ Puppeteer-core 5.5.0 版
+ Chromium 92.0.4512 版

**syn-nodejs-puppeteer-3.5 中的更新**：
+ **更新相依項** – 此執行時間中唯一的新功能是更新的相依項。

### syn-nodejs-puppeteer-3.4
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4"></a>

**重要**  
此執行時間版本已於 2022 年 11 月 13 日棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 12.x
+ Puppeteer-core 5.5.0 版
+ Chromium 88.0.4298.0 版

**syn-nodejs-puppeteer-3.4 中的更新**：
+ **自訂處理常式函數** – 您現在可以為 Canary 指令碼使用自訂處理常式函數。先前的執行時間要求指令碼進入點包含 `.handler`。

  您還可以將 Canary 指令碼放在任何資料夾中，並將資料夾名稱作為處理常式的一部分傳遞。例如：`MyFolder/MyScriptFile.functionname` 可用作進入點。
+ **擴展的 HAR 檔案資訊** – 您現在可以在 Canary 產生的 HAR 檔案中看到錯誤、待處理和不完整的請求。

### syn-nodejs-puppeteer-3.3
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3"></a>

**重要**  
此執行時間版本已於 2022 年 11 月 13 日棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 12.x
+ Puppeteer-core 5.5.0 版
+ Chromium 88.0.4298.0 版

**syn-nodejs-puppeteer-3.3 中的更新**：
+ **成品加密的更多選項** — 對於使用此執行時間或更新版本的 Canary，而不是使用 AWS 受管金鑰來加密 Canary 在 Amazon S3 中存放的成品，您可以選擇使用 AWS KMS 客戶受管金鑰或 Amazon S3-managed金鑰。如需詳細資訊，請參閱[加密 Canary 成品](CloudWatch_Synthetics_artifact_encryption.md)。

### syn-nodejs-puppeteer-3.2
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2"></a>

**重要**  
此執行時間版本已於 2022 年 11 月 13 日棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 12.x
+ Puppeteer-core 5.5.0 版
+ Chromium 88.0.4298.0 版

**syn-nodejs-puppeteer-3.2 中的更新**：
+ **使用螢幕截圖進行視覺化監控**— 使用此執行時間或更新版本的 Canary 可以將執行期間擷取的螢幕擷取畫面與相同螢幕擷取畫面的基準版本相比較。如果螢幕擷取畫面比指定的百分比閾值更大，則 Canary 失敗。如需詳細資訊，請參閱 [視覺化監控](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting) 或 [視覺化監控藍圖](CloudWatch_Synthetics_Canaries_Blueprints.md#CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting) 。
+ **關於敏感資料的新功能**您可以防止敏感資料出現在 Canary 日誌和報告中。如需詳細資訊，請參閱[SyntheticsLogHelper 類別](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsLogHelper)。
+ **已取代的函數** 為支援其他組態選項，` RequestResponseLogHelper` 類別已被取代。如需詳細資訊，請參閱[RequestResponseLogHelper class](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_RequestResponseLogHelper)。

### syn-nodejs-puppeteer-3.1
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1"></a>

**重要**  
此執行時間版本已於 2022 年 11 月 13 日棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 12.x
+ Puppeteer-core 5.5.0 版
+ Chromium 88.0.4298.0 版

**syn-nodejs-puppeteer-3.1 中的更新**：
+ **設定 CloudWatch 指標的能力**— 使用此執行時間，您可以停用不需要的指標。否則，Canary 會為每個 Canary 執行發布各種 CloudWatch 指標。
+ **螢幕擷取畫面連結**— 您可以在步驟完成後將螢幕擷取畫面連結至 Canary 步驟。為此，您可以使用 **takeScreenshot** 方法擷取螢幕擷取畫面，並使用您想要與螢幕擷取畫面關聯的步驟名稱。例如，您可能想要執行步驟、新增等待時間，然後擷取螢幕擷取畫面。
+ **活動訊號監控藍圖可以監控多個 URL**— 您可以使用 CloudWatch 主控台中的活動訊號監控藍圖來監控多個 URL，並在 Canary 執行報告的步驟摘要中查看每個 URL 的狀態、持續時間、相關的螢幕擷取畫面和失敗原因。

### syn-nodejs-puppeteer-3.0
<a name="CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0"></a>

**重要**  
此執行時間版本已於 2022 年 11 月 13 日棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 12.x
+ Puppeteer-core 5.5.0 版
+ Chromium 88.0.4298.0 版

**syn-nodejs-puppeteer-3.0 中的更新**：
+ **升級的相依性**— 此執行時間版本使用 Puppeteer 5.5.0 版、Node.js 12.x 和 Chromium 88.0.4298.0 版
+ **跨區域儲存貯體存取**— 您現在可以將另一個區域中 S3 儲存貯體指定為 Canary 存放其日誌檔案、螢幕擷取畫面和 HAR 檔案的儲存貯體。
+ **可用的新函數**— 此版本會新增程式庫函數，以擷取 Canary 名稱和 Synthetics 執行時間版本。

  如需詳細資訊，請參閱[Synthetics 類別](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_Synthetics_Class_all)。

### syn-nodejs-2.2
<a name="CloudWatch_Synthetics_runtimeversion-2.2"></a>

本節包含 `syn-nodejs-2.2` 執行時間版本的相關資訊。

**重要**  
此執行時間版本已於 2021 年 5 月 28 日被棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 10.x
+ Puppeteer-core 3.3.0 版
+ Chromium 83.0.4103.0 版

**syn-nodejs-2.2 中的變更**：
+ **將您的 Canary 作為 HTTP 步驟進行監控**— 您現在可以在單一 Canary 中測試多個 API。每個 API 都經過獨立的 HTTP 步驟測試，而 CloudWatch Synthetics 監控會使用步驟指標和 CloudWatch Synthetics 步驟報告來監控每個步驟的狀態。CloudWatch Synthetics 為每個 HTTP 步驟建立了 ` SuccessPercent` 和 `Duration` 指標。

  這項功能是由 **executeHttpStep(stepName, requestOptions, callback, stepConfig)** 函數實作。如需詳細資訊，請參閱[executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_executeHttpStep)。

  API Canary 藍圖已更新以使用此新功能。
+ **HTTP 請求報告**— 您現在可以檢視詳細的 HTTP 請求報告，這些報告會擷取詳細資訊，例如請求/回應標頭、回應內文、狀態碼、錯誤和效能計時、TCP 連線時間、TLS 交握時間、第一個位元組時間和內容傳輸時間。此處可擷取所有實際使用 HTTP/HTTPS 模組的 HTTP 請求。預設情況下不會擷取標頭和回應正文，但可以透過設定組態選項來將其啟用。
+ **全域和步驟層級組態**— 您可以在全域層級設定 CloudWatch Synthetics 組態，這些組態適用於所有 Canary 步驟。您也可以透過傳遞組態鍵/值對來啟用或停用某些選項，在步驟層級覆寫這些組態。

  如需詳細資訊，請參閱[SyntheticsConfiguration 類別](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration)。
+ **繼續步驟失敗組態**— 您可以選擇在步驟失敗時繼續 Canary 執行。對於 ` executeHttpStep` 函數，預設為開啟。您可以在全域層級設定此選項一次，也可以針對每個步驟設定不同的選項。

### syn-nodejs-2.1
<a name="CloudWatch_Synthetics_runtimeversion-2.1"></a>

**重要**  
此執行時間版本已於 2021 年 5 月 28 日被棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 10.x
+ Puppeteer-core 3.3.0 版
+ Chromium 83.0.4103.0 版

**syn-nodejs-2.1 中的更新**：
+ **可設定的螢幕擷取畫面行為**— 提供關閉 UI Canary 擷取螢幕擷取畫面的能力。在使用舊版執行時間的 Canary 中，UI Canary 總會在每個步驟之前和之後擷取螢幕擷取畫面。利用 `syn-nodejs-2.1`，這是可設定的。關閉螢幕擷取畫面可降低 Simple Storage Service (Amazon S3) 儲存成本，並可協助您遵守 HIPAA 法規。如需詳細資訊，請參閱[SyntheticsConfiguration 類別](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration)。
+ **自訂 Google Chrome 啟動參數** 您現在可以設定當 Canary 啟動 Google Chrome 瀏覽器視窗時使用的引數。如需詳細資訊，請參閱[launch(options)](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_LaunchOptions)。

相較於舊版的 Canary 執行時間，使用 syn-nodejs-2.0 或更新版本時，Canary 持續時間可能會稍微增加。

### syn-nodejs-2.0
<a name="CloudWatch_Synthetics_runtimeversion-2.0"></a>

**重要**  
此執行時間版本已於 2021 年 5 月 28 日被棄用。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 10.x
+ Puppeteer-core 3.3.0 版
+ Chromium 83.0.4103.0 版

**syn-nodejs-2.0 中的更新**：
+ **升級的相依性**— 此執行時間版本使用 Puppeteer-core 3.3.0 版和 Chromium 83.0.4103.0 版
+ **支援 X-Ray 主動追蹤** 當 Canary 啟用追蹤時，系統會針對 Canary 使用瀏覽器、 AWS SDK 或 HTTP 或 HTTPS 模組進行的所有呼叫傳送 X-Ray 追蹤。已啟用追蹤的 Canary 會出現在 X-Ray 追蹤地圖中，即使它們未傳送請求至已啟用追蹤的其他服務或應用程式。如需詳細資訊，請參閱[Canary 和 X-Ray 追蹤](CloudWatch_Synthetics_Canaries_tracing.md)。
+ **Synthetics 報告**— 對於每個 Canary 執行，CloudWatch Synthetics 會建立一個名為 ` SyntheticsReport-PASSED.json` 或 ` SyntheticsReport-FAILED.json` 的報告，且該報告記錄了開始時間、結束時間、狀態和失敗等資料。它還記錄了 Canary 指令碼的每個步驟的通過/失敗狀態，以及每個步驟捕獲的失敗和螢幕擷取畫面。
+ **中斷連接檢查程式報告**— 此執行時間中包含的新版中斷連結檢查程式會建立一份報告，其中包含已檢查的連結、狀態碼、失敗原因 (如有)，以及來源和目的地頁面螢幕擷取畫面。
+ **新的 CloudWatch 指標**— Synthetics 會在 `CloudWatchSynthetics` 命名空間中發布名為 `2xx`、`4xx`、`5xx` 和 `RequestFailed` 的指標。這些指標顯示 Canary 執行中的 200 秒、400 秒、500 秒和請求失敗次數。使用此執行時間版本時，這些指標只會針對 UI Canary 報告，而不會針對 API Canary 報告。它們也報告了從執行時間版本開始的 API Canary` syn-nodejs-puppeteeer-2.2`。
+ **可排序的 HAR 檔案**— 您現在可以依狀態碼、請求大小和持續時間來排序 HAR 檔案。
+ **指標時間戳記**— CloudWatch 指標現在會根據 Lambda 叫用時間而非 Canary 執行結束時間來進行報告。

**syn-nodejs-2.0 中的錯誤修正**：
+ 修正 Canary Artifact 上傳錯誤無法回報的問題。這些錯誤現在顯示為執行錯誤。
+ 修正重新引導請求 (3xx) 被錯誤記錄為錯誤的問題。
+ 修正螢幕擷取畫面從 0 開始編號的問題。他們現在應該從 1 開始。
+ 修正中文和日文字體螢幕擷取畫面亂碼的問題。

相較於舊版的 Canary 執行時間，使用 syn-nodejs-2.0 或更新版本時，Canary 持續時間可能會稍微增加。

### syn-nodejs-2.0-beta
<a name="CloudWatch_Synthetics_runtimeversion-2.0-beta"></a>

**重要**  
此執行時間版本已於 2021 年 2 月 8 日被取代。如需詳細資訊，請參閱[執行時間版本支援政策](CloudWatch_Synthetics_Runtime_Support_Policy.md)。

**主要相依性**：
+ Lambda 執行時間 Node.js 10.x
+ Puppeteer-core 3.3.0 版
+ Chromium 83.0.4103.0 版

**syn-nodejs-2.0-beta 中的變更**：
+ **升級的相依性**— 此執行時間版本使用 Puppeteer-core 3.3.0 版和 Chromium 83.0.4103.0 版
+ **Synthetics 報告**— 對於每個 Canary 執行，CloudWatch Synthetics 會建立一個名為 ` SyntheticsReport-PASSED.json` 或 ` SyntheticsReport-FAILED.json` 的報告，且該報告記錄了開始時間、結束時間、狀態和失敗等資料。它還記錄了 Canary 指令碼的每個步驟的通過/失敗狀態，以及每個步驟捕獲的失敗和螢幕擷取畫面。
+ **中斷連接檢查程式報告**— 此執行時間中包含的新版中斷連結檢查程式會建立一份報告，其中包含已檢查的連結、狀態碼、失敗原因 (如有)，以及來源和目的地頁面螢幕擷取畫面。
+ **新的 CloudWatch 指標**— Synthetics 會在 `CloudWatchSynthetics` 命名空間中發布名為 `2xx`、`4xx`、`5xx` 和 `RequestFailed` 的指標。這些指標顯示 Canary 執行中的 200 秒、400 秒、500 秒和請求失敗次數。這些指標只會針對 UI Canary 報告，而不會針對 API Canary 報告。
+ **可排序的 HAR 檔案**— 您現在可以依狀態碼、請求大小和持續時間來排序 HAR 檔案。
+ **指標時間戳記**— CloudWatch 指標現在會根據 Lambda 叫用時間而非 Canary 執行結束時間來進行報告。

**syn-nodejs-2.0-beta 中的錯誤修正**：
+ 修正 Canary Artifact 上傳錯誤無法回報的問題。這些錯誤現在顯示為執行錯誤。
+ 修正重新引導請求 (3xx) 被錯誤記錄為錯誤的問題。
+ 修正螢幕擷取畫面從 0 開始編號的問題。他們現在應該從 1 開始。
+ 修正中文和日文字體螢幕擷取畫面亂碼的問題。

### syn-1.0
<a name="CloudWatch_Synthetics_runtimeversion-1.0"></a>

第一個 Synthetics 執行時間版本是 `syn-1.0`。

**主要相依性**：
+ Lambda 執行時間 Node.js 10.x
+ Puppeteer-core 1.14.0 版
+ 符合 Puppeteer-core 1.14.0 的 Chromium 版本

# 執行時間版本使用 Python 和 Selenium Webdriver
<a name="CloudWatch_Synthetics_Library_python_selenium"></a>

以下區段包含適用於 Python 和 Selenium Webdriver 的 CloudWatch Synthetics 執行時間版本的相關資訊。Selenium 是一種開放原始碼瀏覽器自動化工具。如需 Selenium 的詳細資訊，請參閱 [ www.selenium.dev/](https://www.selenium.dev)

如需了解 Selenium 架構上 Synthetics 執行時期支援的成員帳戶和方法，請參閱[僅適用於 UI Canary 的 Python 和 Selenium 程式庫類別和函式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_UIcanaries)，以及 [Selenium API 參考](https://www.selenium.dev/selenium/docs/api/py/api.html)。

這些執行時間版本的命名慣例為 `syn-language -framework-majorversion. minorversion`。

## syn-python-selenium-10.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-10.0"></a>

10.0 版是 Python 和 Selenium 的最新 CloudWatch Synthetics 執行時間。

**主要相依性**：
+ Python 3.11
+ 硒 4.32.0
+ Chromium 145.0.7632.77 版

**syn-python-selenium-10.0 的變更 ** 
+ 已套用安全性修補程式和更新的瀏覽器版本。

如需詳細資訊，請參閱下列內容：
+  [Selenium 變更日誌](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Selenium 文件](https://www.selenium.dev/selenium/docs/api/py/api.html) 

## Python 和 Selenium 的先前執行時期版本
<a name="Previousversions-python-selenium"></a>

仍然支援下列舊版的 Python 和 Selenium 執行時期。

### syn-python-selenium-9.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-9.0"></a>

**主要相依性**：
+ Python 3.11
+ 硒 4.32.0
+ Chromium 143.0.7499.169 版

**syn-python-selenium-9.0 的變更 ** 
+ 已套用安全性修補程式和更新的瀏覽器版本。

如需詳細資訊，請參閱下列內容：
+  [Selenium 變更日誌](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Selenium 文件](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-8.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-8.0"></a>

8.0 版是 Python 和 Selenium 的最新 CloudWatch Synthetics 執行時間。

**主要相依性**：
+ Python 3.11
+ 硒 4.32.0
+ Chromium 142.0.7444.175 版

**syn-python-selenium-8.0 的變更 ** 
+ 套用安全性修補程式並更新 Selenium 和瀏覽器版本。
+ 將失敗的 HAR 網路請求日誌層級從 ERROR 修改為 INFO。

如需詳細資訊，請參閱下列內容：
+  [Selenium 變更日誌](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Selenium 文件](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-7.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-7.0"></a>

**主要相依性**：
+ Python 3.11
+ 硒 4.32.0
+ Chromium 138.0.7204.168 版

 **syn-python-selenium-7.0 的變更 ** 
+ 套用安全性修補程式並更新 Selenium 和瀏覽器版本。

如需詳細資訊，請參閱下列內容：
+  [Selenium 變更日誌](https://www.selenium.dev/blog/2025/selenium-4-32-released) 
+  [Selenium 文件](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-6.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-6.0"></a>

**主要相依性**：
+ Python 3.11
+ 硒 4.21.0
+ Chromium 131.0.6778.264 版

 **syn-python-selenium-6.0 的變更** 
+ 從 Python 3.9 升級到 Python 3.11。

如需詳細資訊，請參閱下列內容：
+  [Selenium 變更日誌](https://www.selenium.dev/blog/2024/selenium-4-21-released/) 
+  [Selenium 文件](https://www.selenium.dev/selenium/docs/api/py/api.html) 

### syn-python-selenium-5.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-5.1"></a>

**主要相依性**：
+ Python 3.9
+ 硒 4.21.0
+ Chromium 131.0.6778.264 版

 **syn-python-selenium-5.1 中的變更** 
+ 對指標發射進行微小更新。
+ 支援 Canary 的模擬執行，允許臨機操作執行或執行安全的 Canary 更新。

### syn-python-selenium-5.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-5.0"></a>

**主要相依性**：
+ Python 3.9
+ 硒 4.21.0
+ Chromium 131.0.6778.264 版

**syn-python-selenium-5.0 中的變更**：
+ 瀏覽器無法啟動時自動重試。

### syn-python-selenium-4.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-4.1"></a>

**主要相依性**：
+ Python 3.9
+ 硒 4.15.1
+ Chromium 126.0.6478.126 版

**syn-python-selenium-4.1 中的變更**：
+ **解決安全漏洞**：此執行時期更新解決了 [CVE-2024-39689](https://nvd.nist.gov/vuln/detail/CVE-2024-39689) 漏洞。

### syn-python-selenium-4.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-4.0"></a>

**主要相依性**：
+ Python 3.9
+ 硒 4.15.1
+ Chromium 126.0.6478.126 版

**syn-python-selenium-4.0 中的變更**：
+ **錯誤修正**：HAR 解析器記錄中的錯誤已修正。

## Python 和 Selenium 的已棄用執行時期版本
<a name="Deprecated-python-selenium"></a>

下列舊版的 Python 和 Selenium 執行時期已棄用。如需執行時期棄用日期的相關資訊，請參閱 [CloudWatch Synthetics 執行時期棄用日期](CloudWatch_Synthetics_Runtime_Support_Policy.md#runtime_deprecation_dates)。

### syn-python-selenium-3.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-3.0"></a>

**主要相依性**：
+ Python 3.8
+ 硒 4.15.1
+ Chromium 121.0.6167.139 版

**syn-python-selenium-3.0 中的變更**：
+ **已更新 Chromium 中綁定程式庫的版本**：Chromium 相依項更新為新版本。

### syn-python-selenium-2.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-2.1"></a>

**主要相依性**：
+ Python 3.8
+ 硒 4.15.1
+ Chromium 111.0.5563.146 版

**syn-python-selenium-2.1 中的變更**：
+ **已更新 Chromium 中綁定程式庫的版本**：Chromium 和 Selenium 相依項更新為新版本。

### syn-python-selenium-2.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-2.0"></a>

**主要相依性**：
+ Python 3.8
+ Selenium 4.10.0
+ Chromium 111.0.5563.146 版

**syn-python-selenium-2.0 中的變更**：
+ **更新的依賴關係**— Chromium 和 Selenium 的依賴關係更新為新版本。

**syn-python-selenium-2.0 中的錯誤修正**：
+ **加入了時間戳記** — 時間戳記已新增至金絲雀日誌。
+ **工作階段重複使用** — 修正了一個錯誤，因此金絲雀現在無法重複使用先前的金絲雀執行中的工作階段。

### syn-python-selenium-1.3
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3"></a>

**主要相依性**：
+ Python 3.8
+ Selenium 3.141.0
+ Chromium 92.0.4512.0 版

**syn-python-selenium-1.3 中的變更**：
+ **更精確的時間戳記**：金絲雀執行的開始時間和停止時間現在已精確至毫秒。

### syn-python-selenium-1.2
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2"></a>

**主要相依性**：
+ Python 3.8
+ Selenium 3.141.0
+ Chromium 92.0.4512.0 版
+ **更新相依項** – 此執行時間中唯一的新功能是更新的相依項。

### syn-python-selenium-1.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1"></a>

**主要相依性**：
+ Python 3.8
+ Selenium 3.141.0
+ Chromium 83.0.4103.0 版

**功能：**
+ **自訂處理常式函數** – 您現在可以為 Canary 指令碼使用自訂處理常式函數。先前的執行時間要求指令碼進入點包含 `.handler`。

  您還可以將 Canary 指令碼放在任何資料夾中，並將資料夾名稱作為處理常式的一部分傳遞。例如：`MyFolder/MyScriptFile.functionname` 可用作進入點。
+ **用於新增指標和步驟失敗組態的組態選項** – 這些選項已在 Node.js Canary 的執行時間中提供。如需詳細資訊，請參閱 [SyntheticsConfiguration 類別](CloudWatch_Synthetics_Canaries_Library_Python.md#CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python)。
+ **Chrome 中的自訂引數** – 您現在可以在無痕式模式下開啟瀏覽器或傳入代理伺服器組態。如需詳細資訊，請參閱[Chrome()](CloudWatch_Synthetics_Canaries_Library_Python.md#CloudWatch_Synthetics_Library_Python_Chrome)。
+ **跨區域成品儲存貯體** – Canary 可以將其成品存放在不同區域的 Simple Storage Service (Amazon S3) 儲存貯體中。
+ **錯誤修正，包括 `index.py` 問題的修正** – 對於以前的執行時間，名為 ` index.py` 的 Canary 檔案導致異常，因為其與程式庫檔案的名稱發生衝突。現在已修正此問題。

### syn-python-selenium-1.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0"></a>

**主要相依性**：
+ Python 3.8
+ Selenium 3.141.0
+ Chromium 83.0.4103.0 版

**功能：**
+ **Selenium 支援**— 您可以使用 Selenium 測試架構撰寫 Canary 指令碼。您可以將 Selenium 指令碼從其他位置帶入 CloudWatch Synthetics，並將使用 AWS 服務。

# 使用 Node.js 的執行時間版本
<a name="CloudWatch_Synthetics_Library_Nodejs"></a>

下一節包含 Node.js 的 CloudWatch Synthetics 執行期版本的相關資訊。此執行時期不包含任何瀏覽器或架構。

這些執行時間版本的命名慣例為 `syn-language -majorversion.minorversion`。

## syn-nodejs-4.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-4.1"></a>

**重要**  
從 Synthetics `syn-nodejs-3.1`和更新版本開始，Synthetics 執行時間會使用新的命名空間。請遷移 Canary 指令碼以使用新的命名空間。未來版本中將棄用舊版命名空間。  
@amzn/synthetics-core → @aws/synthetics-core

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 22.x

 **syn-nodejs-4.1 的變更** 
+ `fast-xml-parser` 升級至 5.5.7 以解決下列 CVEs：
  + CVE-2026-25128
  + CVE-2026-25896
  + CVE-2026-26278
  + CVE-2026-27942
  + CVE-2026-33036

## Node.js 的先前執行時間版本
<a name="Previousversions-nodejs"></a>

仍然支援下列舊版的 Node.js 執行時間。

### syn-nodejs-4.0
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-4.0"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 22.x

 **syn-nodejs-4.0 的變更** 
+ 已套用安全性修補程式。

### syn-nodejs-3.1
<a name="CloudWatch_Synthetics_runtimeversion-syn-nodejs-3.1"></a>

**重要**  
從 Synthetics `syn-nodejs-3.1`和更新版本開始，Synthetics 執行時間會使用新的命名空間。請遷移 Canary 指令碼以使用新的命名空間。未來版本中將棄用舊版命名空間。  
@amzn/synthetics-core → @aws/synthetics-core

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 20.x

 **syn-nodejs-3.1 的變更** 
+ Synthetics 執行時間命名空間遷移。
+ 類型定義可在 [npm 登錄](https://www.npmjs.com/package/@aws/synthetics-core)檔中使用。請確定類型定義套件版本符合您 Canary 的執行時間版本。

### syn-nodejs-3.0
<a name="Synthetics_runtimeversion-syn-nodejs-3.0"></a>

**主要相依性**：
+ AWS Lambda 執行時間 Node.js 20.x

 **syn-nodejs-3.0 的變更** 
+ 支援多重檢查藍圖。

# 執行時間版本支援政策
<a name="CloudWatch_Synthetics_Runtime_Support_Policy"></a>

Synthetics 執行時間版本受維護和安全性更新所拘束。當不再支援執行時間版本的任何元件時，該 Synthetics 執行時間版本則將遭到取代。

您無法使用已取代的執行時間版本來建立 Canary。使用已取代執行時間的 Canary 將繼續執行。您可以停止、開始和刪除這些 Canary。您可以將 Canary 更新為使用支援的執行時間版本，藉此更新使用已取代的執行時間版本的現有 Canary。

如果您的 Canary 使用的執行時間預計將在接下來 60 天內被取代，CloudWatch Synthetics 會透過電子郵件通知您。我們建議您將 Canary 遷移至支援的執行時間版本，以便從更新版本中包含的新功能、安全性和效能增強功能受益。

## CloudWatch Synthetics 執行時期棄用日期
<a name="runtime_deprecation_dates"></a>

下表列出每個已棄用 CloudWatch Synthetics 執行時期的棄用日期。


| 執行時間版本 | 取代日期 | 
| --- | --- | 
|   `syn-python-selenium-5.1`   |  2026 年 2 月 3 日  | 
|   `syn-python-selenium-5.0`   |  2026 年 2 月 3 日  | 
|   `syn-python-selenium-4.1`   |  2026 年 2 月 3 日  | 
|   `syn-python-selenium-4.0`   |  2026 年 2 月 3 日  | 
|   `syn-nodejs-puppeteer-7.0`   |  2026 年 1 月 22 日  | 
|   `syn-nodejs-puppeteer-6.2`   |  2026 年 1 月 22 日  | 
|   `syn-nodejs-puppeteer-5.2`   |  2026 年 1 月 22 日  | 
|   `syn-python-selenium-3.0`   |  2026 年 1 月 22 日  | 
|   `syn-python-selenium-2.1`   |  2026 年 1 月 22 日  | 
|   `syn-nodejs-puppeteer-6.1`   |  2024 年 3 月 8 日  | 
|   `syn-nodejs-puppeteer-6.0`   |  2024 年 3 月 8 日  | 
|   `syn-nodejs-puppeteer-5.1`   |  2024 年 3 月 8 日  | 
|   `syn-nodejs-puppeteer-5.0`   |  2024 年 3 月 8 日  | 
|   `syn-nodejs-puppeteer-4.0`   |  2024 年 3 月 8 日  | 
|   `syn-nodejs-puppeteer-3.9`   |  2024 年 1 月 8 日  | 
|   `syn-nodejs-puppeteer-3.8`   |  2024 年 1 月 8 日  | 
|   `syn-python-selenium-2.0`   |  2024 年 3 月 8 日  | 
|   `syn-python-selenium-1.3`   |  2024 年 3 月 8 日  | 
|   `syn-python-selenium-1.2`   |  2024 年 3 月 8 日  | 
|   `syn-python-selenium-1.1`   |  2024 年 3 月 8 日  | 
|   `syn-python-selenium-1.0`   |  2024 年 3 月 8 日  | 
|   `syn-nodejs-puppeteer-3.7`   |  2024 年 1 月 8 日  | 
|   `syn-nodejs-puppeteer-3.6`   |  2024 年 1 月 8 日  | 
|   `syn-nodejs-puppeteer-3.5`   |  2024 年 1 月 8 日  | 
|   `syn-nodejs-puppeteer-3.4`   |  2022 年 11 月 13 日  | 
|   `syn-nodejs-puppeteer-3.3`   |  2022 年 11 月 13 日  | 
|   `syn-nodejs-puppeteer-3.2`   |  2022 年 11 月 13 日  | 
|   `syn-nodejs-puppeteer-3.1`   |  2022 年 11 月 13 日  | 
|   `syn-nodejs-puppeteer-3.0`   |  2022 年 11 月 13 日  | 
|   `syn-nodejs-2.2`   |  2021 年 5 月 28 日  | 
|   `syn-nodejs-2.1`   |  2021 年 5 月 28 日  | 
|   `syn-nodejs-2.0`   |  2021 年 5 月 28 日  | 
|   `syn-nodejs-2.0-beta`   |  2021 年 2 月 8 日  | 
|   `syn-1.0`   |  2021 年 5 月 28 日  | 

# 執行時間版本更新
<a name="CloudWatch_Synthetics_Runtime_Version_Update"></a>

您可以使用 CloudWatch 主控台、 AWS CLI 或 AWS SDK AWS CloudFormation來更新 Canary 的執行時間版本。當您使用 CloudWatch 主控台時，您可以在 Canary 清單頁面中選取它們，然後選擇**動作** 、**更新執行時間**，以一次更新最多五個 Canary。

您可以在遞交執行時間更新之前先測試更新，以驗證更新。更新執行時期版本時，請在 CloudWatch 主控台中選擇**開始模擬執行**或**稍後驗證並儲存**選項，以建立原始 Canary 的模擬執行，以及您對組態所做的任何變更。模擬執行將更新並執行 Canary，以驗證執行時期更新對 Canary 是否安全。一旦您使用新的執行時期版本驗證 Canary，即可更新 Canary 的執行時期版本。如需詳細資訊，請參閱[執行安全 Canary 更新](performing-safe-canary-upgrades.md)。

或者，您可以先使用 CloudWatch 主控台複製 Canary 並更新其執行時期版本，以驗證升級。這樣一來，會建立另一個 Canary，它就是原來的 Canary 的複製。一旦您使用新的執行時間版本驗證了您的 Canary，您可以更新原始 Canary 的執行時間版本並刪除複製的 Canary。

 您也可以使用升級指令碼更新多個 Canary。如需詳細資訊，請參閱[Canary 執行時間升級指令碼](#CloudWatch_Synthetics_Canaries_upgrade_script)。

如果您升級 Canary 但失敗了，請參閱 [對失敗的 Canary 進行故障診斷](CloudWatch_Synthetics_Canaries_Troubleshoot.md)。

## Canary 執行時間升級指令碼
<a name="CloudWatch_Synthetics_Canaries_upgrade_script"></a>

若要將 Canary 指令碼升級為支援的執行時間版本，請使用下列指令碼。

```
const AWS = require('aws-sdk');

// You need to configure your AWS credentials and Region.
//   https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html
//   https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-region.html

const synthetics = new AWS.Synthetics();

const DEFAULT_OPTIONS = {
  /**
   * The number of canaries to upgrade during a single run of this script.
   */
  count: 10,
  /**
   * No canaries are upgraded unless force is specified.
   */
  force: false
};

/**
 * The number of milliseconds to sleep between GetCanary calls when
 * verifying that an update succeeded.
 */
const SLEEP_TIME = 5000;

(async () => {
  try {
    const options = getOptions();

    const versions = await getRuntimeVersions();
    const canaries = await getAllCanaries();
    const upgrades = canaries
      .filter(canary => !versions.isLatestVersion(canary.RuntimeVersion))
      .map(canary => {
        return {
          Name: canary.Name,
          FromVersion: canary.RuntimeVersion,
          ToVersion: versions.getLatestVersion(canary.RuntimeVersion)
        };
      });

    if (options.force) {
      const promises = [];

      for (const upgrade of upgrades.slice(0, options.count)) {
        const promise = upgradeCanary(upgrade);
        promises.push(promise);
        // Sleep for 100 milliseconds to avoid throttling.
        await usleep(100);
      }

      const succeeded = [];
      const failed = [];
      for (let i = 0; i < upgrades.slice(0, options.count).length; i++) {
        const upgrade = upgrades[i];
        const promise = promises[i];
        try {
          await promise;
          console.log(`The update of ${upgrade.Name} succeeded.`);
          succeeded.push(upgrade.Name);
        } catch (e) {
          console.log(`The update of ${upgrade.Name} failed with error: ${e}`);
          failed.push({
            Name: upgrade.Name,
            Reason: e
          });
        }
      }

      if (succeeded.length) {
        console.group('The following canaries were upgraded successfully.');
        for (const name of succeeded) {
          console.log(name);
        }
        console.groupEnd()
      } else {
        console.log('No canaries were upgraded successfully.');
      }

      if (failed.length) {
        console.group('The following canaries were not upgraded successfully.');
        for (const failure of failed) {
          console.log('\x1b[31m', `${failure.Name}: ${failure.Reason}`, '\x1b[0m');
        }
        console.groupEnd();
      }
    } else {
      console.log('Run with --force [--count <count>] to perform the first <count> upgrades shown. The default value of <count> is 10.')
      console.table(upgrades);
    }
  } catch (e) {
    console.error(e);
  }
})();

function getOptions() {
  const force = getFlag('--force', DEFAULT_OPTIONS.force);
  const count = getOption('--count', DEFAULT_OPTIONS.count);
  return { force, count };

  function getFlag(key, defaultValue) {
    return process.argv.includes(key) || defaultValue;
  }
  function getOption(key, defaultValue) {
    const index = process.argv.indexOf(key);
    if (index < 0) {
      return defaultValue;
    }
    const value = process.argv[index + 1];
    if (typeof value === 'undefined' || value.startsWith('-')) {
      throw `The ${key} option requires a value.`;
    }
    return value;
  }
}

function getAllCanaries() {
  return new Promise((resolve, reject) => {
    const canaries = [];

    synthetics.describeCanaries().eachPage((err, data) => {
      if (err) {
        reject(err);
      } else {
        if (data === null) {
          resolve(canaries);
        } else {
          canaries.push(...data.Canaries);
        }
      }
    });
  });
}

function getRuntimeVersions() {
  return new Promise((resolve, reject) => {
    const jsVersions = [];
    const pythonVersions = [];
    synthetics.describeRuntimeVersions().eachPage((err, data) => {
      if (err) {
        reject(err);
      } else {
        if (data === null) {
          jsVersions.sort((a, b) => a.ReleaseDate - b.ReleaseDate);
          pythonVersions.sort((a, b) => a.ReleaseDate - b.ReleaseDate);
          resolve({
            isLatestVersion(version) {
              const latest = this.getLatestVersion(version);
              return latest === version;
            },
            getLatestVersion(version) {
              if (jsVersions.some(v => v.VersionName === version)) {
                return jsVersions[jsVersions.length - 1].VersionName;
              } else if (pythonVersions.some(v => v.VersionName === version)) {
                return pythonVersions[pythonVersions.length - 1].VersionName;
              } else {
                throw Error(`Unknown version ${version}`);
              }
            }
          });
        } else {
          for (const version of data.RuntimeVersions) {
            if (version.VersionName === 'syn-1.0') {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-nodejs-2.')) {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-nodejs-puppeteer-')) {
              jsVersions.push(version);
            } else if (version.VersionName.startsWith('syn-python-selenium-')) {
              pythonVersions.push(version);
            } else {
              throw Error(`Unknown version ${version.VersionName}`);
            }
          }
        }
      }
    });
  });
}

async function upgradeCanary(upgrade) {
  console.log(`Upgrading canary ${upgrade.Name} from ${upgrade.FromVersion} to ${upgrade.ToVersion}`);
  await synthetics.updateCanary({ Name: upgrade.Name, RuntimeVersion: upgrade.ToVersion }).promise();
  while (true) {
    await usleep(SLEEP_TIME);
    console.log(`Getting the state of canary ${upgrade.Name}`);
    const response = await synthetics.getCanary({ Name: upgrade.Name }).promise();
    const state = response.Canary.Status.State;
    console.log(`The state of canary ${upgrade.Name} is ${state}`);
    if (state === 'ERROR' || response.Canary.Status.StateReason) {
      throw response.Canary.Status.StateReason;
    }
    if (state !== 'UPDATING') {
      return;
    }
  }
}

function usleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
```

# 撰寫 Canary 指令碼
<a name="CloudWatch_Synthetics_Canaries_WritingCanary"></a>

下列各節說明如何撰寫 Canary 指令碼，以及如何將 Canary 與其他 AWS 服務以及外部相依性和程式庫整合。

**Topics**
+ [使用 Java 執行時期撰寫 Canary 指令碼](Synthetics_WritingCanary_Java.md)
+ [使用 Playwright 執行時期撰寫 Node.js Canary 指令碼](Synthetics_WritingCanary_Nodejs_Playwright.md)
+ [使用 Puppeteer 執行時期撰寫 Node.js Canary 指令碼](CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup.md)
+ [撰寫 Python Canary 指令碼](CloudWatch_Synthetics_Canaries_WritingCanary_Python.md)
+ [撰寫 Node.js 多重檢查藍圖的 JSON 組態](CloudWatch_Synthetics_WritingCanary_Multichecks.md)

# 使用 Java 執行時期撰寫 Canary 指令碼
<a name="Synthetics_WritingCanary_Java"></a>

**Topics**
+ [Canary 的 Java 專案結構](#Synthetics_canary_Java_package)
+ [封裝 Canary 的專案](#Synthetics_canary_Java_package_canary)
+ [處理常式名稱](#Synthetics_canary_Java_handler)
+ [CloudWatch Synthetics 組態](#Synthetics_canary_Java_config)
+ [CloudWatch Synthetics 環境變數](#Synthetics_canary_Java_variables)

## Canary 的 Java 專案結構
<a name="Synthetics_canary_Java_package"></a>

若要在 Java 中建立 Canary，需要撰寫程式碼、編譯程式碼，然後將編譯的成品部署到 Synthetics。可以透過各種方式初始化 Java Lambda 專案。舉例來說，您可以在偏好的 IDE 中使用標準 Java 專案設定，例如 IntelliJ IDEA 或 Visual Studio Code。或者，您可以手動建立所需的檔案結構。

Synthetics Java 專案包含下列一般結構：

```
/project-root
    └ src
        └ main
            └ java
                └ canarypackage // name of package
                |    └ ExampleCanary.java // Canary code file
                |    └ other_supporting_classes
                - resources
                     └ synthetics.json // Synthetics configuration file    
     └ build.gradle OR pom.xml
```

可以使用 Maven 或 Gradle 建置專案並管理相依項。

在上述結構中，`ExampleCanary` 類別是 Canary 的進入點或處理常式。

 **Java Canary 類別範例** 

此範例可讓 Canary 對存放在 *TESTING\$1URL* Lambda 環境變數中的 URL 提出取得請求。Canary 不會使用 Synthetics 執行時期提供的任何方法。

```
package canarypackage;

import java.net.HttpURLConnection;
import java.net.URL;

// Handler value: canary.ExampleCanary::canaryCode
public class ExampleCanary { 
  public void canaryCode() throws Exception{ 
      URL url = new URL(System.getenv("TESTING_URL"));
      HttpURLConnection con=(HttpURLConnection)url.openConnection();
      con.setRequestMethod("GET");
      con.setConnectTimeout(5000);
      con.setReadTimeout(5000);
      int status=con.getResponseCode();
      if(status!=200){
        throw new Exception("Failed to load " + url + ", status code: " + status);
      }
  }
}
```

強烈建議您使用 Synthetics 提供的程式庫函式 `executeStep` 模組化您的 Canary。Canary 會向從環境變數 URL1 和 URL2 取得的兩個獨立 URL 發起 `get` 呼叫。

**注意**  
若要使用 `executeStep` 功能，Canary 的處理常式方法應採用 Synthetics 類型的參數，如下所示。

```
package canarypackage;

import com.amazonaws.synthetics.Synthetics;
import java.net.HttpURLConnection;
import java.net.URL;

// Handler value: canary.ExampleCanary::canaryCode
public class ExampleCanary {
  public void canaryCode(Synthetics synthetics) throws Exception {
    createStep("Step1", synthetics, System.getenv("URL1"));
    createStep("Step2", synthetics, System.getenv("URL2"));
    return;
  }
  
  private void createStep(String stepName, Synthetics synthetics, String url) throws Exception{
    synthetics.executeStep(stepName,()->{
      URL obj=new URL(url);
      HttpURLConnection con=(HttpURLConnection)obj.openConnection();
      con.setRequestMethod("GET");
      con.setConnectTimeout(5000);
      con.setReadTimeout(5000);
      int status=con.getResponseCode();
      if(status!=200){
        throw new Exception("Failed to load" + url + "status code:" + status);
      }
      return null;
    }).get();
  }
}
```

## 封裝 Canary 的專案
<a name="Synthetics_canary_Java_package_canary"></a>

Synthetics 接受 *zip* 格式的 Java Canary 程式碼。zip 包含 Canary 程式碼的類別檔案、任何第三方相依項的 jar 以及 Synthetics 設定檔。

Synthetics Java zip 包含下列一般結構。

```
example-canary
    └ lib
    |  └ //third party dependency jars
       └ java-canary.jar
    └ synthetics.json
```

若要從上述專案結構建置此 zip，可以使用 gradle (build.gradle) 或 maven (pom.xml)。請見此處範例。

如需有關編譯 Synthetics 程式庫的時間相依性或界面的資訊，請參閱 [ aws-cloudwatch-synthetics-sdk-java ](https://github.com/aws/aws-cloudwatch-synthetics-sdk-java/tree/main)下的 README。

```
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    // Third party dependencies 
    // example: implementation 'software.amazon.awssdk:s3:2.31.9'
    
    // Declares dependency on Synthetics interfaces for compiling only
    // Refer https://github.com/aws/aws-cloudwatch-synthetics-sdk-java for building from source.
    compileOnly 'software.amazon.synthetics:aws-cloudwatch-synthetics-sdk-java:1.0.0'}

test {
    useJUnitPlatform()
}

// Build the zip to be used as Canary code.
task buildZip(type: Zip) {

    archiveFileName.set("example-canary.zip")
    destinationDirectory.set(file("$buildDir"))
    
    from processResources
    into('lib') {
        from configurations.runtimeClasspath
        from(tasks.named("jar"))
    }
    from "src/main/java/resources/synthetics.json"
    
    doLast {
        println "Artifact written to: ${archiveFile.get().asFile.absolutePath}"
    }
}

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

tasks.named("build") {
    dependsOn "buildZip"
}
```

## 處理常式名稱
<a name="Synthetics_canary_Java_handler"></a>

處理常式名稱是 Canary 的進入點。對於 Java 執行時期，處理常式的格式如下。

```
<<full qualified name for canary class>>::<<name of the method to start the execution from>>
// for above code: canarypackage.ExampleCanary::canaryCode
```

## CloudWatch Synthetics 組態
<a name="Synthetics_canary_Java_config"></a>

您可以提供名為 `synthetics.json` 的選用 JSON 設定檔，設定 Synthetics Java 執行時期的行為。此檔案應該封裝在套件 zip 的根目錄中。雖然設定檔是選用的，但如果您未提供設定檔，或者設定金鑰缺失，CloudWatch 會使用預設值。

以下是支援的組態值及其預設值。

```
{
    "step": {
        "stepSuccessMetric": true,
        "stepDurationMetric": true,
        "continueOnStepFailure": false,
        "stepsReport": true
    },
    "logging": {
        "logRequest": false,
        "logResponse": false
    },
    "httpMetrics": {
        "metric_2xx": true,
        "metric_4xx": true,
        "metric_5xx": true,
        "aggregated2xxMetric": true,
        "aggregated4xxMetric": true,
        "aggregated5xxMetric": true
    },
    "canaryMetrics": {
        "failedCanaryMetric": true,
        "aggregatedFailedCanaryMetric": true
    }
}
```

 **步驟組態** 
+ *continueOnStepFailure*：確定指令碼是否應在步驟失敗後繼續。預設值為 false。
+ *stepSuccessMetric*：確定是否發出步驟的 ` SuccessPercent` 指標。如果步驟成功，步驟的`SuccessPercent`指標為 *100*，如果步驟失敗，則為 * 0*。預設值為 *true*。
+ *stepDurationMetric* – 判斷是否發出步驟的*持續時間*指標。*持續時間*指標以步驟執行的持續時間發出，以毫秒為單位。預設值為 * true*。

 **記錄組態** 

適用於 CloudWatch Synthetics 產生的日誌。控制請求和回應日誌的詳盡程度。
+ *logRequest*：指定是否要在 Canary 日誌中記錄每個請求。預設值為 false。
+ *logResponse*：指定是否要在 Canary 日誌中記錄每個回應。預設值為 false。

 **HTTP 指標組態** 

與具有不同 HTTP 狀態碼之網路請求計數相關的指標組態，由 CloudWatch Synthetics 針對此 Canary 發出。
+ *metric\$12xx* – 指定是否要為此 Canary 發出 * 2xx* 指標 （使用 CanaryName 維度）。預設值為 *true*。
+ *metric\$14xx* – 指定是否要為此 Canary 發出 * 4xx* 指標 （使用 CanaryName 維度）。預設值為 *true*。
+ *metric\$15xx* – 指定是否要為此 Canary 發出 * 5xx* 指標 （使用 CanaryName 維度）。預設值為 *true*。
+ *aggregated2xxMetric* – 指定是否要為此 Canary 發出 * 2xx* 指標 （不含 CanaryName 維度）。預設值為 *true*。
+ *aggregated4xxMetric* – 指定是否要為此 Canary 發出 * 4xx* 指標 （不含 CanaryName 維度）。預設值為 *true*。
+ *aggregated5xxMetric* – 指定是否要為此 Canary 發出 * 5xx* 指標 （不含 CanaryName 維度）。預設值為 *true*。

 **Canary 指標組態** 

CloudWatch Synthetics 發出之其他指標的組態。
+ *failedCanaryMetric* Network Access Analyzer 指定是否要為此 Canary 發出*失敗*指標 （使用 CanaryName 維度）。預設值為 *true*。
+ *aggregatedFailedCanaryMetric*：指定是否要為此 Canary 發出*失敗*指標 (不含 CanaryName 維度)。預設值為 *true*。

## CloudWatch Synthetics 環境變數
<a name="Synthetics_canary_Java_variables"></a>

您可以使用環境變數來設定記錄層級和格式。

 **日誌格式** 

CloudWatch Synthetics Java 執行時期會為每個 Canary 執行建立 CloudWatch 日誌。日誌以 JSON 格式撰寫，方便查詢。或者，您可以將日誌格式變更為 *TEXT*。
+ *環境變數名稱* – CW\$1SYNTHETICS\$1LOG\$1FORMAT
+ *支援的值* – JSON、TEXT
+ *預設值* – JSON

 **日誌層級** 
+ *環境變數名稱* – CW\$1SYNTHETICS\$1LOG\$1LEVEL
+ *支援的值* – TRACE、DEBUG、INFO、WARN、ERROR、FATAL
+ *預設值* – INFO

除了上述環境變數之外，還會為 Java 執行時期新增預設環境變數、將 `AWS_LAMBDA-EXEC_WRAPPER` 環境變數新增至函式，並將其值設定為 `/opt/synthetics-otel-instrument`。此環境變數會修改函式的啟動行為以進行遙測。如果此環境變數已存在，請確定已將其設定為所需的值。

# 使用 Playwright 執行時期撰寫 Node.js Canary 指令碼
<a name="Synthetics_WritingCanary_Nodejs_Playwright"></a>

**Topics**
+ [為 Playwright 執行時期封裝 Node.js Canary 檔案](#Synthetics_canary_Nodejs_Playwright_package)
+ [變更現有 Playwright 指令碼以用作 CloudWatch Synthetics Canary](#CloudWatch_Synthetics_canary_edit_Playwright_script)
+ [CloudWatch Synthetics 組態](#Synthetics_canary_configure_Playwright_script)

## 為 Playwright 執行時期封裝 Node.js Canary 檔案
<a name="Synthetics_canary_Nodejs_Playwright_package"></a>

 Canary 指令碼由 `.js` (CommonJS 語法) 或 `.mjs`(ES 語法) 檔案組成，其中包含您的 Synthetics 處理常式程式碼，以及程式碼所依賴的任何其他套件和模組。以 ES (ECMAScript) 格式建立的指令碼應使用 .mjs 作為副檔名，或包含具有「類型」：「模組」欄位集的 package.json 檔案。與 Node.js Puppeteer 等其他執行時期不同，您不需要將指令碼儲存在特定的資料夾結構中。可以直接封裝指令碼。使用您慣用的 `zip` 公用程式建立 `.zip` 檔案，並將處理常式檔案放在根目錄下。如果您的 Canary 指令碼仰賴 Synthetics 執行時期中未包含的其他套件或模組，可以將這些相依項新增至 `.zip` 檔案。為此，可以執行 `npm install` 命令，在 `node_modules` 目錄中安裝函式所需的程式庫。下列 CLI 命令範例會建立名為 `my_deployment_package.zip` 的 `.zip` 檔案，其中包含 `index.js` 或 `index.mjs` 檔案 (Synthetics 處理常式) 及其相依項。在此範例中，可以使用 `npm` 套件管理工具來安裝相依項。

```
~/my_function
├── index.mjs
├── synthetics.json
├── myhelper-util.mjs    
└── node_modules
    ├── mydependency
```

在根目錄建立包含專案資料夾內容的 `.zip` 檔案。使用 `r` (遞迴) 選項，如下列範例所示，以確保 `zip` 壓縮子資料夾。

```
zip -r my_deployment_package.zip .
```

新增 Synthetics 設定檔來設定 CloudWatch Synthetics 的行為。您可以建立 `synthetics.json` 檔案，並將其儲存在與進入點或處理常式檔案相同的路徑。

或者，也可以將進入點檔案儲存在您選擇的資料夾結構中。不過，請確定已在處理常式名稱中指定資料夾路徑。

 **處理常式名稱** 

請務必將 Canary 的指令碼進入點 (處理常式) 設定為 ` myCanaryFilename.functionName`，以符合指令碼進入點的檔案名稱。可以選擇將 Canary 儲存在單獨的資料夾 (例如 ` myFolder/my_canary_filename.mjs`) 中。如果將其存放在單獨的資料夾中，請在指令碼進入點中指定該路徑，例如 ` myFolder/my_canary_filename.functionName`。

## 變更現有 Playwright 指令碼以用作 CloudWatch Synthetics Canary
<a name="CloudWatch_Synthetics_canary_edit_Playwright_script"></a>

可以編輯 Node.js 和 Playwright 的現有指令碼，以用作 Canary。如需 Playwright 的詳細資訊，請參閱 [Playwright 程式庫](https://playwright.dev/docs/api/class-playwright)文件。

可以使用儲存在檔案 ` exampleCanary.mjs` 中的下列 Playwright 指令碼。

```
import { chromium } from 'playwright';
import { expect } from '@playwright/test';

const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com', {timeout: 30000});
await page.screenshot({path: 'example-home.png'});

const title = await page.title();
expect(title).toEqual("Example Domain");
 
await browser.close();
```

執行下列步驟來轉換指令碼：

1. 建立和匯出 `handler` 函數。處理常式是指令碼的進入點函數。您可以為處理常式函式選擇任何名稱，但指令碼中使用的函式應該與 Canary 處理常式中的函式相同。如果您的指令碼名稱為 `exampleCanary.mjs`，且處理常式函式名稱為 `myhandler`，則您的 Canary 處理常式會命名為 `exampleCanary.myhandler`。在下列範例中，處理常式函式名稱為 `handler`。

   ```
   exports.handler = async () => {
     // Your script here
     };
   ```

1. 將 `Synthetics Playwright module` 作為相依項匯入。

   ```
   import { synthetics } from '@aws/synthetics-playwright';
   ```

1. 使用 Synthetics `Launch` 函式啟動瀏覽器。

   ```
   const browser = await synthetics.launch();
   ```

1. 使用 Synthetics `newPage` 函式建立新的 Playwright 頁面。

   ```
   const page = await synthetics.newPage();
   ```

指令碼現在已準備好作為 Synthetics Canary 執行。以下是更新的指令碼：

 **已更新 ES6 格式的指令碼** 

以 `.mjs` 副檔名儲存的指令碼檔案。

```
import { synthetics } from '@aws/synthetics-playwright';
import { expect } from '@playwright/test';

export const handler = async (event, context) => {
  try {
        // Launch a browser
        const browser = await synthetics.launch();
        
        // Create a new page
        const page = await synthetics.newPage(browser);
        
        // Navigate to a website
        await page.goto('https://www.example.com', {timeout: 30000});
        
        // Take screenshot
        await page.screenshot({ path: '/tmp/example.png' });
        
        // Verify the page title
        const title = await page.title();
        expect(title).toEqual("Example Domain");
    } finally {
        // Ensure browser is closed
        await synthetics.close();
    }
};
```

 **已更新 CommonJS 格式的指令碼** 

以 `.js` 副檔名儲存的指令碼檔案。

```
const { synthetics } = require('@aws/synthetics-playwright');
const { expect } = require('@playwright/test');

exports.handler = async (event) => {
  try {
    const browser = await synthetics.launch();
    const page = await synthetics.newPage(browser);
    await page.goto('https://www.example.com', {timeout: 30000});
    await page.screenshot({ path: '/tmp/example.png' });
    const title = await page.title();
    expect(title).toEqual("Example Domain");
  } finally {
    await synthetics.close();
  }
};
```

## CloudWatch Synthetics 組態
<a name="Synthetics_canary_configure_Playwright_script"></a>

您可以提供名為 `synthetics.json` 的選用 JSON 設定檔，設定 Synthetics Playwright 執行時期的行為。此檔案應封裝在與處理常式檔案相同的位置。雖然設定檔是選用的，但如果您未提供設定檔，或者設定金鑰缺失，CloudWatch 會使用預設值。

 **封裝您的設定檔** 

以下是支援的組態值及其預設值。

```
{
    "step": {
        "screenshotOnStepStart": false,
        "screenshotOnStepSuccess": false,
        "screenshotOnStepFailure": false,
        "stepSuccessMetric": true,
        "stepDurationMetric": true,
        "continueOnStepFailure": true,
        "stepsReport": true
    },
    "report": {
        "includeRequestHeaders": true,
        "includeResponseHeaders": true,
        "includeUrlPassword": false,
        "includeRequestBody": true,
        "includeResponseBody": true,
        "restrictedHeaders": ['x-amz-security-token', 'Authorization'], // Value of these headers is redacted from logs and reports
        "restrictedUrlParameters": ['Session', 'SigninToken'] // Values of these url parameters are redacted from logs and reports
    },
    "logging": {
        "logRequest": false,
        "logResponse": false,
        "logResponseBody": false,
        "logRequestBody": false,
        "logRequestHeaders": false,
        "logResponseHeaders": false
    },
    "httpMetrics": {
        "metric_2xx": true,
        "metric_4xx": true,
        "metric_5xx": true,
        "failedRequestsMetric": true,
        "aggregatedFailedRequestsMetric": true,
        "aggregated2xxMetric": true,
        "aggregated4xxMetric": true,
        "aggregated5xxMetric": true
    },
    "canaryMetrics": {
        "failedCanaryMetric": true,
        "aggregatedFailedCanaryMetric": true
    },
    "userAgent": "",
    "har": true
}
```

 **步驟組態** 
+ `screenshotOnStepStart` – 確定 Synthetics 是否應在步驟開始前擷取螢幕畫面。預設值為 `true`。
+ `screenshotOnStepSuccess` – 確定 Synthetics 是否應在步驟成功後擷取螢幕畫面。預設值為 `true`。
+ `screenshotOnStepFailure` – 確定 Synthetics 是否應在步驟失敗後擷取螢幕畫面。預設值為 `true`。
+ `continueOnStepFailure` – 確定指令碼是否應在步驟失敗後繼續。預設值為 `false`。
+ `stepSuccessMetric` – 確定步驟的 ` SuccessPercent` 指標是否已發出。對於 Canary 執行，如果步驟成功，該步驟的 `SuccessPercent` 指標為 `100`；如果步驟失敗，則指標為 `0`。預設值為 `true`。
+ `stepDurationMetric` – 確定步驟的 `Duration` 指標是否已發出。`Duration` 指標以步驟執行的持續時間發出，以毫秒為單位。預設值為 `true`。

 **報告組態** 

包括 CloudWatch Synthetics 產生的所有報告，例如 HAR 檔案和 Synthetics 步驟報告。敏感資料修訂欄位 `restrictedHeaders` 和 `restrictedUrlParameters` 也適用於 Synthetics 產生的日誌。
+ `includeRequestHeaders` – 是否要在報告中包含請求標頭。預設值為 `false`。
+ `includeResponseHeaders` – 是否要在報告中包含回應標頭。預設值為 `false`。
+ `includeUrlPassword` – 是否要包含在 URL 中顯示的密碼。依預設，URL 中顯示的密碼會從日誌和報告進行修訂，以防止揭露敏感資料。預設值為 `false`。
+ `includeRequestBody` – 是否要在報告中包含請求內文。預設值為 `false`。
+ `includeResponseBody` – 是否要在報告中包含回應內文。預設值為 `false`。
+ `restrictedHeaders` – 如果包含標頭，則要忽略的標頭值清單。這適用於請求和回應標頭。例如，可以透過將 `includeRequestHeaders` 傳遞為 true，將 `restrictedHeaders` 傳遞為 `['Authorization']` 來隱藏憑證。
+ `restrictedUrlParameters` – 要修訂的 URL 路徑或查詢參數清單。這適用於出現在日誌、報告和錯誤中的 URL。參數區分大小寫。您可以將星號 (`*`) 傳遞為數值，以修訂所有 URL 路徑和查詢參數值。預設為空陣列。
+ `har` – 確定是否應產生 HTTP 封存 (HAR)。預設值為 `true`。

以下是報告設定檔範例。

```
"includeRequestHeaders": true,
"includeResponseHeaders": true,
"includeUrlPassword": false,
"includeRequestBody": true,
"includeResponseBody": true,
"restrictedHeaders": ['x-amz-security-token', 'Authorization'], // Value of these headers is redacted from logs and reports
"restrictedUrlParameters": ['Session', 'SigninToken'] // Values of these URL parameters are redacted from logs and reports
```

 **記錄組態** 

適用於 CloudWatch Synthetics 產生的日誌。控制請求和回應日誌的詳盡程度。
+ `logRequest` – 是否要在 Canary 日誌中記錄每個請求。對於 UI Canary，這會記錄瀏覽器傳送的每個請求。預設值為 ` false`。
+ `logResponse` – 是否要在 Canary 日誌中記錄每個回應。對於 UI Canary，這會記錄瀏覽器收到的每個回應。預設值為 ` false`。
+ `logRequestBody` – 是否要在 Canary 日誌中記錄請求內文及請求。此組態僅在 `logRequest` 為 true 時適用。預設值為 `false`。
+ `logResponseBody` – 是否要在 Canary 日誌中記錄回應內文及請求。此組態僅在 `logResponse` 為 true 時適用。預設值為 `false`。
+ `logRequestHeaders` – 是否要在 Canary 日誌中記錄請求標頭及請求。此組態僅在 ` logRequest` 為 true 時適用。預設值為 `false`。
+ `logResponseHeaders` – 是否要在 Canary 日誌中記錄回應標頭及回應。此組態僅在 ` logResponse` 為 true 時適用。預設值為 `false`。

 **HTTP 指標組態** 

與具有不同 HTTP 狀態碼之網路請求計數相關的指標組態，由 CloudWatch Synthetics 針對此 Canary 發出。
+ `metric_2xx` – 是否為此 Canary 發出 `2xx` 指標 (包含 `CanaryName` 維度)。預設值為 ` true`。
+ `metric_4xx` – 是否為此 Canary 發出 `4xx` 指標 (包含 `CanaryName` 維度)。預設值為 ` true`。
+ `metric_5xx` – 是否為此 Canary 發出 `5xx` 指標 (包含 `CanaryName` 維度)。預設值為 ` true`。
+ `failedRequestsMetric` – 是否為此 Canary 發出 ` failedRequests` 指標 (包含 `CanaryName` 維度)。預設值為 `true`。
+ `aggregatedFailedRequestsMetric` – 是否為此 Canary 發出 ` failedRequests` 指標 (不含 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated2xxMetric` – 是否為此 Canary 發出 `2xx` 指標 (不含 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated4xxMetric` – 是否為此 Canary 發出 `4xx` 指標 (不含 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated5xxMetric` – 是否為此 Canary 發出 `5xx` 指標 (不含 `CanaryName` 維度)。預設值為 `true`。

 **Canary 指標組態** 

CloudWatch Synthetics 發出之其他指標的組態。
+ `failedCanaryMetric` – 是否為此 Canary 發出 `Failed` 指標 (包含 `CanaryName` 維度)。預設值為 ` true`。
+ `aggregatedFailedCanaryMetric` – 是否為此 Canary 發出 ` Failed` 指標 (不含 `CanaryName` 維度)。預設值為 `true`。

 **其他組態** 
+ `userAgent` – 要附加至使用者代理程式的字串。使用者代理程式是包含在請求標頭中的字串，用於在您使用無周邊瀏覽器造訪網站時，識別您的瀏覽器。CloudWatch Synthetics 會自動新增 `CloudWatchSynthetics/canary-arn to the user agent`。指定的組態會附加到產生的使用者代理程式。預設使用者代理程式值為空白字串 (`""`)。

### CloudWatch Synthetics 環境變數
<a name="Synthetics_canary_Nodejs_Playwright_script"></a>

使用環境變數設定記錄層級和格式。

 **日誌格式** 

CloudWatch Synthetics Playwright 執行時期會為每個 Canary 執行建立 CloudWatch 日誌。日誌以 JSON 格式撰寫，方便查詢。或者，您可以將日誌格式變更為 `TEXT`。
+ `Environment variable name` – CW\$1SYNTHETICS\$1LOG\$1FORMAT 
+ `Supported values` – JSON、TEXT 
+ `Default` – JSON 

 **日誌層級** 

雖然啟用 `Debug` 模式會提升詳盡程度，但對於疑難排解很有用。
+ `Environment variable name` – CW\$1SYNTHETICS\$1LOG\$1LEVEL
+ `Supported values` – TRACE、DEBUG、INFO、WARN、ERROR、FATAL 
+ `Default` – INFO

# 使用 Puppeteer 執行時期撰寫 Node.js Canary 指令碼
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs_Pup"></a>

**Topics**
+ [從頭開始建立 CloudWatch Synthetics Canary](#CloudWatch_Synthetics_Canaries_write_from_scratch)
+ [封裝 Node.js Canary 檔案](#CloudWatch_Synthetics_Canaries_package)
+ [變更現有的 Puppeteer 指令碼以作為 Synthetics Canary 使用](#CloudWatch_Synthetics_Canaries_modify_puppeteer_script)
+ [環境變數](#CloudWatch_Synthetics_Environment_Variables)
+ [將您的 Canary 與其他 AWS 服務整合](#CloudWatch_Synthetics_Canaries_AWS_integrate)
+ [強制您的 Canary 使用靜態 IP 地址](#CloudWatch_Synthetics_Canaries_staticIP)

## 從頭開始建立 CloudWatch Synthetics Canary
<a name="CloudWatch_Synthetics_Canaries_write_from_scratch"></a>

下面是基本 Synthetics Canary 指令碼的範例。此指令碼作為成功執行傳遞，並傳回一個字串。若想查看失敗的 Canary 看起來是什麼樣子，請將 `let fail = false;` 變更為 `let fail = true;`。

您必須定義 Canary 指令碼的進入點函數。若要檢視檔案如何上傳到指定為 Canary `ArtifactS3Location` 的 Amazon S3 位置，請在 `/tmp` 資料夾下建立這些檔案。所有 Canary 成品都應儲存在 `/tmp` 中，因為它是唯一可寫入的目錄。對於指令碼建立的任何螢幕擷取畫面或其他檔案，請確定螢幕擷取畫面路徑設定為 `/tmp`。Synthetics 會自動將 ` /tmp` 中的檔案上傳至 S3 儲存貯體。

```
/tmp/<name>
```

指令碼執行之後，通過/失敗狀態和持續時間指標會發布到 CloudWatch，且 `/tmp` 下的檔案會上傳到 S3 儲存貯體。

```
const basicCustomEntryPoint = async function () {

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

    // Throw to fail, return to succeed
    let fail = false;
    if (fail) {
        throw "Failed basicCanary check.";
    }

    return "Successfully completed basicCanary checks.";
};

exports.handler = async () => {
    return await basicCustomEntryPoint();
};
```

接下來，我們將展開指令碼以使用 Synthetics 記錄，並使用 AWS SDK 進行呼叫。為了示範，此指令碼會建立一個 Amazon DynamoDB 用戶端，並呼叫 DynamoDB listTables API。它會記錄對請求的回應，並根據請求是否成功，記錄通過或是失敗。

```
const log = require('@aws/synthetics-logger');
const AWS = require('aws-sdk');
// Require any dependencies that your script needs
// Bundle additional files and dependencies into a .zip file with folder structure
// nodejs/node_modules/additional files and folders

const basicCustomEntryPoint = async function () {

    log.info("Starting DynamoDB:listTables canary.");
    
    let dynamodb = new AWS.DynamoDB();
    var params = {};
    let request = await dynamodb.listTables(params);
    try {
        let response = await request.promise();
        log.info("listTables response: " + JSON.stringify(response));
    } catch (err) {
        log.error("listTables error: " + JSON.stringify(err), err.stack);
        throw err;
    }

    return "Successfully completed DynamoDB:listTables canary.";
};

exports.handler = async () => {
    return await basicCustomEntryPoint();
};
```

## 封裝 Node.js Canary 檔案
<a name="CloudWatch_Synthetics_Canaries_package"></a>

 **對於 syn-nodejs-puppeteer-11.0 及更高版本** 

 較新的版本仍然支援較舊的封裝結構 (適用於 syn-nodejs-puppeteer-10.0 及更高版本)。

使用以下選項之一建立指令碼：
+ .js 檔案 (CommonJS 語法)
+ .mjs 檔案 (ES 模組語法)

對於 ES 模組，請使用下列其中一個選項：
+ .js 檔案 (CommonJS 語法)
+ .mjs 檔案 (ES 模組語法)

套件結構定義如下：
+ 根層級處理常式檔案 (index.js/index.mjs)
+ 選用設定檔 (synthetics.json)
+ node\$1modules 中的其他相依項 (如有需要)

封裝結構範例：

```
  my_function/
├── index.mjs
├── synthetics.json
├── helper-utils.mjs
└── node_modules/
    └── dependencies
```

若要執行封裝，請依照以下步驟進行：

1. 安裝相依項 (如果有)。

   ```
   npm install
   ```

1. 建立 .zip 套件。

   ```
   zip -r my_deployment_package.zip
   ```

 **對於 syn-nodejs-puppeteer-11.0 及更低版本** 

使用 Amazon S3 時需遵循以下結構：

```
  nodejs/
└── node_modules/
    └── myCanaryFilename.js
```

 **若要在 syn-nodejs-puppeteer-3.4\$1 中新增選用的子資料夾支援：**

```
nodejs/
└── node_modules/
    └── myFolder/
        └── myCanaryFilename.js
```

**注意**  
組態中的處理常式路徑必須與您的檔案位置相符。

 **處理常式名稱** 

請務必將 Canary 的指令碼進入點 (處理常式) 設定為 ` myCanaryFilename.functionName`，以符合指令碼進入點的檔案名稱。如果您使用的執行時間早於 `syn-nodejs-puppeteer-3.4`，則 `functionName` 必須為 `handler`。如果您使用的是 ` syn-nodejs-puppeteer-3.4` 或更高版本，您可以選擇任何函數名稱作為處理常式。如果您使用的是 `syn-nodejs-puppeteer-3.4` 或更高版本，您還可以選擇將 Canary 存放在單獨的資料夾 (例如 ` nodejs/node_modules/myFolder/my_canary_filename`) 中。如果將其存放在單獨的資料夾中，請在指令碼進入點中指定該路徑，例如 ` myFolder/my_canary_filename.functionName`。

## 變更現有的 Puppeteer 指令碼以作為 Synthetics Canary 使用
<a name="CloudWatch_Synthetics_Canaries_modify_puppeteer_script"></a>

本節介紹如何採用 Puppeteer 指令碼和修改它們以作為 Synthetics Canary 指令碼執行。如需 Puppeteer 的詳細資訊，請參閱 [Puppeteer API v1.14.0](https://github.com/puppeteer/puppeteer/blob/v1.14.0/docs/api.md)。

我們將從這個 Puppeteer 指令碼範例開始：

```
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();
```

轉換步驟如下：
+ 建立和匯出 `handler` 函數。處理常式是指令碼的進入點函數。如果您使用的執行時間早於 ` syn-nodejs-puppeteer-3.4`，則處理常式函數必須命名為 `handler`。如果您使用的是 `syn-nodejs-puppeteer-3.4` 或更高版本，函數可以具有任何名稱，但其必須與指令碼中使用的名稱相同。另外，如果您使用的是 `syn-nodejs-puppeteer-3.4` 或更高版本，您可以將指令碼存放在任何資料夾下，並將該資料夾指定為處理常式名稱的一部分。

  ```
  const basicPuppeteerExample = async function () {};
  
  exports.handler = async () => {
      return await basicPuppeteerExample();
  };
  ```
+ 使用 `Synthetics` 相依性。

  ```
  var synthetics = require('@aws/synthetics-puppeteer');
  ```
+ 使用 `Synthetics.getPage` 函數來取得 Puppeteer `Page` 物件。

  ```
  const page = await synthetics.getPage();
  ```

  Synthetics.getPage 函數傳回的頁面物件具有 ** page.on** `request``response`和用於記錄` requestfailed`的事件。Synthetics 也會針對頁面上的請求和回應設定 HAR 檔案產生，並將 Canary ARN 新增至頁面上傳出請求的 user-agent 標頭。

指令碼現在已準備好作為 Synthetics Canary 執行。這是更新後的指令碼：

```
var synthetics = require('@aws/synthetics-puppeteer');  // Synthetics dependency

const basicPuppeteerExample = async function () {
    const page = await synthetics.getPage(); // Get instrumented page from Synthetics
    await page.goto('https://example.com');
    await page.screenshot({path: '/tmp/example.png'}); // Write screenshot to /tmp folder
};

exports.handler = async () => {  // Exported handler function 
    return await basicPuppeteerExample();
};
```

## 環境變數
<a name="CloudWatch_Synthetics_Environment_Variables"></a>

建立 Canary 時，您可以使用環境變數。這允許您編寫單一 Canary 指令碼，然後使用具有不同數值的指令碼來快速建立具有類似任務的多個 Canary。

例如，假設您的組織在軟體開發的不同階段擁有諸如 `prod`、` dev` 和 `pre-release` 之類的端點，並且您需要建立 Canary 來測試這些端點。您可以撰寫測試軟體的單一 Canary 指令碼，然後在建立三個 Canary 的每一個 Canary 時，為端點環境變數指定不同的數值。然後，當您建立 Canary 時，您可以指定要用於環境變數的指令碼和數值。

環境變數名稱可包含字母、數字和底線字元。其必須以字母開頭，且至少有兩個字元。環境變數的總大小不能超過 4 KB。您無法指定任何 Lambda 保留環境變數作為環境變數的名稱。如需有關保留環境變數的詳細資訊，請參閱[執行時間環境變數](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime)。

**重要**  
環境變數金鑰和值會使用 AWS 擁有 AWS KMS 的金鑰進行靜態加密。然而，環境變數在用戶端並未經過加密處理。請勿在其中存放敏感資訊。

以下範例指令碼使用了兩個環境變數。這個指令碼可用於檢查網頁是否可用的 Canary。它使用環境變數來參數化其檢查的 URL 和其使用的 CloudWatch Synthetics 日誌層級。

以下函數會將 `LogLevel` 設定為 ` LOG_LEVEL` 環境變數的數值。

```
 synthetics.setLogLevel(process.env.LOG_LEVEL);
```

此函數會將 `URL` 設定為 `URL` 環境變數的數值。

```
const URL = process.env.URL;
```

這是完整的指令碼。當您使用此指令碼建立 Canary 時，您可以指定要用於 `LOG_LEVEL` 和 `URL` 環境變數的數值。

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');

const pageLoadEnvironmentVariable = async function () {

    // Setting the log level (0-3)
    synthetics.setLogLevel(process.env.LOG_LEVEL);
    // INSERT URL here
    const URL = process.env.URL;

    let page = await synthetics.getPage();
    //You can customize the wait condition here. For instance,
    //using 'networkidle2' may be less restrictive.
    const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});
    if (!response) {
        throw "Failed to load page!";
    }
    //Wait for page to render.
    //Increase or decrease wait time based on endpoint being monitored.
    await page.waitFor(15000);
    await synthetics.takeScreenshot('loaded', 'loaded');
    let pageTitle = await page.title();
    log.info('Page title: ' + pageTitle);
    log.debug('Environment variable:' + process.env.URL);

    //If the response status code is not a 2xx success code
    if (response.status() < 200 || response.status() > 299) {
        throw "Failed to load page!";
    }
};

exports.handler = async () => {
    return await pageLoadEnvironmentVariable();
};
```

### 將環境變數傳遞給指令碼
<a name="CloudWatch_Synthetics_Canaries_pass_variables"></a>

若要在主控台中建立 Canary 時將環境變數傳遞至指令碼，請在主控台的 **Environment variables** (環境變數) 區段中指定環境變數的金鑰和數值。如需詳細資訊，請參閱[建立 Canary](CloudWatch_Synthetics_Canaries_Create.md)。

若要透過 API 或 傳遞環境變數 AWS CLI，請使用 `RunConfig`區段中的 ` EnvironmentVariables` 參數。以下是建立 Canary 的範例 AWS CLI 命令，該 Canary 使用兩個具有 `Environment`和 金鑰的環境變數`Region`。

```
aws synthetics create-canary --cli-input-json '{
   "Name":"nameofCanary",
   "ExecutionRoleArn":"roleArn",
   "ArtifactS3Location":"s3://amzn-s3-demo-bucket-123456789012-us-west-2",
   "Schedule":{
      "Expression":"rate(0 minute)",
      "DurationInSeconds":604800
   },
   "Code":{
      "S3Bucket": "canarycreation",
      "S3Key": "cwsyn-mycanaryheartbeat-12345678-d1bd-1234-abcd-123456789012-12345678-6a1f-47c3-b291-123456789012.zip",
      "Handler":"pageLoadBlueprint.handler"
   },
   "RunConfig": {
      "TimeoutInSeconds":60,
      "EnvironmentVariables": {
         "Environment":"Production",
         "Region": "us-west-1"
      }
   },
   "SuccessRetentionPeriodInDays":13,
   "FailureRetentionPeriodInDays":13,
   "RuntimeVersion":"syn-nodejs-2.0"
}'
```

## 將您的 Canary 與其他 AWS 服務整合
<a name="CloudWatch_Synthetics_Canaries_AWS_integrate"></a>

所有 Canary 都可以使用 AWS SDK 程式庫。您可以在撰寫 Canary 時使用此程式庫，將 Canary 與其他 AWS 服務整合。

要這麼做，您需要新增下面的程式碼到您的 Canary。對於這些範例， AWS Secrets Manager 用作 Canary 正在整合的服務。
+ 匯入 AWS SDK。

  ```
  const AWS = require('aws-sdk');
  ```
+ 為您整合 AWS 的服務建立用戶端。

  ```
  const secretsManager = new AWS.SecretsManager();
  ```
+ 使用用戶端對該服務進行 API 呼叫。

  ```
  var params = {
    SecretId: secretName
  };
  return await secretsManager.getSecretValue(params).promise();
  ```

下面的 Canary 指令碼程式碼片段示範了與 Secrets Manager 整合的詳細範例。

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');
 
const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();
 
const getSecrets = async (secretName) => {
    var params = {
        SecretId: secretName
    };
    return await secretsManager.getSecretValue(params).promise();
}
 
const secretsExample = async function () {
    let URL = "<URL>";
    let page = await synthetics.getPage();
    
    log.info(`Navigating to URL: ${URL}`);
    const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});
    
    // Fetch secrets
    let secrets = await getSecrets("secretname")
   
    /**
    * Use secrets to login. 
    *
    * Assuming secrets are stored in a JSON format like:
    * {
    *   "username": "<USERNAME>",
    *   "password": "<PASSWORD>"
    * }
    **/
    let secretsObj = JSON.parse(secrets.SecretString);
    await synthetics.executeStep('login', async function () {
        await page.type(">USERNAME-INPUT-SELECTOR<", secretsObj.username);
        await page.type(">PASSWORD-INPUT-SELECTOR<", secretsObj.password);
        
        await Promise.all([
          page.waitForNavigation({ timeout: 30000 }),
          await page.click(">SUBMIT-BUTTON-SELECTOR<")
        ]);
    });
   
    // Verify login was successful
    await synthetics.executeStep('verify', async function () {
        await page.waitForXPath(">SELECTOR<", { timeout: 30000 });
    });
};

exports.handler = async () => {
    return await secretsExample();
};
```

## 強制您的 Canary 使用靜態 IP 地址
<a name="CloudWatch_Synthetics_Canaries_staticIP"></a>

您可以設定 Canary，以便使用靜態 IP 地址。

**若要強制 Canary 使用靜態 IP 地址**

1. 建立新 VPC 如需詳細資訊，請參閱[使用 DNS 與您的 VPC 搭配](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。

1. 建立新的網際網路閘道。如需詳細資訊，請參閱[將網際網路閘道新增至您的 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#working-with-igw)。

1. 在您的新 VPC 內部建立一個公有子網路。

1. 將新的路由表新增到 VPC。

1. 在新的路由表中新增一個路由，而該路由從 `0.0.0.0/0` 移至網際網路閘道。

1. 將新的路由表與公有子網路建立關聯。

1. 建立彈性 IP 地址。如需詳細資訊，請參閱[彈性 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)。

1. 建立新的 NAT 閘道，並將其指派給公有子網路和彈性 IP 地址。

1. 在 VPC 內部建立私有子網路。

1. 將路由新增至 VPC 預設路由表，即從 `0.0.0.0/0` 移至 NAT 閘道

1. 建立 Canary。

# 撰寫 Python Canary 指令碼
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python"></a>

此指令碼作為成功執行傳遞，並傳回一個字串。若想查看失敗的 Canary 看起來是什麼樣子，請將 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 Canary 檔案
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_package"></a>

如果您有多個 .py 檔案，或者指令碼具有相依性，則可將其全部封裝到單一 ZIP 檔案中。如果您使用 `syn-python-selenium-1.1` 執行時間，ZIP 檔案在 `python` 資料夾中必須包含主要 Canary .py 檔案，例如 `python/my_canary_filename.py`。如果您使用的是 ` syn-python-selenium-1.1` 或更高版本，您可以選擇使用其他資料夾，例如 `python/myFolder/my_canary_filename.py`。

此 ZIP 檔案應包含所有必要的資料夾和檔案，但其他檔案不需要位於 `python` 資料夾中。

請務必將 Canary 的指令碼進入點設定為 ` my_canary_filename.functionName`，以符合指令碼進入點的檔案名稱和函數名稱。如果您使用的是 `syn-python-selenium-1.0` 執行時間，則 `functionName` 必須為 `handler`。如果您使用的是 ` syn-python-selenium-1.1` 或更高版本，此處理常式名稱限制就不適用，您還可以選擇將 Canary 存放在單獨的資料夾 (例如 ` python/myFolder/my_canary_filename.py`) 中。如果將其存放在單獨的資料夾中，請在指令碼進入點中指定該路徑，例如 ` myFolder/my_canary_filename.functionName`。

## 變更現有的 Selenium 指令碼以作為 Synthetics Canary 使用
<a name="CloudWatch_Synthetics_Canaries_WritingCanary_Python_Selenium"></a>

您可以快速修改 Python 和 Selenium 用作 Canary 的現有指令碼。如需 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 指令碼轉換可用作 Canary**

1. 將變更 `import` 陳述式，以使用來自 ` aws_synthetics` 模組的 Selenium：

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

   來自 `aws_synthetics` 的 Selenium 模組可確保 Canary 能發射指標和日誌，產生 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 Canary。這是更新後的指令碼：

`webdriver` 是 [ SyntheticsWebDriver](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Python.html#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver) 類別的執行個體，而 傳回的瀏覽器`webdriver.Chrome()`是 [ 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()
```

## 變更現有的 Puppeteer Synthetics 指令碼以驗證非標準憑證
<a name="Canaries_Non-Standard_Certificates"></a>

Synthetics Canary 的一個重要使用案例是您監控自己的端點。如果您想要監控尚未準備好處理外部流量的端點，此類監控有時意味著您可能未持有由可信第三方憑證授權機構簽署的有效憑證。

針對這種情況，有兩種可行的解決方案如下：
+ 若要驗證用戶端憑證，請參閱[如何使用 Amazon CloudWatch Synthetics 驗證身分驗證 – 第 2 部分](https://aws.amazon.com/blogs/mt/how-to-validate-authentication-using-amazon-cloudwatch-synthetics-part-2/)。
+ 若要驗證自我簽署憑證，請參閱[如何在 Amazon CloudWatch Synthetics 中使用自我簽署憑證驗證身分驗證](https://aws.amazon.com/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 應該能夠順利存取採用非標準憑證組態的網站。

# 撰寫 Node.js 多重檢查藍圖的 JSON 組態
<a name="CloudWatch_Synthetics_WritingCanary_Multichecks"></a>

Node.js 多重檢查藍圖可讓您建立 Canary，在單一 Canary 執行中執行多個驗證檢查。當您想要測試多個端點、驗證應用程式的不同層面，或依序執行一系列相關檢查時，此藍圖非常有用。

**Topics**
+ [根組態結構](#root-configuration-structure)
+ [全域設定](#global-settings)
+ [變數和資料管理](#variables-data-management)
+ [步驟定義](#step-definitions)
+ [檢查類型](#check-types)
+ [身分驗證方法](#authentication-methods)
+ [聲明和驗證](#assertions-validation)
+ [資料擷取](#data-extraction)

## 根組態結構
<a name="root-configuration-structure"></a>

根組態會定義進階 API 藍圖 Canary 的整體結構。


**結構描述屬性**  

| 屬性 | Type | 必要 | Description | 
| --- | --- | --- | --- | 
|  globalSettings  | 物件 | 否 | 套用至所有步驟的預設組態 | 
|  variables  | 物件 | 否 | 各步驟的可重複使用值 （上限為 10) | 
|  steps  | 物件 |  是  | 監控步驟的集合 (1-10 個步驟） | 

 **範例** 

```
{
  "globalSettings": {
    "stepTimeout": 30000,
    "userAgent": "CloudWatch-Synthetics-Advanced/1.0"
  },
  "variables": {
    "baseUrl": "https://api.example.com",
    "apiVersion": "v1"
  },
  "steps": {
    "1": {
      "stepName": "healthCheck",
      "checkerType": "HTTP",
      "url": "${baseUrl}/health",
      "httpMethod": "GET"
    }
  }
}
```

 **驗證規則** 
+ 必須至少包含一個步驟
+ 允許最多 10 個步驟
+ 不允許超過 `globalSettings`、 ` variables`和 的其他屬性 `steps`

## 全域設定
<a name="global-settings"></a>

除非在步驟層級覆寫，否則全域設定會提供適用於所有步驟的預設組態。

 **屬性** 


**全域設定屬性**  

| 屬性 | Type | 預設 | 範圍 | Description | 
| --- | --- | --- | --- | --- | 
|  stepTimeout  | integer | 30000 | 5000-300000 | 所有步驟的預設逾時 （毫秒） | 

 **範例** 

```
{
  "globalSettings": {
    "stepTimeout": 60000,
            
  }
}
```

## 變數和資料管理
<a name="variables-data-management"></a>

變數可讓您定義可重複使用的值，這些值可以使用`${variableName}`語法在整個組態中參考。

 **變數屬性** 


| 屬性 | Type | 說明 | 
| --- | --- | --- | 
| 變數名稱 | string | 必須符合模式 ^[a-zA-Z][a-zA-Z0-9\$1]\$1\$1 | 
| 變數值 | string | 任何字串值 | 

 **限制** 
+ 每個組態最多 10 個變數
+ 變數名稱必須以字母開頭
+ 變數名稱只能包含字母、數字和底線
+ 結構描述中未指定的長度上限

 **範例** 

```
{
  "variables": {
    "baseUrl": "https://api.example.com",
    "apiKey": "${AWS_SECRET:my-api-key}",
    "timeout": "30000",
    "userEmail": "test@example.com"
  }
}
```

 **組態用量** 

```
{
  "steps": {
    "1": {
      "url": "${baseUrl}/users",
      "timeout": "${timeout}",
      "headers": {
        "Authorization": "Bearer ${apiKey}"
      }
    }
  }
}
```

## 步驟定義
<a name="step-definitions"></a>

步驟定義個別監控操作。每個步驟的編號從 1 到 10，並包含特定類型的檢查。

 *常見步驟屬性* 


| 屬性 | Type | 必要 | 描述 | 
| --- | --- | --- | --- | 
|  stepName  | string |  是  | 步驟的唯一識別符 | 
|  checkerType  | string |  是  | 檢查類型：HTTP、DNS、SSL、  TCP | 
|  extractors  | 陣列 | 否 | 資料擷取組態 | 

 *步驟名稱驗證* 
+ 模式 - ^【a-zA-Z】【a-zA-Z0-9\$1-】\$1\$1
+ 長度上限 - 64 個字元
+ 必須以字母開頭

 *步驟編號* 
+ 步驟編號為字串索引鍵："1"、"2"、...、"10"
+ 模式：^(【1-9】\$110)\$1
+ 至少需要 1 個步驟
+ 允許最多 10 個步驟

 *範例* 

```
{
  "steps": {
    "1": {
      "stepName": "loginAPI",
      "checkerType": "HTTP",
      "url": "https://api.example.com/login",
      "httpMethod": "POST"
    },
    "2": {
      "stepName": "dnsCheck",
      "checkerType": "DNS",
      "domain": "example.com"
    }
  }
}
```

## 檢查類型
<a name="check-types"></a>

### HTTP 檢查
<a name="http-types"></a>

透過全面的請求和回應驗證來監控 Web 端點和 APIs。

 **必要屬性** 


| 屬性 | Type | Description | 
| --- | --- | --- | 
|  url  | string | 目標 URL （必須是有效的 URI 格式） | 
|  httpMethod  | string | HTTP 方法：GET、POST、PUT、 PATCH、DELETE、HEAD、 OPTIONS | 

 **選用屬性** 


| 屬性 | Type | 預設 | 範圍 | Description | 
| --- | --- | --- | --- | --- | 
|  timeout  | integer | 30000 | 5000-300000 | 請求逾時 （毫秒） | 
|  waitTime  | integer | 0 | 0-60 | 請求之前的延遲 （秒） | 
|  headers  | object | - | - | 自訂 HTTP 標頭 | 
|  body  | string | - | - | POST/PUT 操作的請求內文 | 
|  authentication  | object | - | - | 身分驗證組態 | 
|  assertions  | 陣列 | - | - | 回應驗證規則 | 

 **範例** 

```
{
  "stepName": "createUser",
  "checkerType": "HTTP",
  "url": "https://api.example.com/users",
  "httpMethod": "POST",
  "timeout": 15000,
  "headers": {
    "Content-Type": "application/json",
    "X-API-Version": "v1"
  },
  "body": "{\"name\":\"John Doe\",\"email\":\"john@example.com\"}",
  "authentication": {
    "type": "API_KEY",
    "apiKey": "${AWS_SECRET:api-credentials}",
    "headerName": "X-API-Key"
  },
  "assertions": [
    {
      "type": "STATUS_CODE",
      "operator": "EQUALS",
      "value": 201
    }
  ]
}
```

### DNS 檢查
<a name="dns-types"></a>

驗證 DNS 解析並記錄資訊。

 **必要屬性** 


| 屬性 | Type | Description | 
| --- | --- | --- | 
|  domain  | string | 要查詢的網域名稱 （主機名稱格式） | 

 **選用屬性** 


| 屬性 | Type | 預設 | Description | 
| --- | --- | --- | --- | 
|  recordType  | string | 「A」 | DNS 記錄類型：A、CNAME、MX、 TXT、 NS | 
|  nameserver  | string | - | 要查詢的特定 DNS 伺服器 | 
|  timeout  | integer | 30000 | 查詢逾時 (5000-300000ms) | 
|  port  | integer | 53 | DNS 伺服器連接埠 (1-65535) | 
|  protocol  | string | 「UDP」 | 通訊協定： UDP 或 TCP | 
|  assertions  | 陣列 | - | DNS 回應驗證規則 | 

 **範例** 

```
{
  "stepName": "dnsResolution",
  "checkerType": "DNS",
  "domain": "example.com",
  "recordType": "A",
  "nameserver": "8.8.8.8",
  "timeout": 10000,
  "assertions": [
    {
      "type": "RECORD_VALUE",
      "operator": "CONTAINS",
      "value": "192.168"
    }
  ]
}
```

### SSL 檢查
<a name="ssl-types"></a>

監控 SSL 憑證運作狀態和組態。

 **必要屬性** 


| 屬性 | Type | Description | 
| --- | --- | --- | 
|  hostname  | string | 目標主機名稱 （主機名稱格式） | 

 **選用屬性** 


| 屬性 | Type | 預設 | 描述 | 
| --- | --- | --- | --- | 
|  port  | integer | 443 | SSL 連接埠 (1-65535) | 
|  timeout  | integer | 30000 | 連線逾時 (5000-300000ms) | 
|  sni  | boolean | TRUE | 伺服器名稱指示 | 
|  verifyHostname  | boolean | TRUE | 主機名稱驗證 | 
|  allowSelfSigned  | boolean | FALSE | 接受自我簽署憑證 | 
|  assertions  | 陣列 | - | 憑證驗證規則 | 

 **範例** 

```
{
  "stepName": "sslCertCheck",
  "checkerType": "SSL",
  "hostname": "secure.example.com",
  "port": 443,
  "sni": true,
  "verifyHostname": true,
  "assertions": [
    {
      "type": "CERTIFICATE_EXPIRY",
      "operator": "GREATER_THAN",
      "value": 30,
      "unit": "DAYS"
    }
  ]
}
```

### TCP 檢查
<a name="tcp-types"></a>

測試 TCP 連接埠連線和回應驗證。

 **必要屬性** 


| 屬性 | Type | Description | 
| --- | --- | --- | 
|  hostname  | string | 目標主機名稱 （主機名稱格式） | 
|  port  | integer | 目標連接埠 (1-65535) | 

 **選用屬性** 


| 屬性 | Type | 預設 | 描述 | 
| --- | --- | --- | --- | 
|  timeout  | integer | 30000 | 整體逾時 (5000-300000ms) | 
|  connectionTimeout  | integer | 3000 | 連線逾時 (5000-300000ms) | 
|  readTimeout  | integer | 2000 | 資料讀取逾時 (5000-300000ms) | 
|  sendData  | string | - | 連線後要傳送的資料 | 
|  expectedResponse  | string | - | 預期的回應資料 | 
|  encoding  | string | 「UTF-8」 | 資料編碼：UTF-8、ASCII、 HEX | 
|  assertions  | 陣列 | - | 連線和回應驗證 | 

 **範例** 

```
{
  "stepName": "databaseConnection",
  "checkerType": "TCP",
  "hostname": "db.example.com",
  "port": 3306,
  "connectionTimeout": 5000,
  "sendData": "SELECT 1",
  "expectedResponse": "1",
  "assertions": [
    {
      "type": "CONNECTION_SUCCESSFUL",
      "value": true
    }
  ]
}
```

## 身分驗證方法
<a name="authentication-methods"></a>

 **無身分驗證** 

```
{
  "type": "NONE"
}
```

 **基本身分驗證** 


| 屬性 | Type | 必要 | 描述 | 
| --- | --- | --- | --- | 
|  type  | string |  是  | 必須為 "BASIC" | 
|  username  | string |  是  | 身分驗證的使用者名稱 | 
|  password  | string |  是  | 用於身分驗證的密碼 | 

 **範例** 

```
{
  "type": "BASIC",
  "username": "admin",
  "password": "${AWS_SECRET:basic-auth:password}"
}
```

 **API 金鑰身分驗證** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "API\$1KEY" | 
|  apiKey  | string |  是  | - | API 金鑰值 | 
|  headerName  | string | 否 | "X-API-Key" | API 金鑰的標頭名稱 | 

 **範例** 

```
{
  "type": "API_KEY",
  "apiKey": "${AWS_SECRET:api-credentials}",
  "headerName": "Authorization"
}
```

 **OAuth 用戶端登入資料** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "OAUTH\$1CLIENT\$1CREDENTIALS" | 
|  tokenUrl  | string |  是  | - | OAuth 權杖端點 URL | 
|  clientId  | string |  是  | - | OAuth 用戶端 ID | 
|  clientSecret  | string |  是  | - | OAuth 用戶端秘密 | 
|  scope  | string | 否 | - | OAuth 範圍 | 
|  audience  | string | 否 | - | OAuth 對象 | 
|  resource  | string | 否 | - | OAuth 資源 | 
|  tokenApiAuth  | 陣列 | 否 | - | Token API 驗證方法：BASIC\$1AUTH\$1HEADER、 REQUEST\$1BODY | 
|  tokenCacheTtl  | integer | 否 | 3600 | 字符快取 TTL （至少 60 秒） | 

 **範例** 

```
{
  "type": "OAUTH_CLIENT_CREDENTIALS",
  "tokenUrl": "https://auth.example.com/oauth/token",
  "clientId": "${AWS_SECRET:oauth-creds:client_id}",
  "clientSecret": "${AWS_SECRET:oauth-creds:client_secret}",
  "scope": "read write",
  "tokenCacheTtl": 7200
}
```

 **AWS Signature （第 4 版）** 


| 屬性 | Type | 必要 | 描述 | 
| --- | --- | --- | --- | 
|  type  | string |  是  | 必須為 "SIGV4" | 
|  service  | string |  是  |  AWS 服務的名稱 （例如，「execute-api」) | 
|  region  | string |  是  | AWS 區域 | 
|  roleArn  | string |  是  | 用於簽署的 IAM 角色 ARN | 

 **範例** 

```
{
  "type": "SIGV4",
  "service": "execute-api",
  "region": "us-east-1",
  "roleArn": "arn:aws:iam::123456789012:role/SyntheticsRole"
}
```

## 聲明和驗證
<a name="assertions-validation"></a>

### HTTP 聲明
<a name="http-assertions"></a>

 **狀態碼聲明** 


| 屬性 | Type | 必要 | 描述 | 
| --- | --- | --- | --- | 
|  type  | string |  是  | 必須為 "STATUS\$1CODE" | 
|  operator  | string |  是  | EQUALS, NOT\$1EQUALS, GREATER\$1THAN,  LESS\$1THAN, IN\$1RANGE | 
|  value  | integer | 有條件 | HTTP 狀態碼 (100-599) | 
|  rangeMin  | integer | 有條件 | 最小範圍值 （適用於 IN\$1RANGE) | 
|  rangeMax  | integer | 有條件 | 最大範圍值 （適用於 IN\$1RANGE) | 

```
{
  "type": "STATUS_CODE",
  "operator": "EQUALS",
  "value": 200
}
```

 **回應時間聲明** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "RESPONSE\$1TIME" | 
|  operator  | string |  是  | - | LESS\$1THAN, GREATER\$1THAN, EQUALS | 
|  value  | 數字 |  是  | - | 時間值 （最小值為 0) | 
|  unit  | string | 否 | 「MILLISECONDS」 | 必須為 "MILLISECONDS" | 

```
{
  "type": "RESPONSE_TIME",
  "operator": "LESS_THAN",
  "value": 500,
  "unit": "MILLISECONDS"
}
```

 **頭部聲明** 


| 屬性 | Type | 必要 | 描述 | 
| --- | --- | --- | --- | 
|  type  | string |  是  | 必須為 "HEADER" | 
|  headerName  | string |  是  | 要驗證的標頭名稱 | 
|  operator  | string |  是  | EQUALS, NOT\$1EQUALS, CONTAINS,  NOT\$1CONTAINS, REGEX\$1MATCH, EXIST | 
|  value  | string/boolean | 有條件 | 預期值 (EXIST運算子的布林值） | 

```
{
  "type": "HEADER",
  "headerName": "Content-Type",
  "operator": "CONTAINS",
  "value": "application/json"
}
```

 **內文聲明** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "BODY" | 
|  target  | string | 否 | 「JSON」 | JSON 或 TEXT | 
|  path  | string | 有條件 | - | JSONPath (JSON 目標需要） | 
|  operator  | string |  是  | - | CONTAINS, NOT\$1CONTAINS, EQUALS,  NOT\$1EQUALS, EXISTS | 
|  value  | string/boolean |  是  | - | 預期值 (EXISTS運算子的布林值） | 

```
{
  "type": "BODY",
  "target": "JSON",
  "path": "$.users[0].name",
  "operator": "EQUALS",
  "value": "John Doe"
}
```

### DNS 聲明
<a name="dns-assertions"></a>

 **記錄值聲明** 


| 屬性 | Type | 必要 | 範圍 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "RECORD\$1VALUE" | 
|  operator  | string |  是  | - | EQUALS, NOT\$1EQUALS, CONTAINS,  NOT\$1CONTAINS, REGEX\$1MATCH | 
|  value  | string |  是  | - | 預期的記錄值 | 

 **記錄計數宣告** 


| 屬性 | Type | 必要 | 範圍 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "RECORD\$1COUNT" | 
|  operator  | string |  是  | - | EQUALS, GREATER\$1THAN, LESS\$1THAN | 
|  value  | integer |  是  | ≥ 0 | 預期計數 （最低 0) | 

 **授權聲明** 


| 屬性 | Type | 必要 | 範圍 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "AUTHORITATIVE" | 
|  value  | boolean |  是  | - | 預期的授權狀態 | 

 **TTL 聲明** 


| 屬性 | Type | 必要 | 範圍 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "TTL" | 
|  operator  | string |  是  | - | EQUALS, GREATER\$1THAN, LESS\$1THAN | 
|  value  | integer |  是  | ≥ 0 | 預期的 TTL （最低 0) | 

### SSL 聲明
<a name="ssl-assertions"></a>

 **憑證過期聲明** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "CERTIFICATE\$1EXPIRY" | 
|  operator  | string |  是  | - | GREATER\$1THAN, LESS\$1THAN | 
|  value  | integer |  是  | - | 時間值 （最小值為 0) | 
|  unit  | string | 否 | 「天」 | DAYS, HOURS | 

 **憑證主體聲明** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "CERTIFICATE\$1SUBJECT" | 
|  field  | string |  是  | - | 主旨欄位：CN、O、OU、C、ST、 L | 
|  operator  | string |  是  | - | CONTAINS, EQUALS, REGEX\$1MATCH | 
|  value  | string |  是  | - | 預期的欄位值 | 

 **憑證發行者聲明** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "CERTIFICATE\$1ISSUER" | 
|  field  | string |  是  | - | 發行者欄位：CN、 O | 
|  operator  | string |  是  | - | CONTAINS, EQUALS | 
|  value  | string |  是  | - | 預期的欄位值 | 

### TCP 聲明
<a name="tcp-assertions"></a>

 **連線成功聲明** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "CONNECTION\$1SUCCESSFUL" | 
|  value  | boolean |  是  | - | 預期的連線狀態 | 

 **回應資料聲明** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  type  | string |  是  | - | 必須為 "RESPONSE\$1DATA" | 
|  operator  | string |  是  | - | CONTAINS, EQUALS, NOT\$1CONTAINS,  REGEX\$1MATCH, STARTS\$1WITH, ENDS\$1WITH | 
|  value  | string |  是  | - | 預期的回應資料 | 
|  encoding  | string | 否 | 「UTF-8」 | UTF-8, ASCII, HEX | 

## 資料擷取
<a name="data-extraction"></a>

擷取器可讓您從回應擷取資料，以用於後續步驟或報告目的。

 **擷取屬性** 


| 屬性 | Type | 必要 | 預設 | Description | 
| --- | --- | --- | --- | --- | 
|  name  | string |  是  | - | 擷取資料的變數名稱 | 
|  type  | string |  是  | - | 擷取類型： BODY | 
|  path  | string | 否 | - | 用於內文擷取的 JSONPath  | 
|  regex  | string | 否 | - | 規則表達式模式 | 
|  regexGroup  | integer | 否 | 0 | Regex 擷取群組 （最低 0) | 

 **擷取名稱驗證** 
+ 模式：`^[a-zA-Z][a-zA-Z0-9_]*$`
+ 必須以字母開頭
+ 可包含字母、數字和底線

**限制** – 替代不適用於結構描述中具有特定 ENUM 值的欄位

 **擷取類型** 

```
{
  "name": "userId",
  "type": "BODY",
  "path": "$.user.id"
}
```

```
{
  "stepName": "loginAndExtract",
  "checkerType": "HTTP",
  "url": "https://api.example.com/login",
  "httpMethod": "POST",
  "body": "{\"username\":\"test\",\"password\":\"pass\"}",
  "extractors": [
    {
      "name": "textVariable",
      "type": "BODY",
      "path": "$.myvalue"
    }
  ]
},
{
  "stepName": "substituteVariable",
  "checkerType": "HTTP",
  "url": "https://api.example.com/get/${textVariable}",
  "httpMethod": "GET",
  "assertions": [
    {
    "type": "BODY",
    "target": "JSON",
    "path": "$.users[0].name",
    "operator": "EQUALS",
    "value": "${textVariable}"
    }
  ]
}
```

# 適用於 Canary 指令碼的程式庫函數
<a name="CloudWatch_Synthetics_Canaries_Function_Library"></a>

CloudWatch Synthetics 包含多個可在撰寫 Node.js 指令碼時呼叫的內建類別和函數，以用來作為 Canary。

某些函數同時適用於 UI 和 API Canary。某些函數僅適用於 UI Canary。UI Canary 是使用 `getPage()` 函數的 Canary，它會使用 Puppeteer 作為 Web 驅動程式來瀏覽網頁並進行互動。

**注意**  
每當您升級金絲雀以使用新版本的 Synthetics 執行期時，您的金絲雀使用的所有 Synthetics 程式庫函數也會自動升級到 Synthetics 執行期支援的相同版本的 NodeJS。

**Topics**
+ [適用於 Node.js Canary 的程式庫函數](Library_function_Nodejs.md)
+ [適用於 Java Canary 的程式庫函式](CloudWatch_Synthetics_Canaries_Java.md)
+ [適用於使用 Playwright 之 Node.js Canary 指令碼的程式庫函式](CloudWatch_Synthetics_Canaries_Nodejs_Playwright.md)
+ [適用於使用 Puppeteer 之 Node.js Canary 指令碼的程式庫函式](CloudWatch_Synthetics_Canaries_Library_Nodejs.md)
+ [可用於使用 Selenium 的 Python Canary 指令碼的程式庫函數](CloudWatch_Synthetics_Canaries_Library_Python.md)

# 適用於 Node.js Canary 的程式庫函數
<a name="Library_function_Nodejs"></a>

本節說明使用 Node.js 執行時間的 Canary 指令碼可用的程式庫函數。

**Topics**
+ [addExecutionError(errorMessage, ex)；](#Library_function_Nodejs_addExecutionError_Nodecanary)
+ [getCanaryName();](#Library_function_Nodejs_getCanaryName)
+ [getCanaryArn();](#Library_function_Nodejs_Nodecanary)
+ [getCanaryUserAgentString();](#Library_function_Nodejs_getCanaryUserAgentString_Nodecanary)
+ [getRuntimeVersion();](#Library_function_Nodejs_getRuntimeVersion_Nodecanary)
+ [getLogLevel();](#Library_function_Nodejs_getLogLevel_Nodecanary)
+ [setLogLevel();](#Library_function_Nodejs_setLogLevel_Nodecanary)
+ [executeStep(stepName， functionToExecute， 【stepConfig】)](#Library_function_Nodejs_executestep_Nodecanary)
+ [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#Library_function_Nodejs_executeHttpStep)

## addExecutionError(errorMessage, ex)；
<a name="Library_function_Nodejs_addExecutionError_Nodecanary"></a>

`errorMessage` 描述錯誤，而 `ex` 是遇到的例外狀況

您可以使用 `addExecutionError` 為您的 Canary 設定執行錯誤。它會在不中斷指令碼執行的情況下使 Canary 失敗。它也不會影響您的 `successPercent` 指標。

只有在錯誤表示 Canary 指令碼成功或失敗並不重要時，才應將錯誤追蹤為執行錯誤。

`addExecutionError` 的使用範例如下所示。您正在監控端點的可用性，並在頁面載入後擷取螢幕擷取畫面。由於擷取螢幕擷取畫面的失敗並不會決定端點的可用性，因此您可以捕捉擷取螢幕擷取畫面時遇到的任何錯誤，並將它們新增為執行錯誤。您的可用性指標仍會顯示端點已啟動並執行，但您的 Canary 狀態會標示為失敗。下面的範本程式碼區塊可捕獲這樣的錯誤，並將其新增為執行錯誤。

```
try {await synthetics.executeStep(stepName, callbackFunc);} catch(ex) {synthetics.addExecutionError('Unable to take screenshot ', ex);}
```

## getCanaryName();
<a name="Library_function_Nodejs_getCanaryName"></a>

傳回 Canary 的名稱。

## getCanaryArn();
<a name="Library_function_Nodejs_Nodecanary"></a>

傳回 Canary 的 ARN。

## getCanaryUserAgentString();
<a name="Library_function_Nodejs_getCanaryUserAgentString_Nodecanary"></a>

傳回 Canary 的自訂使用者代理程式。

## getRuntimeVersion();
<a name="Library_function_Nodejs_getRuntimeVersion_Nodecanary"></a>

此函數適用於執行時間版本 `syn-nodejs-3.0`和更新版本。其會傳回 Canary 的 Synthetics 執行時間版本。例如，傳回值可以是 `syn-nodejs-3.0`。

## getLogLevel();
<a name="Library_function_Nodejs_getLogLevel_Nodecanary"></a>

擷取 Synthetics 程式庫的目前日誌層級。可能的值如下：
+ `0` – 偵錯
+ `1` – 資訊
+ `2` – 警告
+ `3` – 錯誤

範例：

```
let logLevel = synthetics.getLogLevel();
```

## setLogLevel();
<a name="Library_function_Nodejs_setLogLevel_Nodecanary"></a>

設定 Synthetics 程式庫的日誌層級。可能的值如下：
+ `0` – 偵錯
+ `1` – 資訊
+ `2` – 警告
+ `3` – 錯誤

範例：

```
synthetics.setLogLevel(0);
```

## executeStep(stepName， functionToExecute， 【stepConfig】)
<a name="Library_function_Nodejs_executestep_Nodecanary"></a>

執行提供的步驟，將其包裝為start/pass/fail記錄，以及通過/失敗和持續時間指標。

`executeStep` 函數還會執行下列操作：
+ 步驟開始的日誌
+ 啟動計時器
+ 執行提供的函數
+ 當函數正常傳回時，它會計為傳遞。如果函數擲回，則會計為失敗
+ 結束計時器
+ 記錄步驟是否已通過或失敗
+ 發出`stepName SuccessPercent`指標，傳遞為 100，失敗為 0
+ 發出 `stepName Duration metric`，其值是根據步驟開始和結束時間
+ 傳回 functionToExecute ` functionToExecute` 傳回的內容或擲回的內容
+ 將步驟執行摘要新增至 Canary 的報告

 **範例** 

```
await synthetics.executeStep(stepName, async function () {
    return new Promise((resolve, reject) => {
        const req = https.request(url, (res) => {
            console.log(`Status: ${res.statusCode}`);
            if (res.statusCode >= 400) {
                reject(new Error(`Request failed with status ${res.statusCode} for ${url}`));
            } else {
                resolve();
            }
        });

        req.on('error', (err) => {
            reject(new Error(`Request failed for ${url}: ${err.message}`));
        });

        req.end();
    });
});
```

## executeHttpStep(stepName, requestOptions, [callback], [stepConfig])
<a name="Library_function_Nodejs_executeHttpStep"></a>

執行提供的 HTTP 請求作為一個步驟，並發布 `SuccessPercent` (通過/失敗) 和 `Duration` 指標。

**executeHttpStep** 根據請求中指定的通訊協定，深入使用 HTTP 或 HTTPS 原生函數。

此函數也會將步驟執行摘要新增至 Canary 報告。摘要包含每個 HTTP 請求的詳細資訊，如下所示：
+ 開始時間
+ 結束時間
+ 狀態 (通過/失敗)
+ 失敗的原因，如果失敗
+ HTTP 呼叫詳細資訊，如請求/回應標頭、內文、狀態碼、狀態訊息和效能計時。

**Topics**
+ [Parameters](#Library_function_Nodejs_executeHttpStep_parameters_Nodecanary)
+ [使用 executeHttpStep 的範例](#Library_function_Nodejs_executeHttpStep_examples_Nodecanary)

### Parameters
<a name="Library_function_Nodejs_executeHttpStep_parameters_Nodecanary"></a>

 **stepName(*String*)** 

指定步驟的名稱。此名稱也可用於發布此步驟的 CloudWatch 指標。

 **requestOptions(*Object or String*)** 

此參數的值可以是 URL、URL 字串或物件。如果它是一個物件，那麼它必須是可設定的選項組，以發出 HTTP 請求。它支援 Node.js 文件中的 [ http.request(options[, callback])](https://nodejs.org/api/http.html#http_http_request_options_callback) 的所有選項。

除了這些 Node.js 選項之外，**requestOptions** 支援其他參數 `body`。您可以使用 `body` 參數將資料作為請求內文進行傳遞。

 **callback(*response*)** 

(選用) 這是使用 HTTP 回應呼叫的使用者函數。回應的類型為 [Class: http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage)。

 **stepConfig(*object*)** 

(選用) 使用此參數，以此步驟的不同組態覆寫全域綜合組態。

### 使用 executeHttpStep 的範例
<a name="Library_function_Nodejs_executeHttpStep_examples_Nodecanary"></a>

以下範例系列會建立會相互建置，以說明此選項的各種用途。

這第一個範例設定了請求參數。您可以傳遞 URL 做為 ** requestOptions**：

```
let requestOptions = 'https://www.amazon.com';
```

或者你可以傳遞選項集：

```
let requestOptions = {
        'hostname': 'myproductsEndpoint.com',
        'method': 'GET',
        'path': '/test/product/validProductName',
        'port': 443,
        'protocol': 'https:'
    };
```

下一個範例會建立接受回應的回呼函數。預設情況下，如果未指定**回呼**，CloudWatch Synthetics 會驗證狀態是否介於 200 到 299 之間。

```
// Handle validation for positive scenario
    const callback = async function(res) {
        return new Promise((resolve, reject) => {
            if (res.statusCode < 200 || res.statusCode > 299) {
                throw res.statusCode + ' ' + res.statusMessage;
            }
     
            let responseBody = '';
            res.on('data', (d) => {
                responseBody += d;
            });
     
            res.on('end', () => {
                // Add validation on 'responseBody' here if required. For ex, your status code is 200 but data might be empty
                resolve();
            });
        });
    };
```

下一個範例會為此步驟建立覆寫全域 CloudWatch Synthetics 組態的組態。此範例中的步驟組態允許在您的報告中包含請求標頭、回應標頭、請求內文 (發佈資料) 和回應內文，並限制 'X-Amz-Security-Token' 和 'Authorization' 標頭值。根據預設，基於安全性考量，這些值不會包含在報告中。如果選擇包含它們，則資料只會存放於 S3 儲存貯體中。

```
// By default headers, post data, and response body are not included in the report for security reasons. 
// Change the configuration at global level or add as step configuration for individual steps
let stepConfig = {
    includeRequestHeaders: true, 
    includeResponseHeaders: true,
    restrictedHeaders: ['X-Amz-Security-Token', 'Authorization'], // Restricted header values do not appear in report generated.
    includeRequestBody: true,
    includeResponseBody: true
};
```

這最後一個範例會將您的請求傳遞給 **executeHttpStep**，並命名步驟。

```
await synthetics.executeHttpStep('Verify GET products API', requestOptions, callback, stepConfig);
```

透過這組範例，CloudWatch Synthetics 會新增報告中每個步驟的詳細資料，並使用 **stepName**。

 您將看見適用於 `Verify GET products API` 步驟的 `successPercent` 和`duration`的 指標步驟。您可以監控 API 呼叫步驟的指標，以監控您的 API 效能。

如需使用這些函數的完整指令碼範例，請參閱 [多步驟 API Canary](CloudWatch_Synthetics_Canaries_Samples.md#CloudWatch_Synthetics_Canaries_Samples_APIsteps)。

# 適用於 Java Canary 的程式庫函式
<a name="CloudWatch_Synthetics_Canaries_Java"></a>

`executeStep` 函式用於模組化 Canary 程式碼，並逐步執行。在 CloudWatch Synthetics 中，Synthetics 步驟是將 Canary 指令碼分解為一系列明確定義動作的方式，讓您能夠分別監控應用程式旅程的不同環節。對於每個步驟，CloudWatch Synthetics 會執行下列動作：
+ 針對每個 Canary 執行過程，系統會產生一份報告，包括步驟執行詳細資訊的摘要，例如步驟持續時間、*通過*或*失敗*狀態等。當您在 CloudWatch Synthetics 主控台中選擇執行時，可以在**步驟**索引標籤上檢視每個步驟的執行詳細資訊。
+ 每個步驟都會發出 *SuccessPercent* 和 *Duration* CloudWatch 指標，讓使用者能夠監控每個步驟的可用性和延遲。

   **用途** 

  ```
  synthetics.executeStep(stepName,()->{
      try {
          //step code to be executed
          return null;
      } catch (Exception e) {
          throw e;
      }
  }).get();
  ```

   **參數** 
  + *stepName*，字串 (必要) – Synthetics 步驟的描述性名稱
  + *function to execute*，Callable<T> (必要) – 代表要執行的任務
  + *stepOptions*，`com.amazonaws.synthetics.StepOptions (optional)` – 可用來設定步驟執行的 StepOptions 物件。

    *stepConfiguration*，` com.amazonaws.synthetics.StepConfiguration` (stepOptions 的必要項目)

 **傳回值** 

傳回的值為 *CompletableFuture<T>*。

**注意**  
Synthetics 僅支援循序步驟。請務必如範例所示呼叫 `.get()` 方法，以確保步驟完成，然後再繼續完成後續步驟。

# 適用於使用 Playwright 之 Node.js Canary 指令碼的程式庫函式
<a name="CloudWatch_Synthetics_Canaries_Nodejs_Playwright"></a>

本節說明可供使用 Node.js Playwright 執行時期的 Canary 指令碼使用的程式庫函式。

**Topics**
+ [啟動](#Synthetics_Library_Nodejs_Playwright_functions)
+ [newPage](#Synthetics_Library_Nodejs_Playwright_function_newPage)
+ [關閉](#Synthetics_Library_Nodejs_Playwright_function_close)
+ [getDefaultLaunchOptions](#Synthetics_Library_Nodejs_Playwright_function_getDefaultLaunchOptions)
+ [executeStep](#Synthetics_Library_Nodejs_Playwright_function_executeStep)

## 啟動
<a name="Synthetics_Library_Nodejs_Playwright_functions"></a>

此函式使用 Playwright 啟動函式啟動 Chromium 瀏覽器，並傳回瀏覽器物件。它會解壓縮瀏覽器二進位檔，並使用適用於無周邊瀏覽器的預設選項來啟動 chromium 瀏覽器。如需有關 `launch` 函式的詳細資訊，請參閱 Playwright 文件中的 [https://playwright.dev/docs/api/class-browsertype#browser-type-launch](https://playwright.dev/docs/api/class-browsertype#browser-type-launch)。

 **用途** 

```
const browser = await synthetics.launch();
```

 **Arguments (引數)** 

`options` [options](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) (選用) 是一組可設定的瀏覽器選項。

 **傳回值** 

承諾 `<Browser>`，其中 [Browser](https://playwright.dev/docs/api/class-browser) 是 Playwright 瀏覽器執行個體。

如果再次呼叫此函式，系統會先關閉先前開啟的瀏覽器，再啟動新的瀏覽器。您可以覆寫 CloudWatch Synthetics 使用的啟動參數，並在啟動瀏覽器時傳遞其他參數。例如，下面的程式碼片段啟動瀏覽器，具有預設引數和預設的可執行文件路徑，但具有 800 x 600 像素的檢視口。如需詳細資訊，請參閱 Playwright 文件中的 [Playwright 啟動選項](https://playwright.dev/docs/api/class-browsertype#browser-type-launch)。

```
const browser = await synthetics.launch({
  defaultViewport: { 
      "deviceScaleFactor": 1, 
      "width": 800,
      "height": 600 
}});
```

 您也可以新增或覆寫預設傳遞至瀏覽器的 Chromium 旗標。舉例來說，您可以透過將 `--disable-web-security` 旗標新增至 CloudWatch Synthetics 啟動參數中的引數來停用網路安全功能：

```
// This function adds the --disable-web-security flag to the launch parameters
const defaultOptions = await synthetics.getDefaultLaunchOptions();
const launchArgs = [...defaultOptions.args, '--disable-web-security'];
const browser = await synthetics.launch({
    args: launchArgs
  });
```

## newPage
<a name="Synthetics_Library_Nodejs_Playwright_function_newPage"></a>

`newPage()` 函式會建立並傳回新的 Playwright 頁面。Synthetics 會自動設定 Chrome DevTools 通訊協定 (CDP) 連線，以啟用產生 HTTP 封存 (HAR) 的網路擷取。

 **用途** 

透過下列方式之一使用 `newPage()`：

 **1。在新的瀏覽器內容中建立新頁面：**

```
const page = await synthetics.newPage(browser);
```

 **2. 在指定的瀏覽器內容中建立新頁面：**

```
// Create a new browser context
const browserContext = await browser.newContext();

// Create a new page in the specified browser context
const page = await synthetics.newPage(browserContext)
```

 **Arguments (引數)** 

接受 Playwright [瀏覽器](https://playwright.dev/docs/api/class-browser)執行個體或 Playwright [ BrowserContext](https://playwright.dev/docs/api/class-browsercontext)執行個體。

 **傳回值** 

承諾 <Page>，其中 Page 是 Playwright [Page](https://playwright.dev/docs/api/class-page) 執行個體。

## 關閉
<a name="Synthetics_Library_Nodejs_Playwright_function_close"></a>

關閉目前開啟的瀏覽器。

 **用途** 

```
await synthetics.close();
```

建議您在指令碼的 `finally` 區塊中關閉瀏覽器。

 **Arguments (引數)** 

無 

 **傳回值** 

傳回 Synthetics 啟動函式用於啟動瀏覽器的 Promise<void>。

## getDefaultLaunchOptions
<a name="Synthetics_Library_Nodejs_Playwright_function_getDefaultLaunchOptions"></a>

`getDefaultLaunchOptions()` 函數會傳回 CloudWatch Synthetics 使用的瀏覽器啟動選項。

 **用途** 

```
const defaultOptions = await synthetics.getDefaultLaunchOptions();
```

 **Arguments (引數)** 

無 

 **傳回值** 

傳回 Synthetics `launch` 函式用於啟動瀏覽器的 Playwright [launch options](https://playwright.dev/docs/api/class-browsertype#browser-type-launch)。

## executeStep
<a name="Synthetics_Library_Nodejs_Playwright_function_executeStep"></a>

`executeStep` 函式用於在 Synthetics 指令碼中執行步驟。在 CloudWatch Synthetics 中，Synthetics 步驟是將 Canary 指令碼分解為一系列明確定義動作的方式，讓您能夠分別監控應用程式旅程的不同環節。對於每個步驟，CloudWatch Synthetics 會執行下列動作：
+ 在步驟開始之前和步驟完成之後自動擷取螢幕畫面。也可以在步驟內擷取螢幕畫面。螢幕擷取畫面預設為擷取，但可以使用 Synthetics 組態關閉。
+ 針對每個 Canary 執行過程，系統會產生一份報告，包括步驟執行詳細資訊的摘要，例如步驟持續時間、`pass` 或 `fail` 狀態、來源和目的地頁面 URL、關聯的螢幕擷取畫面等。當您在 CloudWatch Synthetics 主控台中選擇執行時，可以在**步驟**索引標籤上檢視每個步驟的執行詳細資訊。
+ 每個步驟都會發出 `SuccessPercent` 和 `Duration` CloudWatch 指標，讓使用者能夠監控每個步驟的可用性和延遲。

 **用途** 

```
await synthetics.executeStep("mystepname", async function () {
  await page.goto(url, { waitUntil: 'load', timeout: 30000 });
}
```

**注意**  
步驟應循序執行。請務必對 promise 使用 `await`。

 **Arguments (引數)** 
+ `stepName` 字串 (必要) (布林值) – Synthetics 步驟的名稱。
+ `functionToExecute` 非同步函式 (必要) – 您希望 Synthetics 執行的函式。此函式應包含步驟的邏輯。
+ `stepConfig` 物件 (選用) – 步驟組態覆寫此函式的全域 Synthetics 組態。
  + `continueOnStepFailure` 布林值 (選用) – 此步驟失敗後是否繼續執行 Canary 指令碼。
  + `screenshotOnStepStart` 布林值 (選用) – 是否要在此步驟開始時擷取螢幕畫面。
  + `screenshotOnStepSuccess` 布林值 (選用) – 如果此步驟成功，是否擷取螢幕畫面。
  + `screenshotOnStepFailure` 布林值 (選用) – 如果此步驟失敗，是否擷取螢幕畫面。
+ `page` – Playwright 頁面物件 (選用)

  Playwright 頁面物件。Synthetics 使用此頁面物件來擷取螢幕畫面和 URL。根據預設，Synthetics 使用呼叫 `synthetics.newPage()` 函式時建立的 Playwright 頁面來擷取頁面詳細資訊，例如螢幕擷取畫面和 URL。

 **傳回值** 

傳回 Promise，使用 ` functionToExecute` 函式傳回的值解析。如需範例指令碼，請參閱本指南中的 [Canary 指令碼的範本程式碼](CloudWatch_Synthetics_Canaries_Samples.md)。

# 適用於使用 Puppeteer 之 Node.js Canary 指令碼的程式庫函式
<a name="CloudWatch_Synthetics_Canaries_Library_Nodejs"></a>

本節說明適用於 Node.js Canary 指令碼的程式庫函式。

**Topics**
+ [適用於所有 Canary 的 Node.js 程式庫類別和函數](#CloudWatch_Synthetics_Library_allcanaries)
+ [僅適用於 UI Canary 的 Node.js 程式庫類別和函數](#CloudWatch_Synthetics_Library_UIcanaries)
+ [僅適用於 API Canary 的 Node.js 程式庫類別和函數](#CloudWatch_Synthetics_Library_APIcanaries)

## 適用於所有 Canary 的 Node.js 程式庫類別和函數
<a name="CloudWatch_Synthetics_Library_allcanaries"></a>

下列適用於 Node.js 的 CloudWatch Synthetics 程式庫函數可用於所有 Canary。

**Topics**
+ [Synthetics 類別](#CloudWatch_Synthetics_Library_Synthetics_Class_all)
+ [SyntheticsConfiguration 類別](#CloudWatch_Synthetics_Library_SyntheticsConfiguration)
+ [Synthetics Logger](#CloudWatch_Synthetics_Library_SyntheticsLogger)
+ [SyntheticsLogHelper 類別](#CloudWatch_Synthetics_Library_SyntheticsLogHelper)

### Synthetics 類別
<a name="CloudWatch_Synthetics_Library_Synthetics_Class_all"></a>

以下適用於所有 Canary 的函數都在 Synthetics 類別中。

**Topics**
+ [addExecutionError(errorMessage, ex)；](#CloudWatch_Synthetics_Library_addExecutionError)
+ [getCanaryName();](#CloudWatch_Synthetics_Library_getCanaryName)
+ [getCanaryArn();](#CloudWatch_Synthetics_Library_getCanaryARN)
+ [getCanaryUserAgentString();](#CloudWatch_Synthetics_Library_getCanaryUserAgentString)
+ [getRuntimeVersion();](#CloudWatch_Synthetics_Library_getRuntimeVersion)
+ [getLogLevel();](#CloudWatch_Synthetics_Library_getLogLevel)
+ [setLogLevel();](#CloudWatch_Synthetics_Library_setLogLevel)

#### addExecutionError(errorMessage, ex)；
<a name="CloudWatch_Synthetics_Library_addExecutionError"></a>

`errorMessage` 描述錯誤，而 `ex` 是遇到的例外狀況

您可以使用 `addExecutionError` 為您的 Canary 設定執行錯誤。它會在不中斷指令碼執行的情況下使 Canary 失敗。它也不會影響您的 `successPercent` 指標。

只有在錯誤表示 Canary 指令碼成功或失敗並不重要時，才應將錯誤追蹤為執行錯誤。

`addExecutionError` 的使用範例如下所示。您正在監控端點的可用性，並在頁面載入後擷取螢幕擷取畫面。由於擷取螢幕擷取畫面的失敗並不會決定端點的可用性，因此您可以捕捉擷取螢幕擷取畫面時遇到的任何錯誤，並將它們新增為執行錯誤。您的可用性指標仍會顯示端點已啟動並執行，但您的 Canary 狀態會標示為失敗。下面的範本程式碼區塊可捕獲這樣的錯誤，並將其新增為執行錯誤。

```
try {
    await synthetics.takeScreenshot(stepName, "loaded");
} catch(ex) {
    synthetics.addExecutionError('Unable to take screenshot ', ex);
}
```

#### getCanaryName();
<a name="CloudWatch_Synthetics_Library_getCanaryName"></a>

傳回 Canary 的名稱。

#### getCanaryArn();
<a name="CloudWatch_Synthetics_Library_getCanaryARN"></a>

傳回 Canary 的 ARN。

#### getCanaryUserAgentString();
<a name="CloudWatch_Synthetics_Library_getCanaryUserAgentString"></a>

傳回 Canary 的自訂使用者代理程式。

#### getRuntimeVersion();
<a name="CloudWatch_Synthetics_Library_getRuntimeVersion"></a>

此函數在執行時間版本 `syn-nodejs-puppeteer-3.0` 和更新版本中可用。其會傳回 Canary 的 Synthetics 執行時間版本。例如，傳回值可以是 `syn-nodejs-puppeteer-3.0`。

#### getLogLevel();
<a name="CloudWatch_Synthetics_Library_getLogLevel"></a>

擷取 Synthetics 程式庫的目前日誌層級。可能的值如下：
+ `0` – 偵錯
+ `1` – 資訊
+ `2` – 警告
+ `3` – 錯誤

範例：

```
let logLevel = synthetics.getLogLevel();
```

#### setLogLevel();
<a name="CloudWatch_Synthetics_Library_setLogLevel"></a>

設定 Synthetics 程式庫的日誌層級。可能的值如下：
+ `0` – 偵錯
+ `1` – 資訊
+ `2` – 警告
+ `3` – 錯誤

範例：

```
synthetics.setLogLevel(0);
```

### SyntheticsConfiguration 類別
<a name="CloudWatch_Synthetics_Library_SyntheticsConfiguration"></a>

此類別僅在 `syn-nodejs-2.1` 執行時間版本或更新版本中可用。

您可以使用 `SyntheticsConfiguration` 類別來設定 Synthetics 程式庫函式的行為。例如，您可以使用此類別來將 `executeStep()` 函數設定為不擷取螢幕擷取畫面。

您可以在全域層級設定 CloudWatch Synthetics 組態，這些組態適用於所有 Canary 步驟。也可以透過傳遞組態鍵值對來在步驟層級覆寫這些組態。

您可以在步驟層級傳遞選項。如需範例，請參閱 [async executeStep(stepName, functionToExecute, [stepConfig]);](#CloudWatch_Synthetics_Library_executeStep) 和 [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#CloudWatch_Synthetics_Library_executeHttpStep)

**Topics**
+ [setConfig(options)](#CloudWatch_Synthetics_Library_setConfig)
+ [視覺化監控](#CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting)

#### setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfig"></a>

` options ` 是一個物件，適用於您的 Canary 的可設定選項集。以下各節會說明了 ` options ` 中的可能欄位。

##### 適用於所有 Canary 的 setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfigall"></a>

對於使用 `syn-nodejs-puppeteer-3.2`或更新版本的 Canary，**setConfig** 的 **（選項）** 可以包含下列參數：
+ `includeRequestHeaders` (布林值)— 是否要在報告中包含請求標頭。預設值為 `false`。
+ `includeResponseHeaders` (布林值)— 是否要在報告中包含回應標頭。預設值為 `false`。
+ `restrictedHeaders` (陣列)— 如果包含標頭，則要忽略的標頭值清單。這適用於請求和回應標頭。例如，您可以將 ** includeRequestHeaders** 作為 傳遞`true`，並將 ** restrictedHeaders** 作為 傳遞，以隱藏您的登入資料`['Authorization']`。
+ `includeRequestBody` (布林值)— 是否要在報告中包含請求內文。預設值為 `false`。
+ `includeResponseBody` (布林值)— 是否要在報告中包含回應內文。預設值為 `false`。
**重要**  
如果您啟用 `includeResponseBody` 或 ` logResponseBody`，資料物件不會在部分 API 的回應中傳回，例如 aws-sdk v3 用戶端。這是因為 Node.js 的限制和使用的回應物件類型造成的。

 **關於 CloudWatch 指標的 setConfig(options)** 

對於使用 `syn-nodejs-puppeteer-3.1`或更新版本的 Canary，**setConfig** 的 **（選項）** 可以包含下列布林值參數，以決定 Canary 發佈哪些指標。這些選項的預設值為 `true`。以 `aggregated` 開頭的選項可判斷是否會發出沒有 ` CanaryName` 維度的指標。您可以使用這些指標來查看所有 Canary 的彙總結果。其他選項可判斷是否會發出具有 `CanaryName` 維度的指標。您可以使用這些指標來查看每個 Canary 的結果。

如需 Canary 發出的 CloudWatch 指標清單，請參閱 [Canary 公佈的 CloudWatch 指標](CloudWatch_Synthetics_Canaries_metrics.md)。
+ `failedCanaryMetric` (布林值)— 是否為此 canary 發出 ` Failed` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `failedRequestsMetric` (布林值)— 是否為此 canary 發出 `Failed requests` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `_2xxMetric` (布林值)— 是否為此 canary 發出 `2xx` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `_4xxMetric` (布林值)— 是否為此 canary 發出 `4xx` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `_5xxMetric` (布林值)— 是否為此 canary 發出 `5xx` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `stepDurationMetric` (布林值)— 是否為此 canary 發出 `Step duration` 指標 (具有 `CanaryName` `StepName` 維度)。預設值為 `true`。
+ `stepSuccessMetric` (布林值)— 是否為此 canary 發出 `Step success` 指標 (具有 `CanaryName` `StepName` 維度)。預設值為 `true`。
+ `aggregatedFailedCanaryMetric` (布林值)— 是否為此 canary 發出 `Failed` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `aggregatedFailedRequestsMetric` (布林值)— 是否為此 canary 發出 `Failed Requests` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated2xxMetric` (布林值)— 是否為此 canary 發出 ` 2xx` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated4xxMetric` (布林值)— 是否為此 canary 發出 ` 4xx` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated5xxMetric` (布林值)— 是否為此 canary 發出 ` 5xx` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `visualMonitoringSuccessPercentMetric` (布林值)— 是否為此 canary 發出 `visualMonitoringSuccessPercent` 指標。預設值為 `true`。
+ `visualMonitoringTotalComparisonsMetric` (布林值)— 是否為此 canary 發出 `visualMonitoringTotalComparisons` 指標。預設值為 `false`。
+ `includeUrlPassword`(布林值) — 是否要包含在 URL 中顯示的密碼。依預設，在 URL 中顯示的密碼會從日誌和報告進行修訂，以防止揭露敏感資料。預設值為 `false`。
+ `restrictedUrlParameters` (陣列)— 要修訂的 URL 路徑或查詢參數清單。這適用於出現在日誌、報告和錯誤中的 URL。參數區分大小寫。您可以將星號 (\$1) 傳遞為數值，以修訂所有 URL 路徑和查詢參數值。預設為空陣列。
+ `logRequest` (布林值)— 是否要在 Canary 日誌中記錄每個請求。對於 UI Canary，這會記錄瀏覽器傳送的每個請求。預設值為 `true`。
+ `logResponse` (布林值)— 是否要在 Canary 日誌中記錄每個回應。對於 UI Canary，這會記錄瀏覽器收到的每個回應。預設值為 `true`。
+ `logRequestBody` (布林值)— 是否要在 Canary 日誌中記錄請求內文及請求。此組態僅在 `logRequest` 為 `true` 時適用。預設值為 `false`。
+ `logResponseBody` (布林值)— 是否要在 Canary 日誌中記錄回應內文及回應。此組態僅在 `logResponse` 為 `true` 時適用。預設值為 ` false`。
**重要**  
如果您啟用 `includeResponseBody` 或 ` logResponseBody`，資料物件不會在部分 API 的回應中傳回，例如 aws-sdk v3 用戶端。這是因為 Node.js 的限制和使用的回應物件類型造成的。
+ `logRequestHeaders` (布林值)— 是否要在 Canary 日誌中記錄請求標頭及請求。此組態僅在 `logRequest` 為 `true` 時適用。預設值為 ` false`。

  請注意，`includeRequestHeaders` 會啟用成品中的標頭。
+ `logResponseHeaders` (布林值)— 是否要在 Canary 日誌中記錄回應標頭及回應。此組態僅在 `logResponse` 為 `true` 時適用。預設值為 ` false`。

  請注意，`includeResponseHeaders` 會啟用成品中的標頭。

**注意**  
總是會針對每個 Canary 發出 `Duration` 和 `SuccessPercent` 指標，而無論是否有 `CanaryName` 指標。

##### 啟用或停用指標的方法
<a name="CloudWatch_Synthetics_Library_setConfig_metrics"></a>

 **disableAggregatedRequestMetrics()** 

禁止 Canary 發出所有沒有 `CanaryName` 維度發出的請求指標。

 **disableRequestMetrics()** 

停用所有請求指標，包括每個 Canary 指標和彙總所有 Canary 的指標。

 **disableStepMetrics()** 

停用所有步驟指標，包括步驟成功指標和步驟持續時間指標。

 **enableAggregatedRequestMetrics()** 

啟用 Canary，使其可以發出所有沒有 ` CanaryName` 維度發出的請求指標。

 **enableRequestMetrics()** 

啟用所有請求指標，包括每個 Canary 指標和彙總所有 Canary 的指標。

 **enableStepMetrics()** 

啟用所有步驟指標，包括步驟成功指標和步驟持續時間指標。

 **get2xxMetric()** 

傳回 Canary 是否發出具有 ` CanaryName` 維度的 `2xx` 指標。

 **get4xxMetric()** 

傳回 Canary 是否發出具有 ` CanaryName` 維度的 `4xx` 指標。

 **get5xxMetric()** 

傳回 Canary 是否發出具有 ` CanaryName` 維度的 `5xx` 指標。

 **getAggregated2xxMetric()** 

傳回 Canary 是否發出沒有維度的 `2xx` 指標。

 **getAggregated4xxMetric()** 

傳回 Canary 是否發出沒有維度的 `4xx` 指標。

 **getAggregatedFailedCanaryMetric()** 

傳回 Canary 是否發出沒有維度的 `Failed` 指標。

 **getAggregatedFailedRequestsMetric()** 

傳回 Canary 是否發出沒有維度的 `Failed requests` 指標。

 **getAggregated5xxMetric()** 

傳回 Canary 是否發出沒有維度的 `5xx` 指標。

 **getFailedCanaryMetric()** 

傳回 Canary 是否發出具有 ` CanaryName` 維度的 `Failed` 指標。

 **getFailedRequestsMetric()** 

傳回 Canary 是否發出具有 `CanaryName` 維度的 `Failed requests` 指標。

 **getStepDurationMetric()** 

傳回 Canary 是否為此 Canary 發出具有 ` CanaryName` 維度的 `Duration` 指標。

 **getStepSuccessMetric()** 

傳回 Canary 是否為此 Canary 發出具有 ` CanaryName` 維度的 `StepSuccess` 指標。

 **with2xxMetric(\$12xxMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `2xx` 指標。

 **with4xxMetric(\$14xxMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `4xx` 指標。

 **with5xxMetric(\$15xxMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `5xx` 指標。

 **withAggregated2xxMetric(aggregated2xxMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `2xx` 指標。

 **withAggregated4xxMetric(aggregated4xxMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `4xx` 指標。

 **withAggregated5xxMetric(aggregated5xxMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `5xx` 指標。

 ** withAggregatedFailedCanaryMetric(aggregatedFailedCanaryMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `Failed` 指標。

 ** withAggregatedFailedRequestsMetric(aggregatedFailedRequestsMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `Failed requests` 指標。

 **withFailedCanaryMetric(failedCanaryMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `Failed` 指標。

 **withFailedRequestsMetric(failedRequestsMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `Failed requests` 指標。

 **withStepDurationMetric(stepDurationMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `Duration` 指標。

 **withStepSuccessMetric(stepSuccessMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 ` StepSuccess` 指標。

##### 啟用或停用其他功能的方法
<a name="CloudWatch_Synthetics_Library_setConfig_methods"></a>

 **withHarFile()** 

接受布林值引數，它會指定是否為此 Canary 建立 HAR 檔案。

 **withStepsReport()** 

接受布林值引數，它會指定是否為此 Canary 報告步驟摘要。

 **withIncludeUrlPassword()** 

接受布林值引數，它會指定是否要在日誌和報告中包含在 URL 中顯示的密碼。

 **withRestrictedUrlParameters()** 

接受要修訂的 URL 路徑或查詢參數陣列。這適用於出現在日誌、報告和錯誤中的 URL。您可以將星號 (\$1) 傳遞為數值，以修訂所有 URL 路徑和查詢參數值

 **withLogRequest()** 

接受布林值引數，它會指定是否要在 Canary 日誌中記錄每個請求。

 **withLogResponse()** 

接受布林值引數，它會指定是否要在 Canary 日誌中記錄每個回應。

 **withLogRequestBody()** 

接受布林值引數，它會指定是否要在 Canary 日誌中記錄每個請求內文。

 **withLogResponseBody()** 

接受布林值引數，它會指定是否要在 Canary 日誌中記錄每個回應內文。

 **withLogRequestHeaders()** 

接受布林值引數，它會指定是否要在 Canary 日誌中記錄每個請求標頭。

 **withLogResponseHeaders()** 

接受布林值引數，它會指定是否要在 Canary 日誌中記錄每個回應。

 **getHarFile()** 

傳回 Canary 是否建立 HAR 檔案。

 **getStepsReport()** 

傳回 Canary 是否報告步驟執行摘要。

 **getIncludeUrlPassword()** 

傳回 Canary 是否要在日誌和報告中包含在 URL 中顯示的密碼。

 **getRestrictedUrlParameters()** 

傳回 Canary 是否修訂 URL 路徑或查詢參數。

 **getLogRequest()** 

傳回 Canary 是否記錄 Canary 日誌中的每個請求。

 **getLogResponse()** 

傳回 Canary 是否記錄 Canary 日誌中的每個回應。

 **getLogRequestBody()** 

傳回 Canary 是否記錄 Canary 日誌中的每個請求內文。

 **getLogResponseBody()** 

傳回 Canary 是否記錄 Canary 日誌中的每個回應內文。

 **getLogRequestHeaders()** 

傳回 Canary 是否記錄 Canary 日誌中的每個請求標頭。

 **getLogResponseHeaders()** 

傳回 Canary 是否記錄 Canary 日誌中的每個回應標頭。

 **適用於所有 Canary 的函數** 
+ `withIncludeRequestHeaders`(includeRequestHeaders)
+ `withIncludeResponseHeaders`(includeResponseHeaders)
+ `withRestrictedHeaders`(restrictedHeaders)
+ `withIncludeRequestBody`(includeRequestBody)
+ `withIncludeResponseBody`(includeResponseBody)
+ `enableReportingOptions`()— 啟用所有報告選項 – **includeRequestHeaders**、**includeResponseHeaders**、**includeRequestBody** 和 **includeResponseBody**、。
+ `disableReportingOptions`()— 停用所有報告選項 – **includeRequestHeaders**、**includeResponseHeaders**、**includeRequestBody** 和 **includeResponseBody**、。

##### 適用於 UI Canary 的 setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfigUI"></a>

對於 UI Canary，**setConfig** 可以包括下列布林值參數：
+ `continueOnStepFailure` （布林值） — 是否在步驟失敗後繼續執行 Canary 指令碼 （這是指 ** executeStep** 函數）。如果任何步驟失敗，Canary 執行仍將被標記為失敗。預設值為 `false`。
+ `harFile` (布林值)— 是否建立 HAR 檔案。預設值為 `True`。
+ `screenshotOnStepStart` (布林值)— 是否在開始步驟之前擷取螢幕擷取畫面。
+ `screenshotOnStepSuccess` (布林值)— 是否在成功完成步驟之後擷取螢幕擷取畫面。
+ `screenshotOnStepFailure` (布林值)— 是否在步驟失敗之後擷取螢幕擷取畫面。

##### 啟用或停用螢幕擷取畫面的方法
<a name="CloudWatch_Synthetics_Library_setConfig_screenshots"></a>

 **disableStepScreenshots()** 

停用所有螢幕擷取畫面選項 (screenshotOnStepStart、screenshotOnStepSuccess 和 screenshotOnStepFailure)。

 **enableStepScreenshots()** 

啟用所有螢幕擷取畫面選項 (screenshotOnStepStart、screenshotOnStepSuccess 和 screenshotOnStepFailure)。預設不會啟用所有這些方法。

 **getScreenshotOnStepFailure()** 

傳回 Canary 是否在步驟失敗之後擷取螢幕擷取畫面。

 **getScreenshotOnStepStart()** 

傳回 Canary 是否在開始步驟之前擷取螢幕擷取畫面。

 **getScreenshotOnStepSuccess()** 

傳回 Canary 是否在成功完成步驟之後擷取螢幕擷取畫面。

 **withScreenshotOnStepStart(screenshotOnStepStart)** 

接受布林值引數，它會指示是否在開始步驟之前擷取螢幕擷取畫面。

 **withScreenshotOnStepSuccess(screenshotOnStepSuccess)** 

接受布林值引數，它會指示是否在成功完成步驟之後擷取螢幕擷取畫面。

 **withScreenshotOnStepFailure(screenshotOnStepFailure)** 

接受布林值引數，它會指示是否在步驟失敗之後擷取螢幕擷取畫面。

 **在 UI Canary 中的使用方式** 

首先，匯入綜合相依性並擷取組態。

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();
```

然後，使用下列其中一個選項呼叫 setConfig 方法來設定每個選項的組態。

```
// Set configuration values
    synConfig.setConfig({
        screenshotOnStepStart: true, 
        screenshotOnStepSuccess: false,
        screenshotOnStepFailure: false
    });
```

或

```
synConfig.withScreenshotOnStepStart(false).withScreenshotOnStepSuccess(true).withScreenshotOnStepFailure(true)
```

若要停用所有螢幕擷取畫面，請使用本範例中的 `disableStepScreenshots()` 函式。

```
synConfig.disableStepScreenshots();
```

您可以在程式碼中的任何時候啟用和停用螢幕擷取畫面。例如，若只要停用一個步驟的螢幕擷取畫面，請在執行該步驟之前停用這些螢幕擷取畫面，然後在步驟之後予以啟用。

##### 適用於 API Canary 的 setConfig(options)
<a name="CloudWatch_Synthetics_Library_setConfigAPI"></a>

對於 API Canary，**setConfig** 可以包括下列布林值參數：
+ `continueOnHttpStepFailure` (布林值)— 是否在步驟失敗之後繼續執行 Canary 指令碼 (其代表 **executeHttpStep** 函數)。如果任何步驟失敗，Canary 執行仍將被標記為失敗。預設值為 `true`。

#### 視覺化監控
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting"></a>

視覺化監控可比較在 Canary 執行期間擷取的螢幕擷取畫面與基準 Canary 執行期間擷取的螢幕擷取畫面。如果兩個螢幕擷取畫面之間的差異超出臨界值百分比，則 Canary 會失敗，您可以在 Canary 執行報告中看到顏色差異的區域。在執行 **syn-puppeteer-node-3.2** 或更新版本的 Canary 中支援視覺化監控。目前，執行 Python 和 Selenium 的 Canary 不支援它。

若要啟用視覺化監控，請將下列程式碼行新增至 Canary 指令碼。如需詳細資訊，請參閱[SyntheticsConfiguration 類別](#CloudWatch_Synthetics_Library_SyntheticsConfiguration)。

```
syntheticsConfiguration.withVisualCompareWithBaseRun(true);
```

將此行新增至指令碼之後，Canary 第一次成功執行時，它會使用該執行期間擷取的螢幕擷取畫面作為比較基準。在第一次 Canary 執行之後，您可以使用 CloudWatch 主控台編輯 Canary 來執行以下任何操作：
+ 將 Canary 的下一個執行設定為新基準。
+ 在目前的基準螢幕擷取畫面上繪製邊界，以指定要在視覺化比較期間忽略的螢幕擷取畫面區域。
+ 移除用於視覺化監控的螢幕擷取畫面。

如需使用 CloudWatch 主控台編輯 Canary 的詳細資訊，請參閱 [編輯或刪除 Canary](synthetics_canaries_deletion.md)。

 **其他視覺化監控選項** 

 ** syntheticsConfiguration.withVisualVarianceThresholdPercentage(desiredPercentage)** 

在視覺化效果比較中，設定螢幕擷取畫面差異的可接受百分比。

 ** syntheticsConfiguration.withVisualVarianceHighlightHexColor("\$1fafa00")** 

當您查看使用視覺化監控的 Canary 執行報告時，設定指定差異區域的反白顏色。

 ** syntheticsConfiguration.withFailCanaryRunOnVisualVariance(failCanary)** 

設定當有視覺化差異超過閾值時，Canary 是否失敗。預設為 Canary 失敗。

### Synthetics Logger
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger"></a>

Synthetics Logger 會將日誌同時寫入至主控台和相同日誌層級的本機日誌檔案。只有在日誌層級等於或低於呼叫之日誌函數所需的日誌層級時，才會將此日誌檔案同時寫入至這兩個位置。

本機日誌檔案中的日誌陳述式會加上「偵錯」、「資訊」等前綴，以符合呼叫之函數的日誌層級。

您可以使用 SyntheticsLogger，假設您要執行 Synthetics Library 的日誌層級與 Synthetics Canary 日誌相同。

使用 Synthetics Logger 並不需要建立上傳至 S3 結果位置的日誌檔案。您可改為在 ` /tmp` 資料夾中建立不同的日誌檔案。`/tmp` 資料夾下所建立的任何檔案都會上傳至 S3 中的結果位置作為成品。

如何使用 Synthetics 程式庫記錄器：

```
const log = require('@aws/synthetics-logger');
```

實用的函數定義：

 **log.debug(*message*， *ex* )；**

參數：*訊息*是要記錄的訊息。*例如*，如果有，則是要記錄的例外狀況。

範例：

```
log.debug("Starting step - login.");
```

 **log.error(*message*， *ex* )；**

參數：*訊息*是要記錄的訊息。*例如*，如果有，則是要記錄的例外狀況。

範例：

```
try {
  await login();
catch (ex) {
  log.error("Error encountered in step - login.", ex);
}
```

 **log.info (*訊息*，*例如* )；**

參數：*訊息*是要記錄的訊息。*例如*，如果有，則是要記錄的例外狀況。

範例：

```
log.info("Successfully completed step - login.");
```

 **log.log(*message*， *ex* )；**

這是 `log.info` 的別名。

參數：*訊息*是要記錄的訊息。*例如*，如果有，則是要記錄的例外狀況。

範例：

```
 log.log("Successfully completed step - login.");
```

 **log.warn(*message*， *ex* )；**

參數：*訊息*是要記錄的訊息。*例如*，如果有，則是要記錄的例外狀況。

範例：

```
log.warn("Exception encountered trying to publish CloudWatch Metric.", ex);
```

### SyntheticsLogHelper 類別
<a name="CloudWatch_Synthetics_Library_SyntheticsLogHelper"></a>

`SyntheticsLogHelper` 類別在執行時間 ` syn-nodejs-puppeteer-3.2` 和更新版本的執行時間中可用。它已經在 CloudWatch Synthetics 程式庫中初始化，並使用 Synthetics 組態進行設定。您可以在指令碼中將其新增為相依性。此類別可讓您淨化 URL、標頭和錯誤訊息，以修訂敏感資訊。

**注意**  
Synthetics 會根據 Synthetics 器組態設定 `restrictedUrlParameters`，淨化其記錄的所有 URL 和錯誤訊息，然後在將它們納入日誌、報告、HAR 檔案和 Canary 執行錯誤。僅當您在指令碼中記錄 URL 或錯誤時，才必須使用 ` getSanitizedUrl` 或 `getSanitizedErrorMessage`。Synthetics 不會存放任何 Canary 成品，除了指令碼擲出的 Canary 錯誤。Canary 執行成品會存放於您的客戶帳戶中。如需詳細資訊，請參閱[Synthetics Canary 的安全考量](servicelens_canaries_security.md)。

**Topics**
+ [getSanitizedUrl(url, stepConfig = null)](#CloudWatch_Synthetics_Library_getSanitizedUrl)
+ [getSanitizedErrorMessage](#CloudWatch_Synthetics_Library_getSanitizedErrorMessage)
+ [getSanitizedHeaders(headers, stepConfig=null)](#CloudWatch_Synthetics_Library_getSanitizedHeaders)

#### getSanitizedUrl(url, stepConfig = null)
<a name="CloudWatch_Synthetics_Library_getSanitizedUrl"></a>

此功能在 `syn-nodejs-puppeteer-3.2` 和更新版本中可用。它會傳回基於配置淨化的 url 字串。您可以透過設定屬性 `restrictedUrlParameters` 來選擇修訂敏感的 URL 參數，例如密碼和 access\$1token。預設情況下，URL 中的密碼已經修訂。如果需要，您可以啟用 URL 密碼，方法是將 `includeUrlPassword` 設定為 true。

如果傳入的 URL 不是有效的 URL，則此函數會擲回錯誤。

 **參數** 
+ *url* 是一個字串，且是要淨化的 URL。
+  *stepConfig* (選用) 會覆寫此函數的全域 Synthetics 組態。如果沒有傳入 `stepConfig`，則全域組態可用於淨化 URL。

 **範例** 

這個範例會使用下列範本 URL：` https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200`。在此範例中，`access_token` 包含您不應該記錄的敏感資訊。請注意，Synthetics 服務不會存放任何 Canary 執行成品。日誌、螢幕擷取畫面和報告等成品都儲存在客戶帳戶中的 Simple Storage Service (Amazon S3) 儲存貯體中。

第一步是設定 Synthetics 組態。

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Import Synthetics logger for logging url
const log = require('@aws/synthetics-logger');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();

// Set restricted parameters
synConfig.setConfig({
   restrictedUrlParameters: ['access_token'];
});
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('URL');



const urlConfig = {
   restrictedUrlParameters = ['*']
};
const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('URL', urlConfig);
logger.info('My example url is: ' + sanitizedUrl);
```

接下來，淨化並記錄 URL

```
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200');
```

這樣一來，將在您的 Canary 日誌中記錄以下內容。

```
My example url is: https://example.com/learn/home?access_token=REDACTED&token_type=Bearer&expires_in=1200
```

您可以傳入包含 Synthetics 組態選項的選用參數，以覆寫 URL 的 Synthetics 組態，如下列範例所示。

```
const urlConfig = {
   restrictedUrlParameters = ['*']
};
const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl('https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200', urlConfig);
logger.info('My example url is: ' + sanitizedUrl);
```

上述範例會修訂所有查詢參數，並記錄如下：

```
My example url is: https://example.com/learn/home?access_token=REDACTED&token_type=REDACTED&expires_in=REDACTED
```

#### getSanitizedErrorMessage
<a name="CloudWatch_Synthetics_Library_getSanitizedErrorMessage"></a>

此功能在 `syn-nodejs-puppeteer-3.2` 和更新版本中可用。它可透過淨化基於 Synthetics 組態存在的任何 URL 傳回淨化的錯誤字串。當您呼叫此函數時，您可以選擇覆寫全域 Synthetics 組態，方法是傳遞選用 `stepConfig` 參數。

 **參數** 
+ *錯誤*是要淨化的錯誤。它可以是一個 Error 物件或一個字串。
+  *stepConfig* (選用) 會覆寫此函數的全域 Synthetics 組態。如果沒有傳入 `stepConfig`，則全域組態可用於淨化 URL。

 **範例** 

此範例使用下列錯誤：` Failed to load url: https://example.com/learn/home?access_token=12345&token_type=Bearer&expires_in=1200`

第一步是設定 Synthetics 組態。

```
// Import Synthetics dependency
const synthetics = require('@aws/synthetics-puppeteer');

// Import Synthetics logger for logging url
const log = require('@aws/synthetics-logger');

// Get Synthetics configuration
const synConfig = synthetics.getConfiguration();

// Set restricted parameters
synConfig.setConfig({
   restrictedUrlParameters: ['access_token'];
});
```

接下來，淨化並記錄錯誤消息

```
// Import SyntheticsLogHelper dependency
const syntheticsLogHelper = require('@aws/synthetics-log-helper');

try {
   // Your code which can throw an error containing url which your script logs
} catch (error) {
    const sanitizedErrorMessage = syntheticsLogHelper.getSanitizedErrorMessage(errorMessage);
    logger.info(sanitizedErrorMessage);
}
```

這樣一來，將在您的 Canary 日誌中記錄以下內容。

```
Failed to load url: https://example.com/learn/home?access_token=REDACTED&token_type=Bearer&expires_in=1200
```

#### getSanitizedHeaders(headers, stepConfig=null)
<a name="CloudWatch_Synthetics_Library_getSanitizedHeaders"></a>

此功能在 `syn-nodejs-puppeteer-3.2` 和更新版本中可用。它會傳回基於 ` syntheticsConfiguration` 的 `restrictedHeaders` 屬性而淨化的標頭。`restrictedHeaders` 屬性中指定的標頭會從日誌、HAR 檔案和報告中進行修訂。

 **參數** 
+ *標頭*是一個包含要淨化的標頭的物件。
+ *stepConfig* (選用) 會覆寫此函數的全域 Synthetics 組態。如果 `stepConfig` 沒有傳入，則全域組態可用於淨化標頭。

## 僅適用於 UI Canary 的 Node.js 程式庫類別和函數
<a name="CloudWatch_Synthetics_Library_UIcanaries"></a>

下列適用於 Node.js 的 CloudWatch Synthetics 程式庫函數僅可用於 UI Canary。

**Topics**
+ [Synthetics 類別](#CloudWatch_Synthetics_Library_Synthetics_Class)
+ [BrokenLinkCheckerReport 類別](#CloudWatch_Synthetics_Library_BrokenLinkCheckerReport)
+ [Synthetics 類別](#CloudWatch_Synthetics_Library_SyntheticsLink)

### Synthetics 類別
<a name="CloudWatch_Synthetics_Library_Synthetics_Class"></a>

以下函數都在 Synthetics 類別中。

**Topics**
+ [async addUserAgent(page, userAgentString);](#CloudWatch_Synthetics_Library_addUserAgent)
+ [async executeStep(stepName, functionToExecute, [stepConfig]);](#CloudWatch_Synthetics_Library_executeStep)
+ [getDefaultLaunchOptions();](#CloudWatch_Synthetics_Library_getDefaultLaunchOptions)
+ [getPage();](#CloudWatch_Synthetics_Library_getPage)
+ [getRequestResponseLogHelper();](#CloudWatch_Synthetics_Library_getRequestResponseLogHelper)
+ [launch(options)](#CloudWatch_Synthetics_Library_LaunchOptions)
+ [RequestResponseLogHelper class](#CloudWatch_Synthetics_Library_RequestResponseLogHelper)
+ [setRequestResponseLogHelper();](#CloudWatch_Synthetics_Library_setRequestResponseLogHelper)
+ [async takeScreenshot(name, suffix);](#CloudWatch_Synthetics_Library_takeScreenshot)

#### async addUserAgent(page, userAgentString);
<a name="CloudWatch_Synthetics_Library_addUserAgent"></a>

此函數會將 *userAgentString* 附加至指定頁面的使用者代理程式標頭。

範例：

```
await synthetics.addUserAgent(page, "MyApp-1.0");
```

頁面使用者代理程式標頭中的結果設為 ` browsers-user-agent-header-valueMyApp-1.0`

#### async executeStep(stepName, functionToExecute, [stepConfig]);
<a name="CloudWatch_Synthetics_Library_executeStep"></a>

執行提供的步驟，使用開始/通過/失敗記錄、開始/通過/失敗螢幕擷取畫面及通過/失敗和持續時間指標進行包裝。

**注意**  
如果您是使用 `syn-nodejs-2.1` 或更新版本的執行時間，您可以設定是否擷取螢幕擷取畫面以及何時擷取。如需詳細資訊，請參閱[SyntheticsConfiguration 類別](#CloudWatch_Synthetics_Library_SyntheticsConfiguration)。

`executeStep` 函數還會執行下列操作：
+ 記錄步驟已開始。
+ 建立名為 `<stepName>-starting` 的螢幕擷取畫面。
+ 啟動計時器。
+ 執行提供的函數。
+ 如果函數正常傳回結果，則會計為通過。如果函數擲回錯誤，則會計為失敗。
+ 結束計時器。
+ 記錄步驟是否已通過或失敗
+ 建立名為 `<stepName>-succeeded` 或 ` <stepName>-failed` 的螢幕擷取畫面。
+ 發出 `stepName` `SuccessPercent` 指標，100 代表通過，0 代表失敗。
+ 發出 `stepName` `Duration` 指標，顯示根據步驟開始和結束時間的值。
+ 最後，傳回 `functionToExecute` 已傳回的結果，或重新擲回 `functionToExecute` 已擲回的錯誤。

如果 canary 使用 `syn-nodejs-2.0` 執行時間或更新版本，此函數也會將步驟執行摘要新增至 Canary 報告。摘要包括每個步驟的詳細資訊，例如開始時間、結束時間、狀態 (通過/失敗)、失敗原因 (如果失敗)，以及每個步驟執行期間擷取的螢幕擷取畫面。

範例：

```
await synthetics.executeStep('navigateToUrl', async function (timeoutInMillis = 30000) {
           await page.goto(url, {waitUntil: ['load', 'networkidle0'], timeout: timeoutInMillis});});
```

回應：

傳回 `functionToExecute` 所傳回的結果。

 **syn-nodejs-2.2 更新** 

從 `syn-nodejs-2.2` 開始，您可以選擇性地傳遞步驟組態，以在步驟層級覆寫 CloudWatch Synthetics 組態。如需可傳遞至 `executeStep` 的選項清單，請參閱 [SyntheticsConfiguration 類別](#CloudWatch_Synthetics_Library_SyntheticsConfiguration)。

下列範例會將 ` continueOnStepFailure` 的預設 `false` 組態覆寫為 `true`，並指定何時擷取螢幕擷取畫面。

```
var stepConfig = {
    'continueOnStepFailure': true,
    'screenshotOnStepStart': false,
    'screenshotOnStepSuccess': true,
    'screenshotOnStepFailure': false
}

await executeStep('Navigate to amazon', async function (timeoutInMillis = 30000) {
      await page.goto(url, {waitUntil: ['load', 'networkidle0'], timeout: timeoutInMillis});
 }, stepConfig);
```

#### getDefaultLaunchOptions();
<a name="CloudWatch_Synthetics_Library_getDefaultLaunchOptions"></a>

`getDefaultLaunchOptions()` 函數會傳回 CloudWatch Synthetics 使用的瀏覽器啟動選項。如需詳細資訊，請參閱 [LaunchOptions type](https://pptr.dev/browsers-api/browsers.launchoptions/) 

```
// This function returns default launch options used by Synthetics.
const defaultOptions = await synthetics.getDefaultLaunchOptions();
```

#### getPage();
<a name="CloudWatch_Synthetics_Library_getPage"></a>

以 Puppeteer 物件形式傳回目前已開啟的頁面。如需詳細資訊，請參閱 [Puppeteer API v1.14.0](https://github.com/puppeteer/puppeteer/blob/v1.14.0/docs/api.md)。

範例：

```
let page = await synthetics.getPage();
```

回應：

在目前瀏覽器工作階段中目前開啟的頁面 (Puppeteer 物件)。

#### getRequestResponseLogHelper();
<a name="CloudWatch_Synthetics_Library_getRequestResponseLogHelper"></a>

**重要**  
在使用 `syn-nodejs-puppeteer-3.2` 執行時間或更新版本的 Canary 中，此函數會與 `RequestResponseLogHelper` 類別一起被取代。此函數的任何用法都會導致您的 Canary 日誌中出現警告。未來的執行時間版本中將會移除此函數。如果您正在使用此函數，請改用 [RequestResponseLogHelper class](#CloudWatch_Synthetics_Library_RequestResponseLogHelper)。

使用此函數作為建置器模式，調整請求和回應日誌旗標。

範例：

```
synthetics.setRequestResponseLogHelper(getRequestResponseLogHelper().withLogRequestHeaders(false));;
```

回應：

```
{RequestResponseLogHelper}
```

#### launch(options)
<a name="CloudWatch_Synthetics_Library_LaunchOptions"></a>

此函數的選項僅適用於 `syn-nodejs-2.1` 執行時間版本或更新版本。

此函數僅用於 UI Canary。它會關閉現有的瀏覽器並啟動一個新的瀏覽器。

**注意**  
CloudWatch Synthetics 始終會在開始執行指令碼之前啟動瀏覽器。除非您想啟動具有自訂選項的新瀏覽器，否則不需要呼叫 launch()。

(選項) 是可設定選項集，可在瀏覽器上設定。如需詳細資訊，請參閱[啟動選項類型](https://pptr.dev/browsers-api/browsers.launchoptions/)。

如果您在沒有選項的情況下呼叫此函數，Synthetics 會啟動具有預設引數、`executablePath` 和 `defaultViewport` 的瀏覽器。CloudWatch Synthetics 中的預設檢視區是 1920 x 1080。

您可以覆寫 CloudWatch Synthetics 使用的啟動參數，並在啟動瀏覽器時傳遞其他參數。例如，下面的程式碼片段啟動瀏覽器，具有預設引數和預設的可執行文件路徑，但具有 800 x 600 的檢視口。

```
await synthetics.launch({
        defaultViewport: { 
            "deviceScaleFactor": 1, 
            "width": 800,
            "height": 600 
    }});
```

下列範本程式碼會向新的 `ignoreHTTPSErrors` 參數新增至 CloudWatch Synthetics 啟動參數：

```
await synthetics.launch({
        ignoreHTTPSErrors: true
 });
```

您可以透過將 `--disable-web-security` 旗標新增至 CloudWatch Synthetics 啟動參數中的引數：

```
// This function adds the --disable-web-security flag to the launch parameters
const defaultOptions = await synthetics.getDefaultLaunchOptions();
const launchArgs = [...defaultOptions.args, '--disable-web-security'];
await synthetics.launch({
     args: launchArgs
  });
```

#### RequestResponseLogHelper class
<a name="CloudWatch_Synthetics_Library_RequestResponseLogHelper"></a>

**重要**  
在使用 `syn-nodejs-puppeteer-3.2` 執行時間或更新版本的 Canary 中，此類別會被取代。此類別的任何用法都會導致您的 Canary 日誌中出現警告。未來的執行時間版本中將會移除此函數。如果您正在使用此函數，請改用 [RequestResponseLogHelper class](#CloudWatch_Synthetics_Library_RequestResponseLogHelper)。

處理精細定義的組態以及請求和回應承載字串顯示方式的建立。

```
class RequestResponseLogHelper {
 
    constructor () {
        this.request = {url: true, resourceType: false, method: false, headers: false, postData: false};
        this.response = {status: true, statusText: true, url: true, remoteAddress: false, headers: false};
    }
 
    withLogRequestUrl(logRequestUrl);
    
    withLogRequestResourceType(logRequestResourceType);
    
    withLogRequestMethod(logRequestMethod);
    
    withLogRequestHeaders(logRequestHeaders);
    
    withLogRequestPostData(logRequestPostData);

        
    withLogResponseStatus(logResponseStatus);
    
    withLogResponseStatusText(logResponseStatusText);
   
    withLogResponseUrl(logResponseUrl);
 
    withLogResponseRemoteAddress(logResponseRemoteAddress);
    
    withLogResponseHeaders(logResponseHeaders);
```

範例：

```
synthetics.setRequestResponseLogHelper(getRequestResponseLogHelper()
.withLogRequestPostData(true)
.withLogRequestHeaders(true)
.withLogResponseHeaders(true));
```

回應：

```
{RequestResponseLogHelper}
```

#### setRequestResponseLogHelper();
<a name="CloudWatch_Synthetics_Library_setRequestResponseLogHelper"></a>

**重要**  
在使用 `syn-nodejs-puppeteer-3.2` 執行時間或更新版本的 Canary 中，此函數會與 `RequestResponseLogHelper` 類別一起被取代。此函數的任何用法都會導致您的 Canary 日誌中出現警告。未來的執行時間版本中將會移除此函數。如果您正在使用此函數，請改用 [RequestResponseLogHelper class](#CloudWatch_Synthetics_Library_RequestResponseLogHelper)。

使用此函數作為建置器模式，設定請求和回應日誌旗標。

範例：

```
synthetics.setRequestResponseLogHelper().withLogRequestHeaders(true).withLogResponseHeaders(true);
```

回應：

```
{RequestResponseLogHelper}
```

#### async takeScreenshot(name, suffix);
<a name="CloudWatch_Synthetics_Library_takeScreenshot"></a>

使用名稱和尾碼 (選用)，擷取目前頁面的螢幕擷取畫面 (.PNG)。

範例：

```
await synthetics.takeScreenshot("navigateToUrl", "loaded")
```

此範例會捕獲並上傳名為 ` 01-navigateToUrl-loaded.png` 的螢幕擷取畫面至 Canary 的 S3 儲存貯體。

您可以透過將 ` stepName` 傳遞為第一個參數，擷取特定 Canary 的螢幕擷取畫面。螢幕擷取畫面會連結至報告中的 Canary 步驟，以協助您在偵錯時追蹤每個步驟。

CloudWatch Synthetics Canary 會在開始步驟之前 (`executeStep` 函數)，並在步驟完成後自動擷取螢幕擷取畫面 (除非您將 Canary 設定為停用螢幕擷取畫面)。您可以透過在 `takeScreenshot` 函數中傳入步驟名稱，來擷取更多的螢幕擷取畫面。

下列範例以 `signupForm` 為 `stepName` 的值擷取了螢幕擷取畫面。螢幕擷取畫面會命名為` 02-signupForm-address`，並將連結到 Canary 報告中名為 ` signupForm` 的步驟

```
await synthetics.takeScreenshot('signupForm', 'address')
```

### BrokenLinkCheckerReport 類別
<a name="CloudWatch_Synthetics_Library_BrokenLinkCheckerReport"></a>

此類別提供了新增綜合連結的方法。它只支援使用執行時間的 `syn-nodejs-2.0-beta` 版本或更新版本的 Canary。

若要使用 `BrokenLinkCheckerReport`，請在指令碼中包含下列幾行：

```
const BrokenLinkCheckerReport = require('@aws/synthetics-broken-link-checker-report');
            
const brokenLinkCheckerReport = new BrokenLinkCheckerReport();
```

實用的函數定義：

 **addLink(*syntheticsLink*, isBroken)** 

` syntheticsLink ` 是可代表連結的 ` SyntheticsLink` 物件。該函數可根據狀態碼新增連結。根據預設，如果狀態碼不可用或狀態碼為 400 或更高，則會將連結視為中斷。您可以透過傳入值為 `true` 或 `false` 的選用參數 `isBrokenLink` 來覆寫此預設行為。

此函數沒有傳回值。

 **getLinks()** 

此函數會傳回包含在中斷連結檢查程式報告中的 `SyntheticsLink` 物件陣列。

 **getTotalBrokenLinks()** 

該函數會傳回表示中斷連結總數的數字。

 **getTotalLinksChecked()** 

該函數會傳回一個數字，表示報告中包含的中斷連結總數。

 **如何使用 BrokenLinkCheckerReport** 

下面的 Canary 指令碼程式碼片段示範了導覽至連結，並將其新增至中斷連結檢查程式報告的範例。

1. 匯入 `SyntheticsLink`、`BrokenLinkCheckerReport` 及 ` Synthetics`。

   ```
   const BrokenLinkCheckerReport = require('@aws/synthetics-broken-link-checker-report');
   const SyntheticsLink = require('@aws/synthetics-link');
   
   // Synthetics dependency
   const synthetics = require('@aws/synthetics-puppeteer');
   ```

1. 若要將連結新增至報告，請建立 ` BrokenLinkCheckerReport` 的執行個體。

   ```
   let brokenLinkCheckerReport = new BrokenLinkCheckerReport();
   ```

1. 導覽至 URL 並將其新增至中斷連結檢查程式報告。

   ```
   let url = "https://amazon.com";
   
   let syntheticsLink = new SyntheticsLink(url);
   
   // Navigate to the url.
   let page = await synthetics.getPage();
   
   // Create a new instance of Synthetics Link
   let link = new SyntheticsLink(url)
   
   try {
       const response = await page.goto(url, {waitUntil: 'domcontentloaded', timeout: 30000});
   } catch (ex) {
       // Add failure reason if navigation fails.
       link.withFailureReason(ex);
   }
   
   if (response) {
       // Capture screenshot of destination page
       let screenshotResult = await synthetics.takeScreenshot('amazon-home', 'loaded');
      
       // Add screenshot result to synthetics link
       link.addScreenshotResult(screenshotResult);
   
       // Add status code and status description to the link
       link.withStatusCode(response.status()).withStatusText(response.statusText())
   }
   
   // Add link to broken link checker report.
   brokenLinkCheckerReport.addLink(link);
   ```

1. 將報告新增至 Synthetics。如此一來，將針對每個 Canary 執行在您的 S3 儲存貯體中建立一個名為 ` BrokenLinkCheckerReport.json` JSON 檔案。您可以在主控台中看到每個 Canary 執行的連結報告，以及螢幕擷取畫面、日誌和 HAR 檔案。

   ```
   await synthetics.addReport(brokenLinkCheckerReport);
   ```

### Synthetics 類別
<a name="CloudWatch_Synthetics_Library_SyntheticsLink"></a>

此類別提供了可包裝資訊的方法。它只支援使用執行時間的 `syn-nodejs-2.0-beta` 版本或更新版本的 Canary 。

若要使用 `SyntheticsLink`，請在指令碼中包含下列幾行：

```
const SyntheticsLink = require('@aws/synthetics-link');

const syntheticsLink = new SyntheticsLink("https://www.amazon.com");
```

此函數會傳回 `syntheticsLinkObject`

實用的函數定義：

 **withUrl(*url*)** 

` url ` 是 URL 字串。此函數會傳回 `syntheticsLinkObject`

 **withText(*text*)** 

` text ` 是可表示錨點文字的字串。此函數會傳回 `syntheticsLinkObject`。它增加了對應於連結的錨點文本。

 **withParentUrl(*parentUrl*)** 

` parentUrl ` 是可表示父 (源頁面) URL 的字串。此函數會傳回 `syntheticsLink Object`

 **withStatusCode(*statusCode*)** 

` statusCode ` 是表示狀態碼的字串。此函數會傳回 `syntheticsLinkObject`

 **withFailureReason(*failureReason*)** 

` failureReason ` 是表示失敗原因的字串。此函數會傳回 `syntheticsLink Object`

 **addScreenshotResult(*screenshotResult*)** 

` screenshotResult ` 是物件。它是由 Synthetics 函數 `takeScreenshot` 傳回的 `ScreenshotResult` 的執行個體。物件包含以下屬性：
+ `fileName`— 表示 ` screenshotFileName` 的字串
+ `pageUrl` (選用)
+ `error` (選用)

## 僅適用於 API Canary 的 Node.js 程式庫類別和函數
<a name="CloudWatch_Synthetics_Library_APIcanaries"></a>

下列適用於 Node.js 的 CloudWatch Synthetics 程式庫函數僅可用於 API Canary。

**Topics**
+ [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](#CloudWatch_Synthetics_Library_executeHttpStep)

### executeHttpStep(stepName, requestOptions, [callback], [stepConfig])
<a name="CloudWatch_Synthetics_Library_executeHttpStep"></a>

執行提供的 HTTP 請求作為一個步驟，並發布 `SuccessPercent` (通過/失敗) 和 `Duration` 指標。

**executeHttpStep** 根據請求中指定的通訊協定，深入使用 HTTP 或 HTTPS 原生函數。

此函數也會將步驟執行摘要新增至 Canary 報告。摘要包含每個 HTTP 請求的詳細資訊，如下所示：
+ 開始時間
+ 結束時間
+ 狀態 (通過/失敗)
+ 失敗的原因，如果失敗
+ HTTP 呼叫詳細資訊，如請求/回應標頭、內文、狀態碼、狀態訊息和效能計時。

**Topics**
+ [Parameters](#CloudWatch_Synthetics_Library_executeHttpStep_parameters)
+ [使用 executeHttpStep 的範例](#CloudWatch_Synthetics_Library_executeHttpStep_examples)

#### Parameters
<a name="CloudWatch_Synthetics_Library_executeHttpStep_parameters"></a>

 **stepName(*String*)** 

指定步驟的名稱。此名稱也可用於發布此步驟的 CloudWatch 指標。

 **requestOptions(*Object or String*)** 

此參數的值可以是 URL、URL 字串或物件。如果它是一個物件，那麼它必須是可設定的選項組，以發出 HTTP 請求。它支援 Node.js 文件中的 [ http.request(options[, callback])](https://nodejs.org/api/http.html#http_http_request_options_callback) 的所有選項。

除了這些 Node.js 選項之外，**requestOptions** 支援其他參數 `body`。您可以使用 `body` 參數將資料作為請求內文進行傳遞。

 **callback(*response*)** 

(選用) 這是使用 HTTP 回應呼叫的使用者函數。回應的類型為 [Class: http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage)。

 **stepConfig(*object*)** 

(選用) 使用此參數，以此步驟的不同組態覆寫全域綜合組態。

#### 使用 executeHttpStep 的範例
<a name="CloudWatch_Synthetics_Library_executeHttpStep_examples"></a>

以下範例系列會建立會相互建置，以說明此選項的各種用途。

這第一個範例設定了請求參數。您可以傳遞 URL 做為 ** requestOptions**：

```
let requestOptions = 'https://www.amazon.com';
```

或者你可以傳遞選項集：

```
let requestOptions = {
        'hostname': 'myproductsEndpoint.com',
        'method': 'GET',
        'path': '/test/product/validProductName',
        'port': 443,
        'protocol': 'https:'
    };
```

下一個範例會建立接受回應的回呼函數。預設情況下，如果未指定**回呼**，CloudWatch Synthetics 會驗證狀態是否介於 200 到 299 之間。

```
// Handle validation for positive scenario
    const callback = async function(res) {
        return new Promise((resolve, reject) => {
            if (res.statusCode < 200 || res.statusCode > 299) {
                throw res.statusCode + ' ' + res.statusMessage;
            }
     
            let responseBody = '';
            res.on('data', (d) => {
                responseBody += d;
            });
     
            res.on('end', () => {
                // Add validation on 'responseBody' here if required. For ex, your status code is 200 but data might be empty
                resolve();
            });
        });
    };
```

下一個範例會為此步驟建立覆寫全域 CloudWatch Synthetics 組態的組態。此範例中的步驟組態允許在您的報告中包含請求標頭、回應標頭、請求內文 (發佈資料) 和回應內文，並限制 'X-Amz-Security-Token' 和 'Authorization' 標頭值。根據預設，基於安全性考量，這些值不會包含在報告中。如果選擇包含它們，則資料只會存放於 S3 儲存貯體中。

```
// By default headers, post data, and response body are not included in the report for security reasons. 
// Change the configuration at global level or add as step configuration for individual steps
let stepConfig = {
    includeRequestHeaders: true, 
    includeResponseHeaders: true,
    restrictedHeaders: ['X-Amz-Security-Token', 'Authorization'], // Restricted header values do not appear in report generated.
    includeRequestBody: true,
    includeResponseBody: true
};
```

這最後一個範例會將您的請求傳遞給 **executeHttpStep**，並命名步驟。

```
await synthetics.executeHttpStep('Verify GET products API', requestOptions, callback, stepConfig);
```

透過這組範例，CloudWatch Synthetics 會新增報告中每個步驟的詳細資料，並使用 **stepName**。

 您將看見適用於 `Verify GET products API` 步驟的 `successPercent` 和`duration`的 指標步驟。您可以監控 API 呼叫步驟的指標，以監控您的 API 效能。

如需使用這些函數的完整指令碼範例，請參閱 [多步驟 API Canary](CloudWatch_Synthetics_Canaries_Samples.md#CloudWatch_Synthetics_Canaries_Samples_APIsteps)。

# 可用於使用 Selenium 的 Python Canary 指令碼的程式庫函數
<a name="CloudWatch_Synthetics_Canaries_Library_Python"></a>

本區段列出了適用於 Python Canary 指令碼的 Selenium 程式庫函數

**Topics**
+ [適用於所有 Canary 的 Python 和 Selenium 程式庫類別和函數](#CloudWatch_Synthetics_Library_allcanaries_Python)
+ [僅適用於 UI Canary 的 Python 和 Selenium 程式庫類別和函數](#CloudWatch_Synthetics_Library_Python_UIcanaries)

## 適用於所有 Canary 的 Python 和 Selenium 程式庫類別和函數
<a name="CloudWatch_Synthetics_Library_allcanaries_Python"></a>

下列適用於 Python 的 CloudWatch Synthetics Selenium 程式庫函數可用於所有 Canary。

**Topics**
+ [SyntheticsConfiguration 類別](#CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python)
+ [SyntheticsLogger 類別](#CloudWatch_Synthetics_Library_SyntheticsLogger_Python)

### SyntheticsConfiguration 類別
<a name="CloudWatch_Synthetics_Library_SyntheticsConfiguration_Python"></a>

您可以使用 SyntheticsConfiguration 類別來設定 Synthetics 程式庫函數的行為。例如，您可以使用此類別來將 ` executeStep()` 函數設定為不擷取螢幕擷取畫面。

您可以在全域層級設定 CloudWatch Synthetics 組態。

函數定義：

#### set\$1config(options)
<a name="CloudWatch_Synthetics_Library_setConfig_Python"></a>

```
from aws_synthetics.common import synthetics_configuration
```

` options ` 是一個物件，適用於您的 Canary 的可設定選項集。以下各節會說明了 ` options ` 中的可能欄位。
+ `screenshot_on_step_start` (布林值)— 是否在開始步驟之前擷取螢幕擷取畫面。
+ `screenshot_on_step_success` (布林值)— 是否在成功完成步驟之後擷取螢幕擷取畫面。
+ `screenshot_on_step_failure` (布林值)— 是否在步驟失敗之後擷取螢幕擷取畫面。

 **with\$1screenshot\$1on\$1step\$1start(screenshot\$1on\$1step\$1start)** 

接受布林值引數，它會指示是否在開始步驟之前擷取螢幕擷取畫面。

 **with\$1screenshot\$1on\$1step\$1success(screenshot\$1on\$1step\$1success)** 

接受布林值引數，它會指示是否在成功完成步驟之後擷取螢幕擷取畫面。

 **with\$1screenshot\$1on\$1step\$1failure(screenshot\$1on\$1step\$1failure)** 

接受布林值引數，它會指示是否在步驟失敗之後擷取螢幕擷取畫面。

 **get\$1screenshot\$1on\$1step\$1start()** 

傳回是否在開始步驟之前擷取螢幕擷取畫面。

 **get\$1screenshot\$1on\$1step\$1success()** 

傳回是否在成功完成步驟之後擷取螢幕擷取畫面。

 **get\$1screenshot\$1on\$1step\$1failure()** 

傳回是否在步驟失敗之後擷取螢幕擷取畫面。

 **disable\$1step\$1screenshots()** 

停用所有螢幕擷取畫面選項 (get\$1screenshot\$1on\$1step\$1start、get\$1screenshot\$1on\$1step\$1success 和 get\$1screenshot\$1on\$1step\$1failure)。

 **enable\$1step\$1screenshots()** 

啟用所有螢幕擷取畫面選項 (get\$1screenshot\$1on\$1step\$1start、get\$1screenshot\$1on\$1step\$1success 和 get\$1screenshot\$1on\$1step\$1failure)。預設不會啟用所有這些方法。

 **關於 CloudWatch 指標的 setConfig(options)** 

對於使用 `syn-python-selenium-1.1`或更新版本的 Canary，**setConfig** 的 **（選項）** 可以包含下列布林值參數，以決定 Canary 發佈哪些指標。這些選項的預設值為 `true`。以 ` aggregated` 開頭的選項可判斷是否會發出沒有 ` CanaryName` 維度的指標。您可以使用這些指標來查看所有 Canary 的彙總結果。其他選項可判斷是否會發出具有 `CanaryName` 維度的指標。您可以使用這些指標來查看每個 Canary 的結果。

如需 Canary 發出的 CloudWatch 指標清單，請參閱 [Canary 公佈的 CloudWatch 指標](CloudWatch_Synthetics_Canaries_metrics.md)。
+ `failed_canary_metric` (布林值)— 是否為此 canary 發出 ` Failed` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `failed_requests_metric` (布林值)— 是否為此 canary 發出 `Failed requests` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `2xx_metric` (布林值)— 是否為此 canary 發出 `2xx` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `4xx_metric` (布林值)— 是否為此 canary 發出 `4xx` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `5xx_metric` (布林值)— 是否為此 canary 發出 `5xx` 指標 (具有 `CanaryName` 維度)。預設值為 `true`。
+ `step_duration_metric` (布林值)— 是否為此 canary 發出 `Step duration` 指標 (具有 `CanaryName` `StepName` 維度)。預設值為 `true`。
+ `step_success_metric` (布林值)— 是否為此 canary 發出 `Step success` 指標 (具有 `CanaryName` `StepName` 維度)。預設值為 `true`。
+ `aggregated_failed_canary_metric` (布林值)— 是否為此 canary 發出 `Failed` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated_failed_requests_metric` (布林值)— 是否為此 canary 發出 `Failed Requests` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated_2xx_metric` (布林值)— 是否為此 canary 發出 ` 2xx` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated_4xx_metric` (布林值)— 是否為此 canary 發出 ` 4xx` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。
+ `aggregated_5xx_metric` (布林值)— 是否為此 canary 發出 ` 5xx` 指標 (沒有 `CanaryName` 維度)。預設值為 `true`。

 **with\$12xx\$1metric(2xx\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `2xx` 指標。

 **with\$14xx\$1metric(4xx\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `4xx` 指標。

 **with\$15xx\$1metric(5xx\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `5xx` 指標。

 **withAggregated2xxMetric(aggregated2xxMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `2xx` 指標。

 **withAggregated4xxMetric(aggregated4xxMetric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `4xx` 指標。

 **with\$1aggregated\$15xx\$1metric(aggregated\$15xx\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `5xx` 指標。

 ** with\$1aggregated\$1failed\$1canary\$1metric(aggregated\$1failed\$1canary\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `Failed` 指標。

 ** with\$1aggregated\$1failed\$1requests\$1metric(aggregated\$1failed\$1requests\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出沒有維度的 `Failed requests` 指標。

 **with\$1failed\$1canary\$1metric(failed\$1canary\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `Failed` 指標。

 **with\$1failed\$1requests\$1metric(failed\$1requests\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `Failed requests` 指標。

 **with\$1step\$1duration\$1metric(step\$1duration\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `Duration` 指標。

 **with\$1step\$1success\$1metric(step\$1success\$1metric)** 

接受布林值引數，它會指定是否為此 Canary 發出具有 `CanaryName` 維度的 `StepSuccess` 指標。

##### 啟用或停用指標的方法
<a name="CloudWatch_Synthetics_Python_setConfig_metrics"></a>

 **disable\$1aggregated\$1request\$1metrics()** 

禁止 Canary 發出所有沒有 ` CanaryName` 維度發出的請求指標。

 **disable\$1request\$1metrics()** 

停用所有請求指標，包括每個 Canary 指標和彙總所有 Canary 的指標。

 **disable\$1step\$1metrics()** 

停用所有步驟指標，包括步驟成功指標和步驟持續時間指標。

 **enable\$1aggregated\$1request\$1metrics()** 

啟用 Canary，使其可以發出所有沒有 ` CanaryName` 維度發出的請求指標。

 **enable\$1request\$1metrics()** 

啟用所有請求指標，包括每個 Canary 指標和彙總所有 Canary 的指標。

 **enable\$1step\$1metrics()** 

啟用所有步驟指標，包括步驟成功指標和步驟持續時間指標。

 **在 UI Canary 中的使用方式** 

首先，匯入綜合相依性並擷取組態。然後，使用下列其中一個選項呼叫 setConfig 方法來設定每個選項的組態。

```
from aws_synthetics.common import synthetics_configuration

synthetics_configuration.set_config(
     {
        "screenshot_on_step_start": False,
        "screenshot_on_step_success": False,
        "screenshot_on_step_failure": True
     }
)

or
```

或

```
synthetics_configuration.with_screenshot_on_step_start(False).with_screenshot_on_step_success(False).with_screenshot_on_step_failure(True)
```

若要停用所有螢幕擷取畫面，請使用本範例中的 disableStepScreenshots() 函數。

```
synthetics_configuration.disable_step_screenshots()
```

您可以在程式碼中的任何時候啟用和停用螢幕擷取畫面。例如，若只要停用一個步驟的螢幕擷取畫面，請在執行該步驟之前停用這些螢幕擷取畫面，然後在步驟之後予以啟用。

##### 適用於 UI Canary 的 set\$1config(options)
<a name="CloudWatch_Synthetics_Library_Python_UI"></a>

對於 UI Canary，以 `syn-python-selenium-1.1` 為開頭的 ` set_config` 可以包括下列布林值參數：
+ `continue_on_step_failure` （布林值） — 是否在步驟失敗後繼續執行 Canary 指令碼 （這是指 ** executeStep** 函數）。如果任何步驟失敗，Canary 執行仍將被標記為失敗。預設值為 `false`。

### SyntheticsLogger 類別
<a name="CloudWatch_Synthetics_Library_SyntheticsLogger_Python"></a>

`synthetics_logger` 會將日誌同時寫入至主控台和相同日誌層級的本機日誌檔案。只有在日誌層級等於或低於呼叫之日誌函數所需的日誌層級時，才會將此日誌檔案同時寫入至這兩個位置。

本機日誌檔案中的日誌陳述式會加上「偵錯」、「資訊」等前綴，以符合呼叫之函數的日誌層級。

使用 `synthetics_logger` 並不需要建立上傳至 Simple Storage Service (Amazon S3) 結果位置的日誌檔案。您可改為在 `/tmp` 資料夾中建立不同的日誌檔案。`/tmp` 資料夾下所建立的任何檔案都會上傳至 S3 儲存貯體中的結果位置作為成品。

若要使用 `synthetics_logger`:

```
from aws_synthetics.common import synthetics_logger
```

****實用的函數定義：

取得日誌層級：

```
log_level = synthetics_logger.get_level()
```

設定日誌層級：

```
synthetics_logger.set_level()
```

記錄具有指定層級的訊息。該層級可以是 `DEBUG`、` INFO`、`WARN` 或 `ERROR`，如下列語法範例所示：

```
synthetics_logger.debug(message, *args, **kwargs)
```

```
synthetics_logger.info(message, *args, **kwargs)
```

```
synthetics_logger.log(message, *args, **kwargs)
```

```
synthetics_logger.warning(message, *args, **kwargs)
```

```
synthetics_logger.error(message, *args, **kwargs)
```

如需偵錯參數的相關資訊，請參閱 [logging.debug](https://docs.python.org/3/library/logging.html#logging.debug) 中的標準的 Python 文件，網址為記錄 .debug。

在這些記錄函數中，`message` 是訊息格式字串。`args` 是使用字串格式化運算符合併到 `msg` 的引數。

`kwargs` 中有三個關鍵字引數：
+ `exc_info`— 如果未評估為 false，則會將例外狀況資訊新增至記錄訊息。
+ `stack_info`– 預設為 false。如果為 true，則將堆疊資訊新增至日誌訊息，包括實際的日誌記錄呼叫。
+ `extra`— 第三個選用關鍵字引數，您可以使用此引數傳入字典，而該字典可用來使用使用者定義的屬性填入為日誌事件建立的 `LogRecord` 的 `__dict__`。

範例：

記錄 `DEBUG` 層級的訊息：

```
synthetics_logger.debug('Starting step - login.')
```

記錄 `INFO` 層級的據悉 。`logger.log` 是 `logger.info` 的同義詞：

```
synthetics_logger.info('Successfully completed step - login.')
```

或

```
synthetics_logger.log('Successfully completed step - login.')
```

記錄 `WARN` 層級的訊息：

```
synthetics_logger.warning('Warning encountered trying to publish %s', 'CloudWatch Metric')
```

記錄 `ERROR` 層級的訊息：

```
synthetics_logger.error('Error encountered trying to publish %s', 'CloudWatch Metric')
```

記錄例外：

```
synthetics_logger.exception(message, *args, **kwargs)
```

記錄 `ERROR` 層級的訊息。例外狀況資訊會新增至記錄訊息。您應該只從例外狀況處理常式呼叫此函數。

如需例外狀況參數的資訊，請參閱 [ logging.exception 中的標準 Python 文件。](https://docs.python.org/3/library/logging.html#logging.exception)

`message` 是訊息格式字串。`args` 是使用字串格式化運算符合併到 `msg` 的引數。

`kwargs` 中有三個關鍵字引數：
+ `exc_info`— 如果未評估為 false，則會將例外狀況資訊新增至記錄訊息。
+ `stack_info`– 預設為 false。如果為 true，則將堆疊資訊新增至日誌訊息，包括實際的日誌記錄呼叫。
+ `extra`— 第三個選用關鍵字引數，您可以使用此引數傳入字典，而該字典可用來使用使用者定義的屬性填入為日誌事件建立的 `LogRecord` 的 `__dict__`。

範例：

```
synthetics_logger.exception('Error encountered trying to publish %s', 'CloudWatch Metric')
```

## 僅適用於 UI Canary 的 Python 和 Selenium 程式庫類別和函數
<a name="CloudWatch_Synthetics_Library_Python_UIcanaries"></a>

下列僅適用於 Python 的 CloudWatch Synthetics Selenium 程式庫函數可用於 UI Canary。

**Topics**
+ [SyntheticsBrowser 類別](#CloudWatch_Synthetics_Library_Python_SyntheticsBrowser)
+ [SyntheticsWebDriver class](#CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver)

### SyntheticsBrowser 類別
<a name="CloudWatch_Synthetics_Library_Python_SyntheticsBrowser"></a>

**注意**  
僅 Chrome 瀏覽器支援 `SyntheticsBrowser`。

當您透過呼叫 `synthetics_webdriver.Chrome()` 建立瀏覽器執行個體時，傳回的瀏覽器執行個體是類型 `SyntheticsBrowser`。` SyntheticsBrowser` 類別會繼承 WebDriver 類別，並提供對 [WebDriver](https://www.selenium.dev/documentation/webdriver/) 公開之所有方法的存取權。它會控制 ChromeDriver，並使 Canary 指令碼驅動瀏覽器，允許搭配使用 Selenium WebDriver 與 Synthetics。

**注意**  
Synthetics 會覆寫 WebDriver [退出](https://www.selenium.dev/selenium/docs/api/py/selenium_webdriver_firefox/selenium.webdriver.firefox.webdriver.html)方法，不採取任何動作。您不需要擔心退出瀏覽器，因為 Synthetics 會為您處理。

除了標準 Selenium 方法，它還提供了以下方法。

**Topics**
+ [set\$1viewport\$1size(width, height)](#CloudWatch_Synthetics_Library_set_viewport_size)
+ [save\$1screenshot(filename, suffix)](#CloudWatch_Synthetics_Library_save_screenshot)

#### set\$1viewport\$1size(width, height)
<a name="CloudWatch_Synthetics_Library_set_viewport_size"></a>

設定瀏覽器的檢視區。範例：

```
browser.set_viewport_size(1920, 1080)
```

#### save\$1screenshot(filename, suffix)
<a name="CloudWatch_Synthetics_Library_save_screenshot"></a>

將螢幕擷取畫面儲存至 `/tmp` 目錄。螢幕擷取畫面從那裡上傳到 S3 儲存貯體中的 Canary 成品資料夾。

*filename* 是螢幕擷取畫面的檔案名稱，*尾碼*是用於命名螢幕擷取畫面的選用字串。

範例：

```
browser.save_screenshot('loaded.png', 'page1')
```

### SyntheticsWebDriver class
<a name="CloudWatch_Synthetics_Library_Python_SyntheticsWebDriver"></a>

若要使用此類別，請在指令碼中使用以下內容：

```
from aws_synthetics.selenium import synthetics_webdriver
```

**Topics**
+ [add\$1execution\$1error(errorMessage, ex);](#CloudWatch_Synthetics_Library_Python_addExecutionError)
+ [add\$1user\$1agent(user\$1agent\$1str)](#CloudWatch_Synthetics_Library_add_user_agent)
+ [execute\$1step(step\$1name, function\$1to\$1execute)](#CloudWatch_Synthetics_Library_Python_execute_step)
+ [get\$1http\$1response(url)](#CloudWatch_Synthetics_Library_Python_get_http_response)
+ [Chrome()](#CloudWatch_Synthetics_Library_Python_Chrome)

#### add\$1execution\$1error(errorMessage, ex);
<a name="CloudWatch_Synthetics_Library_Python_addExecutionError"></a>

`errorMessage` 描述錯誤，而 `ex` 是遇到的例外狀況

您可以使用 `add_execution_error` 為您的 Canary 設定執行錯誤。它會在不中斷指令碼執行的情況下使 Canary 失敗。它也不會影響您的 `successPercent` 指標。

只有在錯誤表示 Canary 指令碼成功或失敗並不重要時，才應將錯誤追蹤為執行錯誤。

`add_execution_error` 的使用範例如下所示。您正在監控端點的可用性，並在頁面載入後擷取螢幕擷取畫面。由於擷取螢幕擷取畫面的失敗並不會決定端點的可用性，因此您可以捕捉擷取螢幕擷取畫面時遇到的任何錯誤，並將它們新增為執行錯誤。您的可用性指標仍會顯示端點已啟動並執行，但您的 Canary 狀態會標示為失敗。下面的範本程式碼區塊可捕獲這樣的錯誤，並將其新增為執行錯誤。

```
try:
    browser.save_screenshot("loaded.png")  
except Exception as ex:
   self.add_execution_error("Unable to take screenshot", ex)
```

#### add\$1user\$1agent(user\$1agent\$1str)
<a name="CloudWatch_Synthetics_Library_add_user_agent"></a>

將 `user_agent_str` 的數值附加到瀏覽器的使用者代理程式標頭。您必須先指派 `user_agent_str`，再建立瀏覽器執行個體。

範例：

```
await synthetics_webdriver.add_user_agent('MyApp-1.0')
```

應該在 `async` 函式內使用 `add_user_agent`。

#### execute\$1step(step\$1name, function\$1to\$1execute)
<a name="CloudWatch_Synthetics_Library_Python_execute_step"></a>

處理一個函數。它也會執行以下操作：
+ 記錄步驟已開始。
+ 建立名為 `<stepName>-starting` 的螢幕擷取畫面。
+ 啟動計時器。
+ 執行提供的函數。
+ 如果函數正常傳回結果，則會計為通過。如果函數擲回錯誤，則會計為失敗。
+ 結束計時器。
+ 記錄步驟是否已通過或失敗
+ 建立名為 `<stepName>-succeeded` 或 ` <stepName>-failed` 的螢幕擷取畫面。
+ 發出 `stepName` `SuccessPercent` 指標，100 代表通過，0 代表失敗。
+ 發出 `stepName` `Duration` 指標，顯示根據步驟開始和結束時間的值。
+ 最後，傳回 `functionToExecute` 已傳回的結果，或重新擲回 `functionToExecute` 已擲回的錯誤。

範例：

```
from selenium.webdriver.common.by import By

def custom_actions():
        #verify contains
        browser.find_element(By.XPATH, "//*[@id=\"id_1\"][contains(text(),'login')]")
        #click a button
        browser.find_element(By.XPATH, '//*[@id="submit"]/a').click()

    await synthetics_webdriver.execute_step("verify_click", custom_actions)
```

#### get\$1http\$1response(url)
<a name="CloudWatch_Synthetics_Library_Python_get_http_response"></a>

對提供的 URL 提出 HTTP 請求，並傳回 HTTP 請求的回應碼。如果在 HTTP 請求期間發生例外狀況，系統會傳回值為 "error" 的字串。

範例：

```
response_code = syn_webdriver.get_http_response(url)
if not response_code or response_code == "error" or response_code < 200 or response_code > 299:
    raise Exception("Failed to load page!")
```

#### Chrome()
<a name="CloudWatch_Synthetics_Library_Python_Chrome"></a>

啟動 Chromium 瀏覽器的執行個體，並傳回建立的瀏覽器執行個體。

範例：

```
browser = synthetics_webdriver.Chrome()
browser.get("https://example.com/)
```

若要在無痕模式下啟動瀏覽器，請使用以下命令：

```
add_argument('——incognito')
```

若要新增代理設定，請使用以下命令：

```
add_argument('--proxy-server=%s' % PROXY)
```

範例：

```
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("——incognito")
browser = syn_webdriver.Chrome(chrome_options=chrome_options)
```

# 使用 Cron 排程 Canary 執行
<a name="CloudWatch_Synthetics_Canaries_cron"></a>

當您排程 Canary 時，使用 Cron 表達式為您提供靈活性。Cron 表達式包含五個或六個欄位，其排序如下表所示。欄位以空格隔開。語法會因您使用 CloudWatch 主控台建立 Canary 或 AWS CLI AWS SDKs而有所不同。當您使用主控台時，只會指定前五個欄位。當您使用 AWS CLI AWS SDKs時，您可以指定所有六個欄位，而且必須為 `*` `Year` 欄位指定 。


|  **欄位**  |  **允許的值**  |  **允許的特殊字元**  | 
| --- | --- | --- | 
|  分鐘  |  0-59  |  , - \$1 /  | 
|  小時  |  0-23  |  , - \$1 /  | 
|  月中的日  |  1-31  |  , - \$1 ? / L W  | 
|  月  |  1-12 或 JAN-DEC  |  , - \$1 /  | 
|  週中的日  |  1-7 或 SUN-SAT  |  , - \$1 ? L \$1  | 
|  年  |  \$1  |    | 

**特殊字元**
+ **,** (逗號) 在欄位的表達式中包含多個值。例如，在 Month (月) 欄位，JAN、FEB、MAR 包括 January (一月)、February (二月) 與 March (三月)。
+ **-** (破折號) 特殊字元用於指定範圍。在 Day (日) 欄位，1-15 包含指定月份的 1 至 15 號。
+ **\$1** (星號) 特殊字元包含欄位中所有的值。在 Hours (小時) 欄位，**\$1** 包含每個小時。您不能在相同表達Day-of-month和Day-of-week欄位中使用 ** \$1**。若您在其中一個欄位使用它，您必須在另一個欄位使用 **?**。
+ **/** (斜線) 用於指定增量。在 Minutes (分鐘) 欄位，您可以輸入 1/10 指定每十分鐘的間隔，從小時的第一分鐘開始 (例如第 11、第 21、第 31 分鐘等)。
+ **?** (問號) 用於表示不限定任何一個。如果您在Day-of-month欄位中輸入 ** 7**，但不在意第七週的哪一天，您可以在Day-of-week欄位中輸入 **？**。
+ **L** 萬用字元在 Day-of-month (月中的日) 或 Day-of-week (週中的日) 欄位可指定月份或週的最後一天。
+ **W** 萬用字元在 Day-of-month (月中的日) 欄位可指定工作日。在 Day-of-month (月中的日) 欄位，**3W** 指定的是月份中最接近第三個工作日的日子。
+ **\$1** 萬用字元在 Day-of-week (週中的日) 欄位可指定某個月中某週特定日子的特定執行個體。例如，3\$12 是該月的第二個星期二。3 是指星期二，因為它是每週的第三天，2 指的是一個月內該類型的第二天。

**限制**
+ 您無法在同一個 cron 表達式中指定 Day-of-month (月中的日) 和 Day-of-week (週中的日) 欄位。如果您在其中一個欄位指定了數值 或 `*` (星號)，就必須在另一個欄位中使用 **?** (問號)​。
+ 不支援頻率多於一分鐘的 Cron 表達式。
+ 您不能設置 Canary 在執行之前等待一年以上，所以您只能在 `Year` 欄位中指定 `*`。

**範例**  
當您建立 Canary 時，您可以參考下列 Cron 字串範例。下列範例是使用 AWS CLI AWS SDKs建立或更新 Canary 的正確語法。如果您使用的是 CloudWatch 主控台，請省略每個範例中的最後的 `*`


| 表達式 | 意義 | 
| --- | --- | 
|   `0 10 * * ? *`   |  在每天上午 10:00 (UTC) 執行  | 
|   `15 12 * * ? *`   |  在每天下午 12:15 (UTC) 執行  | 
|   `0 18 ? * MON-FRI *`   |  在每週一至週五下午 6:00 (UTC) 執行  | 
|   `0 8 1 * ? *`   |  在每個月第一天上午 8:00 (UTC) 執行  | 
|   `0/10 * ? * MON-SAT *`   |  在每週週一至週六每 10 分鐘執行  | 
|   `0/5 8-17 ? * MON-FRI *`   |  在週一至週五上午 8:00 至下午 5:55 (UTC) 之間每 5 分鐘執行   | 

# 設定 Canary 以自動重試
<a name="CloudWatch_Synthetics_Canaries_autoretry"></a>

當您建立或更新 Canary 時，可以將 Canary 設定為在排程的執行失敗時自動嘗試其他執行。這有助於區分真正的故障和暫時性異常，提供更可靠的結果。此功能非常適合建置更具彈性的監控系統，同時減少錯誤警示和手動介入。

**建立自動重試 Canary**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

1. 選擇 **Create Canary (建立 Canary)**。

1. **在其他組態**下，選取**自動重試**，然後選取所需的重試次數上限。

**更新 Canary 的重試次數上限**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

1. 您可以執行下列任一作業：
   + 選取 Canary，然後選擇**動作**、**啟用自動重試**，調整重試次數上限。
   + 選取 Canary，然後選擇**動作**、**編輯**。在**編輯詳細資訊**頁面的**其他組態**下，選擇**自動重試**，然後調整重試組態。

 **限制** 

以下是設定自動重試的限制。
+ 僅支援執行時間版本 `syn-nodejs-puppeteer-10.0 `或更新版本、 ` syn-nodejs-playwright-2.0` 或更新版本、 `syn-python-selenium-5.1` 或更新版本，`syn-nodejs-3.0`或 或更新版本。
+ 執行時間超過十分鐘之長時間執行的 Canary，只能重試一次。所有其他 Canary 最多可支援兩次重試

# 搭配 CloudWatch Synthetics Canary 使用相依項
<a name="CloudWatch_Synthetics_Canaries_dependencies"></a>

本節說明如何在 CloudWatch Synthetics Canary 中使用 `Dependencies`。透過 `Dependencies` 欄位，您可以指定 Canary 的相依項，加入 Canary 指令碼可使用的其他程式庫或自訂程式碼。

## 概觀
<a name="overview"></a>

CloudWatch Synthetics Canary 支援將 Lambda 圖層指定為相依項。此功能可讓您：
+ 在多個 Canary 之間共用常見程式碼
+ 將 Canary 指令碼程式碼與相依項分開管理
+ 將相依項移至 Lambda 圖層，以減小 Canary 指令碼

## 支援的 API
<a name="supported-apis"></a>

下列 API 支援 `Dependencies` 欄位：
+  [CreateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CreateCanary.html) 
+  [UpdateCanary](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_UpdateCanary.html) 
+  [ StartCanaryDryRun](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_StartCanaryDryRun.html) 

## 語法
<a name="syntax"></a>

`Dependencies` 欄位是請求語法中程式碼結構的一部分：

```
"Code": { 
  "Handler": "string",
  "S3Bucket": "string",
  "S3Key": "string",
  "S3Version": "string",
  "ZipFile": blob,
  "Dependencies": [
    {
      "Type": "LambdaLayer",
      "Reference": "string"
    }
  ]
}
```

## 使用相依項
<a name="usage"></a>

以下是在不同情境下使用 `Dependencies` 欄位的一些範例和說明。

### 建立具有相依項的 Canary
<a name="creating-canary"></a>

建立 Canary 時，您可以將 Lambda 圖層指定為相依項：

```
{
  "Name": "my-canary",
  "Code": {
    "Handler": "pageLoadBlueprint.handler",
    "S3Bucket": "my-bucket",
    "S3Key": "my-canary-script.zip",
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-custom-layer:1"
      }
    ]
  },
  "ArtifactS3Location": "s3://my-bucket/artifacts/",
  "ExecutionRoleArn": "arn:aws:iam::123456789012:role/my-canary-role",
  "Schedule": {
    "Expression": "rate(5 minutes)"
  },
  "RuntimeVersion": "syn-nodejs-puppeteer-3.9"
}
```

### 更新 Canary 的相依項
<a name="updating-canary"></a>

您可以使用 UpdateCanary API 更新 Canary 的相依項：

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-updated-layer:2"
      }
    ]
  }
}
```

### 移除相依項
<a name="removing-dependencies"></a>

若要從 Canary 移除相依項，請為相依項欄位提供空陣列：

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": []
  }
}
```

### 使用 StartCanaryDryRun 測試相依項
<a name="testing-dependencies"></a>

使用新的相依項更新 Canary 之前，可以先使用 StartCanaryDryRun API 對其進行測試：

```
{
  "Name": "my-canary",
  "Code": {
    "Dependencies": [
      {
        "Type": "LambdaLayer",
        "Reference": "arn:aws:lambda:us-west-2:123456789012:layer:my-test-layer:3"
      }
    ]
  }
}
```

## 限制及考量
<a name="limitations"></a>
+ 只能指定一個 Lambda 圖層作為相依項
+ 除了[必要的角色和許可](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Roles.html)之外，用來建立具有相依項之 Canary 的角色，還應具備對相依項圖層的 ` lambda:GetLayerVersion` 存取權

## 建立相容的 Lambda 圖層
<a name="creating-compatible-layers"></a>

如需有關如何建立和封裝圖層的資訊，請參閱[使用圖層管理 Lambda 相依項](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html)；若要根據 Canary 封裝結構了解 Canary 檢查的封裝結構，請參閱[撰寫 Canary 指令碼](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html)。

# Groups (群組)
<a name="CloudWatch_Synthetics_Groups"></a>

您可以建立*群組*，以將 Canary (包括跨區域的 Canary) 相互關聯。使用群組可以幫助您管理和自動化 Canary，您還可以查看一個群組中所有 Canary 的彙總執行結果和統計資料。

群組為全域資源。當您建立 群組時，該群組會複寫到支援 群組的所有 AWS 區域，而且您可以將任何這些區域中的 Canary 新增至該群組，並在任何這些區域中檢視該群組。雖然群組 ARN 格式會反映建立群組的區域名稱，不過群組不會限制於任何區域。這意味著您可以將來自多個區域的 Canary 放入同一群組中，然後使用該群組在單個視圖中檢視和管理所有這些 Canary。

除了預設停用的區域以外，所有區域都支援群組。如需有關這些區域的詳細資訊，請參閱[啟用區域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html#rande-manage-enable)。

每個群組最多可包含 10 個 Canary。您的帳戶最多可有 20 個群組。任何一個 Canary 最多可為 10 個群組的成員。

**建立群組**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

   

1. 選擇 **Create Group (建立群組)**。

1. 在 **Group Name** (群組名稱) 下，輸入群組的名稱。

1. 選取要與此群組建立關聯的 Canary。若要選取 Canary，請在 **Exact canary name** (確切的 Canary 名稱) 中輸入其完整名稱，然後選擇 **Search** (搜尋)。選取 Canary 名稱旁的核取方塊。如果在不同的區域中有多個具有相同名稱的 Canary，請確保選取所需的 Canary。

   您可以重複此步驟，將最多 10 個 Canary 與該群組建立關聯。

1. (選用) 在 **Tags** (標籤) 下，新增一或多個鍵/值對，作為此群組的標籤。標籤可協助您識別和組織 AWS 資源，並追蹤 AWS 成本。如需詳細資訊，請參閱[標記您的 Amazon CloudWatch 資源](CloudWatch-Tagging.md)。

1. 選擇 **Create Group (建立群組)**。

# 在本地測試 Canary
<a name="CloudWatch_Synthetics_Debug_Locally"></a>

本節說明如何直接在 Microsoft Visual Studio 程式碼編輯器或 JetBrains IDE 程式碼編輯器中對 CloudWatch Synthetics Canary 進行修改、測試和偵錯。本地偵錯環境使用無伺服器應用程式模型 (SAM) 容器來模擬 Lambda 函式，以模擬 Synthetics Canary 的行為。

**注意**  
要在本地對依賴視覺化監控的 Canary 偵錯，這個想法有點不切實際。視覺化監控依賴於在初始執行過程中擷取基礎螢幕畫面，然後將這些螢幕畫面與後續執行中擷取的螢幕畫面進行比對。在本地開發環境中，系統不會儲存或追蹤執行，每次迭代都是獨立且自成一體的執行。如果沒有 Canary 執行歷史記錄，就無法對依賴視覺化監控的 Canary 偵錯。

 **先決條件** 

1. 選擇或建立一個 Amazon S3 儲存貯體，用於儲存在本地執行 Canary 測試時產生的成品，例如 HAR 檔案和螢幕擷取畫面。這需要您佈建 IAM。如果您不設定 Amazon S3 儲存貯體，仍然可以在本地測試 Canary，但會看到有關缺失儲存貯體的錯誤訊息，而且您將無法存取 Canary 成品。

   如果您使用 Amazon S3 儲存貯體，建議將儲存貯體生命週期設定為幾天後刪除物件，以節省成本。如需詳細資訊，請參閱[管理儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。

1. 為您的 AWS 帳戶設定預設 AWS 設定檔。如需詳細資訊，請參閱[組態與憑證檔案設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。

1. 將偵錯環境的預設 AWS 區域設定為您偏好的區域，例如 ` us-west-2`。

1. 安裝 AWS SAM CLI。如需詳細資訊，請參閱[安裝 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)。

1. 安裝 Visual Studio Code Editor 或 JetBrains IDE。如需詳細資訊，請參閱 [https://code.visualstudio.com/](https://code.visualstudio.com/) 或 [https://www.jetbrains.com/ides/](https://www.jetbrains.com/ides/)

1. 安裝 Docker 以使用 AWS SAM CLI。請務必啟動 docker 常駐程式。如需詳細資訊，請參閱[安裝  Docker以搭配 CLI AWS SAM 使用](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-docker.html)。

   或者，您可以安裝其他容器管理軟體 (例如  Rancher)，只要其使用 Docker 執行時期即可。

1. 為偏好的編輯器安裝 AWS 工具組擴充功能。如需詳細資訊，請參閱[安裝 AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-toolkit.html)或[安裝 AWS Toolkit for JetBrains](https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/setup-toolkit.html)。

**Topics**
+ [設定測試和偵錯環境](#CloudWatch_Synthetics_Debug_Environment)
+ [使用 Visual Studio Code IDE](#CloudWatch_Synthetics_Debug_VS)
+ [使用 JetBrains IDE](#CloudWatch_Synthetics_Debug_JetBrains)
+ [使用 SAM CLI 在本地執行 Canary](#CloudWatch_Synthetics_Run_Locally)
+ [將本地測試環境整合到現有 Canary 套件](#CloudWatch_Synthetics_Debug_Integrate)
+ [變更 CloudWatch Synthetics 執行時期](#CloudWatch_Synthetics_Debug_DifferentRuntime)
+ [常見錯誤](#CloudWatch_Synthetics_Debug_Errors)

## 設定測試和偵錯環境
<a name="CloudWatch_Synthetics_Debug_Environment"></a>

首先，輸入下列命令來複製 AWS 提供的 Github 儲存庫。儲存庫中包含 Node.js Canary 和 Python Canary 的程式碼範例。

```
git clone https://github.com/aws-samples/synthetics-canary-local-debugging-sample.git
```

然後，根據 Canary 的語言執行下列其中一項動作。

**對於 Node.js Canary**

1. 輸入下列命令，前往 Node.js Canary 來源目錄。

   ```
   cd synthetics-canary-local-debugging-sample/nodejs-canary/src
   ```

1. 輸入以下命令以安裝 Canary 相依項。

   ```
   npm install
   ```

**對於 Python Canary**

1. 輸入下列命令，前往 Python Canary 來源目錄。

   ```
   cd synthetics-canary-local-debugging-sample/python-canary/src
   ```

1. 輸入以下命令以安裝 Canary 相依項。

   ```
   pip3 install -r requirements.txt -t .
   ```

## 使用 Visual Studio Code IDE
<a name="CloudWatch_Synthetics_Debug_VS"></a>

Visual Studio 啟動設定檔位於 ` .vscode/launch.json`。其中包含允許 Visual Studio 程式碼偵測範本檔案的組態。其中還定義了一個包含必要參數的 Lambda 承載，用於成功調用 Canary。以下是 Node.js Canary 的啟動組態：

```
{
            ...
            ...
            "lambda": {
                "payload": {
                    "json": {
                        // Canary name. Provide any name you like.
                        "canaryName": "LocalSyntheticsCanary", 
                        // Canary artifact location
                        "artifactS3Location": {
                            "s3Bucket": "cw-syn-results-123456789012-us-west-2",
                            "s3Key": "local-run-artifacts",
                        },
                        // Your canary handler name
                        "customerCanaryHandlerName": "heartbeat-canary.handler"
                    }
                },
                // Environment variables to pass to the canary code
                "environmentVariables": {}
            }
        }
    ]
}
```

還可以選擇性地在承載 JSON 中提供下列欄位：
+ `s3EncryptionMode` 有效值：`SSE_S3` \$1 `SSE_KMS`
+ `s3KmsKeyArn` 有效值：*KMS Key ARN*
+ `activeTracing` 有效值：`true` \$1 `false`
+ `canaryRunId` 有效值：*UUID* 如果啟用主動追蹤，則必須提供此參數。

若要在 Visual Studio 中對 Canary 偵錯，請在您要暫停執行的 Canary 程式碼中新增中斷點。若要新增中斷點，請選擇編輯器邊界，然後前往編輯器中的**執行和偵錯**模式。按一下播放按鈕以執行 Canary。當 Canary 執行時，日誌將顯示在偵錯主控台中，為您提供有關 Canary 行為的即時見解。如果您新增中斷點，Canary 會在每個中斷點處暫停執行，因此您可以逐步執行程式碼並檢查變數值、執行個體方法、物件屬性和函式呼叫堆疊。

除了儲存於 Amazon S3 儲存貯體中的成品以及每次本地執行產生的 CloudWatch 指標之外，您無需為 Canary 的本地執行和偵錯支付任何費用。

![\[Visual Studio Code interface showing JavaScript code for a heartbeat canary function.\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/DebugCanaryVS.png)


## 使用 JetBrains IDE
<a name="CloudWatch_Synthetics_Debug_JetBrains"></a>

安裝 AWS Toolkit for JetBrains 延伸模組之後，如果您要偵錯 Node.js Canary，請確定已啟用 Node.js 外掛程式和 JavaScript 偵錯工具來執行。然後請遵循下列步驟。

**使用 JetBrains IDE 對 Canary 偵錯**

1. 在 JetBrains IDE 的左側導覽窗格中，選擇 **Lambda**，然後選擇本地組態範本。

1. 輸入執行組態的名稱，例如 **LocalSyntheticsCanary**

1. 選擇**從範本**，在範本欄位中選擇檔案瀏覽器，然後從專案中選取 **template.yml** 檔案 (從 **nodejs** 目錄或 **python** 目錄)。

1. 在**輸入**區段中，輸入 Canary 的承載，如以下畫面所示。

   ```
   {
    "canaryName": "LocalSyntheticsCanary",
    "artifactS3Location": {
        "s3Bucket": "cw-syn-results-123456789012-us-west-2",
        "s3Key": "local-run-artifacts"
    },
    "customerCanaryHandlerName": "heartbeat-canary.handler"
   }
   ```

   您也可以在承載 JSON 中設定其他環境變數，如 [使用 Visual Studio Code IDE](#CloudWatch_Synthetics_Debug_VS) 中所列。

![\[Run/Debug Configurations interface for AWS Lambda with LocalSyntheticsCanary settings.\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/DebugCanaryIntellij.png)


## 使用 SAM CLI 在本地執行 Canary
<a name="CloudWatch_Synthetics_Run_Locally"></a>

依循下列其中一個程序，使用無伺服器應用程式模型 (SAM) CLI 在本地執行 Canary。請務必在 `event.json` 中為 `s3Bucket` 指定自己的 Amazon S3 儲存貯體名稱

**使用 SAM CLI 執行 Node.js Canary**

1. 輸入下列命令以前往來源目錄。

   ```
   cd synthetics-canary-local-debugging-sample/nodejs-canary
   ```

1. 輸入下列命令：

   ```
   sam build
   sam local invoke -e ../event.json
   ```

**使用 SAM CLI 執行 Python Canary**

1. 輸入下列命令以前往來源目錄。

   ```
   cd synthetics-canary-local-debugging-sample/python-canary
   ```

1. 輸入下列命令：

   ```
   sam build
   sam local invoke -e ../event.json
   ```

## 將本地測試環境整合到現有 Canary 套件
<a name="CloudWatch_Synthetics_Debug_Integrate"></a>

您可以複製三個檔案，以將本地 Canary 偵錯功能整合至現有 Canary 套件：
+ 將 `template.yml` 檔案複製到 Canary 套件根目錄。請務必修改 `CodeUri` 的路徑，以指向 Canary 程式碼所在的目錄。
+ 如果使用的是 Node.js Canary，請將 `cw-synthetics.js` 檔案複製到 Canary 來源目錄。如果使用的是 Python Canary，請將 ` cw-synthetics.py` 複製到 Canary 來源目錄。
+ 將啟動設定檔 .`vscode/launch.json` 複製到套件根目錄。請務必將其放入 `.vscode` 目錄；如果沒有此目錄，請新建。

## 變更 CloudWatch Synthetics 執行時期
<a name="CloudWatch_Synthetics_Debug_DifferentRuntime"></a>

在偵錯過程中，您可能需要嘗試使用不同的 CloudWatch Synthetics 執行時期 (而非最新的執行時期) 執行 Canary。若要這樣做，請從下列其中一個資料表找到您要使用的執行時期。請務必選取正確區域的執行時期。然後將該執行時期的 ARN 貼至 ` template.yml` 檔案的適當位置，然後執行 Canary。

### Node.js 和 Puppeteer 執行時期
<a name="Synthetics_NodeJS_Puppeteer_Runtime_ARNs"></a>

#### syn-nodejs-puppeteer-15.0 ARNs
<a name="syn-nodejs-puppeteer-15.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-15.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-puppeteer-14.0 ARNs
<a name="syn-nodejs-puppeteer-14.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-14.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-puppeteer-13.1 ARNs
<a name="syn-nodejs-puppeteer-13.1"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-13.1`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-puppeteer-13.0 ARNs
<a name="syn-nodejs-puppeteer-13.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-13.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-puppeteer-12.0 ARNs
<a name="syn-nodejs-puppeteer-12.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-12.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-puppeteer-11.0 ARNs
<a name="syn-nodejs-puppeteer-11.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-11.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-puppeteer-10.0 的 ARN
<a name="syn-nodejs-puppeteer-10.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-10.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics:58`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics:61`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics:59`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics:61`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics:59`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics:59`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics:34`   | 
|  亞太地區 (雅加達)  |   `arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics:41`   | 
|  亞太地區 (馬來西亞)  |   `arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics:15`   | 
|  亞太地區 (墨爾本)  |   `arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics:32`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics:59`   | 
|  亞太區域 (紐西蘭)  |   `arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics:18`   | 
|  亞太地區 (大阪)  |   `arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics:45`   | 
|  亞太區域 (首爾)  |   `arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics:62`   | 
|  亞太區域 (新加坡)  |   `arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics:63`   | 
|  亞太地區 (雪梨)  |   `arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics:58`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics:24`   | 
|  亞太區域 (泰國)  |   `arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics:6`   | 
|  亞太地區 (東京)  |   `arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics:59`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics:59`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics:90`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics:58`   | 
|  中國 (寧夏)  |   `arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics:59`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics:59`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics:60`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics:58`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics:60`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics:59`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics:34`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics:59`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics:33`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics:31`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics:7`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics:58`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics:34`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics:60`   | 
|  AWS GovCloud （美國東部）  |   `arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics:54`   | 
|  AWS GovCloud （美國西部）  |   `arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics:55`   | 

#### syn-nodejs-puppeteer-9.1 的 ARN
<a name="syn-nodejs-puppeteer-9.1"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-9.1`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics:53`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics:56`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics:54`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics:56`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics:54`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics:54`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics:29`   | 
|  亞太地區 (雅加達)  |   `arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics:36`   | 
|  亞太地區 (馬來西亞)  |   `arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics:10`   | 
|  亞太地區 (墨爾本)  |   `arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics:27`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics:54`   | 
|  亞太區域 (紐西蘭)  |   `arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics:17`   | 
|  亞太地區 (大阪)  |   `arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics:40`   | 
|  亞太區域 (首爾)  |   `arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics:57`   | 
|  亞太區域 (新加坡)  |   `arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics:58`   | 
|  亞太地區 (雪梨)  |   `arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics:53`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics:25`   | 
|  亞太區域 (泰國)  |   `arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics:1`   | 
|  亞太地區 (東京)  |   `arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics:54`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics:54`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics:85`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics:54`   | 
|  中國 (寧夏)  |   `arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics:55`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics:54`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics:55`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics:53`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics:55`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics:54`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics:29`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics:54`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics:28`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics:26`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics:3`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics:53`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics:29`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics:55`   | 
|  AWS GovCloud （美國東部）  |   `arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics:50`   | 
|  AWS GovCloud （美國西部）  |   `arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics:51`   | 

#### syn-nodejs-puppeteer-9.0 的 ARN
<a name="syn-nodejs-puppeteer-9.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-9.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics:51`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics:54`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics:52`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics:54`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics:52`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics:52`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics:27`   | 
|  亞太地區 (雅加達)  |   `arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics:34`   | 
|  亞太地區 (馬來西亞)  |   `arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics:8`   | 
|  亞太地區 (墨爾本)  |   `arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics:25`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics:52`   | 
|  亞太區域 (紐西蘭)  |   `arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics:16`   | 
|  亞太地區 (大阪)  |   `arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics:38`   | 
|  亞太區域 (首爾)  |   `arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics:55`   | 
|  亞太區域 (新加坡)  |   `arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics:56`   | 
|  亞太地區 (雪梨)  |   `arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics:51`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics:26`   | 
|  亞太地區 (東京)  |   `arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics:52`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics:52`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics:83`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics:52`   | 
|  中國 (寧夏)  |   `arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics:53`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics:52`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics:53`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics:51`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics:53`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics:52`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics:27`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics:52`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics:26`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics:24`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics:51`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics:27`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics:53`   | 
|  AWS GovCloud （美國東部）  |   `arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics:48`   | 
|  AWS GovCloud （美國西部）  |   `arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics:49`   | 

#### syn-nodejs-puppeteer-8.0 的 ARN
<a name="syn-nodejs-puppeteer-8.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-8.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics:48`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics:50`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics:48`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics:51`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics:48`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics:49`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics:24`   | 
|  亞太地區 (雅加達)  |   `arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics:30`   | 
|  亞太地區 (墨爾本)  |   `arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics:22`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics:48`   | 
|  亞太區域 (紐西蘭)  |   `arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics:15`   | 
|  亞太地區 (大阪)  |   `arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics:34`   | 
|  亞太區域 (首爾)  |   `arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics:51`   | 
|  亞太區域 (新加坡)  |   `arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics:53`   | 
|  亞太地區 (雪梨)  |   `arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics:48`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics:23`   | 
|  亞太地區 (東京)  |   `arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics:48`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics:48`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics:80`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics:49`   | 
|  中國 (寧夏)  |   `arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics:50`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics:48`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics:50`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics:48`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics:49`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics:48`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics:24`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics:48`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics:23`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics:21`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics:48`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics:23`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics:49`   | 
|  AWS GovCloud （美國東部）  |   `arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics:45`   | 
|  AWS GovCloud （美國西部）  |   `arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics:46`   | 

#### syn-nodejs-puppeteer-7.0 的 ARN
<a name="syn-nodejs-puppeteer-7.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-7.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics:44`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics:46`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics:44`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics:47`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics:44`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics:45`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics:20`   | 
|  亞太地區 (雅加達)  |   `arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics:26`   | 
|  亞太地區 (馬來西亞)  |   `arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics:7`   | 
|  亞太地區 (墨爾本)  |   `arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics:18`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics:44`   | 
|  亞太區域 (大阪)  |   `arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics:30`   | 
|  亞太區域 (首爾)  |   `arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics:46`   | 
|  亞太區域 (新加坡)  |   `arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics:49`   | 
|  亞太地區 (雪梨)  |   `arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics:44`   | 
|  亞太區域 (泰國)  |   `arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics:3`   | 
|  亞太地區 (東京)  |   `arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics:44`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics:44`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics:76`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics:45`   | 
|  中國 (寧夏)  |   `arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics:46`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics:44`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics:46`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics:44`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics:45`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics:44`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics:20`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics:44`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics:19`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics:17`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics:4`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics:44`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics:19`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics:45`   | 
|  AWS GovCloud （美國東部）  |   `arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics:41`   | 
|  AWS GovCloud （美國西部）  |   `arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics:42`   | 

#### syn-nodejs-puppeteer-6.2 的 ARN
<a name="syn-nodejs-puppeteer-6.2"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-6.2`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics:41`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics:43`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics:41`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics:44`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics:41`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics:42`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics:17`   | 
|  亞太地區 (雅加達)  |   `arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics:23`   | 
|  亞太地區 (墨爾本)  |   `arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics:15`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics:41`   | 
|  亞太區域 (大阪)  |   `arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics:27`   | 
|  亞太區域 (首爾)  |   `arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics:42`   | 
|  亞太區域 (新加坡)  |   `arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics:46`   | 
|  亞太地區 (雪梨)  |   `arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics:41`   | 
|  亞太區域 (東京)  |   `arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics:41`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics:41`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics:73`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics:42`   | 
|  中國 (寧夏)  |   `arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics:43`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics:41`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics:43`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics:41`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics:42`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics:41`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics:17`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics:41`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics:16`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics:14`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics:41`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics:16`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics:42`   | 
|  AWS GovCloud （美國東部）  |   `arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics:39`   | 
|  AWS GovCloud （美國西部）  |   `arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics:39`   | 

#### syn-nodejs-puppeteer-5.2 的 ARN
<a name="syn-nodejs-puppeteer-5.2"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-puppeteer-5.2`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics:42`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics:44`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics:42`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics:45`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics:42`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics:43`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics:18`   | 
|  亞太地區 (雅加達)  |   `arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics:24`   | 
|  亞太地區 (墨爾本)  |   `arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics:16`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics:42`   | 
|  亞太區域 (大阪)  |   `arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics:28`   | 
|  亞太區域 (首爾)  |   `arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics:44`   | 
|  亞太區域 (新加坡)  |   `arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics:47`   | 
|  亞太地區 (雪梨)  |   `arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics:42`   | 
|  亞太區域 (東京)  |   `arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics:42`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics:42`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics:74`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics:43`   | 
|  中國 (寧夏)  |   `arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics:44`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics:42`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics:44`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics:42`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics:43`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics:42`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics:18`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics:42`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics:17`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics:15`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics:42`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics:17`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics:43`   | 
|  AWS GovCloud （美國東部）  |   `arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics:40`   | 
|  AWS GovCloud （美國西部）  |   `arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics:40`   | 

### Node.js 和 Playwright 執行時期
<a name="Synthetics_Playwright_Runtime_ARNs"></a>

#### syn-nodejs-playwright-6.0 ARNs
<a name="syn-nodejs-playwright-6.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-playwright-6.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-playwright-5.1 ARNs
<a name="syn-nodejs-playwright-5.1"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-playwright-5.1`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-playwright-5.0 ARNs
<a name="syn-nodejs-playwright-5.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-playwright-5.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-playwright-4.0 ARNs
<a name="syn-nodejs-playwright-4.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-playwright-4.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-playwright-3.0 ARNs
<a name="syn-nodejs-playwright-3.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-playwright-3.0`版本的 ARNs。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Debug_Locally.html)

#### syn-nodejs-playwright-2.0 的 ARN
<a name="syn-nodejs-playwright-2.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-playwright-2.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   ` arn:aws:lambda:us-east-1:378653112637:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  美國東部 (俄亥俄)  |   ` arn:aws:lambda:us-east-2:772927465453:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  美國西部 (加利佛尼亞北部)  |   ` arn:aws:lambda:us-west-1:332033056316:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  美國西部 (奧勒岡)  |   ` arn:aws:lambda:us-west-2:760325925879:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  非洲 (開普敦)  |   ` arn:aws:lambda:af-south-1:461844272066:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太地區 (香港)  |   ` arn:aws:lambda:ap-east-1:129828061636:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太區域 (海德拉巴)  |   ` arn:aws:lambda:ap-south-2:280298676434:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太地區 (孟買)  |   ` arn:aws:lambda:ap-south-1:724929286329:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:AWS-CW-SyntheticsNodeJsPlaywright:7`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  亞太區域 (台北)  |   ` arn:aws:lambda:ap-east-2:471112897378:layer:AWS-CW-SyntheticsNodeJsPlaywright:9`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:AWS-CW-SyntheticsNodeJsPlaywright:3`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  加拿大 (中部)  |   ` arn:aws:lambda:ca-central-1:236629016841:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  加拿大西部 (卡加利)  |   ` arn:aws:lambda:ca-west-1:944448206667:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  中國 (北京)  |   ` arn:aws-cn:lambda:cn-north-1:422629156088:layer:AWS-CW-SyntheticsNodeJsPlaywright:3`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:AWS-CW-SyntheticsNodeJsPlaywright:3`   | 
|  歐洲 (法蘭克福)  |   ` arn:aws:lambda:eu-central-1:122305336817:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  歐洲 (愛爾蘭)  |   ` arn:aws:lambda:eu-west-1:563204233543:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  歐洲 (倫敦)  |   ` arn:aws:lambda:eu-west-2:565831452869:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  歐洲 (米蘭)  |   ` arn:aws:lambda:eu-south-1:525618516618:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  Europe (Paris)  |   ` arn:aws:lambda:eu-west-3:469466506258:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  歐洲 (西班牙)  |   ` arn:aws:lambda:eu-south-2:029793053121:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  歐洲 (斯德哥爾摩)  |   ` arn:aws:lambda:eu-north-1:162938142733:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  歐洲 (蘇黎世)  |   ` arn:aws:lambda:eu-central-2:224218992030:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  以色列 (特拉維夫)  |   ` arn:aws:lambda:il-central-1:313249807427:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  墨西哥 (中部)  |   ` arn:aws:lambda:mx-central-1:654654265476:layer:AWS-CW-SyntheticsNodeJsPlaywright:5`   | 
|  Middle East (Bahrain)  |   ` arn:aws:lambda:me-south-1:823195537320:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  中東 (阿拉伯聯合大公國)  |   ` arn:aws:lambda:me-central-1:239544149032:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  南美洲 (聖保羅)  |   ` arn:aws:lambda:sa-east-1:783765544751:layer:AWS-CW-SyntheticsNodeJsPlaywright:4`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:AWS-CW-SyntheticsNodeJsPlaywright:3`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:AWS-CW-SyntheticsNodeJsPlaywright:3`   | 

#### syn-nodejs-playwright-1.0 的 ARN
<a name="syn-nodejs-playwright-1.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-nodejs-playwright-1.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   ` arn:aws:lambda:us-east-1:378653112637:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  美國東部 (俄亥俄)  |   ` arn:aws:lambda:us-east-2:772927465453:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  美國西部 (加利佛尼亞北部)  |   ` arn:aws:lambda:us-west-1:332033056316:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  美國西部 (奧勒岡)  |   ` arn:aws:lambda:us-west-2:760325925879:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  非洲 (開普敦)  |   ` arn:aws:lambda:af-south-1:461844272066:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太地區 (香港)  |   ` arn:aws:lambda:ap-east-1:129828061636:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太區域 (海德拉巴)  |   ` arn:aws:lambda:ap-south-2:280298676434:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太地區 (孟買)  |   ` arn:aws:lambda:ap-south-1:724929286329:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:AWS-CW-SyntheticsNodeJsPlaywright:8`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太區域 (台北)  |   ` arn:aws:lambda:ap-east-2:471112897378:layer:AWS-CW-SyntheticsNodeJsPlaywright:10`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  加拿大 (中部)  |   ` arn:aws:lambda:ca-central-1:236629016841:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  加拿大西部 (卡加利)  |   ` arn:aws:lambda:ca-west-1:944448206667:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  中國 (北京)  |   ` arn:aws-cn:lambda:cn-north-1:422629156088:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  歐洲 (法蘭克福)  |   ` arn:aws:lambda:eu-central-1:122305336817:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  歐洲 (愛爾蘭)  |   ` arn:aws:lambda:eu-west-1:563204233543:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  歐洲 (倫敦)  |   ` arn:aws:lambda:eu-west-2:565831452869:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  歐洲 (米蘭)  |   ` arn:aws:lambda:eu-south-1:525618516618:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  Europe (Paris)  |   ` arn:aws:lambda:eu-west-3:469466506258:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  歐洲 (西班牙)  |   ` arn:aws:lambda:eu-south-2:029793053121:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  歐洲 (斯德哥爾摩)  |   ` arn:aws:lambda:eu-north-1:162938142733:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  歐洲 (蘇黎世)  |   ` arn:aws:lambda:eu-central-2:224218992030:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  以色列 (特拉維夫)  |   ` arn:aws:lambda:il-central-1:313249807427:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  墨西哥 (中部)  |   ` arn:aws:lambda:mx-central-1:654654265476:layer:AWS-CW-SyntheticsNodeJsPlaywright:3`   | 
|  Middle East (Bahrain)  |   ` arn:aws:lambda:me-south-1:823195537320:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  中東 (阿拉伯聯合大公國)  |   ` arn:aws:lambda:me-central-1:239544149032:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  南美洲 (聖保羅)  |   ` arn:aws:lambda:sa-east-1:783765544751:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:AWS-CW-SyntheticsNodeJsPlaywright:1`   | 

### Node.js 執行時間
<a name="Synthetics_NodeJS_Runtime_ARNs"></a>

#### syn-nodejs-4.1 ARNs
<a name="syn-nodejs-4.1"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間`syn-nodejs-4.1`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  非洲 (開普敦)  |   ` arn:aws:lambda:af-south-1:461844272066:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太區域 (海德拉巴)  |   ` arn:aws:lambda:ap-south-2:280298676434:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太地區 (孟買)  |   ` arn:aws:lambda:ap-south-1:724929286329:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  加拿大 (中部)  |   ` arn:aws:lambda:ca-central-1:236629016841:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  中國 (北京)  |   ` arn:aws-cn:lambda:cn-north-1:422629156088:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  歐洲 (法蘭克福)  |   ` arn:aws:lambda:eu-central-1:122305336817:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  歐洲 (米蘭)  |   ` arn:aws:lambda:eu-south-1:525618516618:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  歐洲 (西班牙)  |   ` arn:aws:lambda:eu-south-2:029793053121:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  歐洲 (斯德哥爾摩)  |   ` arn:aws:lambda:eu-north-1:162938142733:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  歐洲 (蘇黎世)  |   ` arn:aws:lambda:eu-central-2:224218992030:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  以色列 (特拉維夫)  |   ` arn:aws:lambda:il-central-1:313249807427:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  墨西哥 (中部)  |   ` arn:aws:lambda:mx-central-1:654654265476:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:AWS-CW-SyntheticsNodeJs:12`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:AWS-CW-SyntheticsNodeJs:12`   | 

#### syn-nodejs-4.0 ARNs
<a name="syn-nodejs-4.0"></a>

下表列出適用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間`syn-nodejs-4.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  非洲 (開普敦)  |   ` arn:aws:lambda:af-south-1:461844272066:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太區域 (海德拉巴)  |   ` arn:aws:lambda:ap-south-2:280298676434:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太地區 (孟買)  |   ` arn:aws:lambda:ap-south-1:724929286329:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  加拿大 (中部)  |   ` arn:aws:lambda:ca-central-1:236629016841:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  中國 (北京)  |   ` arn:aws-cn:lambda:cn-north-1:422629156088:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  歐洲 (法蘭克福)  |   ` arn:aws:lambda:eu-central-1:122305336817:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  歐洲 (米蘭)  |   ` arn:aws:lambda:eu-south-1:525618516618:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  歐洲 (西班牙)  |   ` arn:aws:lambda:eu-south-2:029793053121:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  歐洲 (斯德哥爾摩)  |   ` arn:aws:lambda:eu-north-1:162938142733:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  歐洲 (蘇黎世)  |   ` arn:aws:lambda:eu-central-2:224218992030:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  以色列 (特拉維夫)  |   ` arn:aws:lambda:il-central-1:313249807427:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  墨西哥 (中部)  |   ` arn:aws:lambda:mx-central-1:654654265476:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:AWS-CW-SyntheticsNodeJs:11`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:AWS-CW-SyntheticsNodeJs:11`   | 

#### syn-nodejs-3.1 ARNs
<a name="syn-nodejs-3.1"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間`syn-nodejs-3.1`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  加拿大 (中部)  |   ` arn:aws:lambda:ca-central-1:236629016841:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  中國 (北京)  |   ` arn:aws-cn:lambda:cn-north-1:422629156088:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  歐洲 (法蘭克福)  |   ` arn:aws:lambda:eu-central-1:122305336817:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  歐洲 (蘇黎世)  |   ` arn:aws:lambda:eu-central-2:224218992030:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  以色列 (特拉維夫)  |   ` arn:aws:lambda:il-central-1:313249807427:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  墨西哥 (中部)  |   ` arn:aws:lambda:mx-central-1:654654265476:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  中東 (阿拉伯聯合大公國)  |   ` arn:aws:lambda:me-central-1:239544149032:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:AWS-CW-SyntheticsNodeJs:9`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:AWS-CW-SyntheticsNodeJs:9`   | 

#### syn-nodejs-3.0 ARNs
<a name="syn-nodejs-3.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間`syn-nodejs-3.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  加拿大 (中部)  |   ` arn:aws:lambda:ca-central-1:236629016841:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  中國 (北京)  |   ` arn:aws-cn:lambda:cn-north-1:422629156088:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  歐洲 (法蘭克福)  |   ` arn:aws:lambda:eu-central-1:122305336817:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  歐洲 (蘇黎世)  |   ` arn:aws:lambda:eu-central-2:224218992030:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  以色列 (特拉維夫)  |   ` arn:aws:lambda:il-central-1:313249807427:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  墨西哥 (中部)  |   ` arn:aws:lambda:mx-central-1:654654265476:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  中東 (阿拉伯聯合大公國)  |   ` arn:aws:lambda:me-central-1:239544149032:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:AWS-CW-SyntheticsNodeJs:1`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:AWS-CW-SyntheticsNodeJs:1`   | 

### Python 和 Selenium 執行時期
<a name="Synthetics_Python_Runtime_ARNs"></a>

#### syn-python-selenium-10.0 ARNs
<a name="syn-python-selenium-10.0"></a>

下表列出適用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-10.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:62`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:65`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:63`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:64`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:63`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:62`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:50`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:57`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:32`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:48`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:63`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:38`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:61`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:66`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:67`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:62`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:25`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:23`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:63`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:63`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:106`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:61`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:61`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:63`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:64`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:62`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:64`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:63`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:50`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:63`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:49`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:47`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:24`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:64`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:59`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:60`   | 

#### syn-python-selenium-9.0 ARNs
<a name="syn-python-selenium-9.0"></a>

下表列出適用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-9.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:61`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:64`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:62`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:63`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:62`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:61`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:49`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:56`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:31`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:47`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:62`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:37`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:60`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:65`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:66`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:61`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:24`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:22`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:62`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:62`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:105`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:60`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:60`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:62`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:63`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:61`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:63`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:62`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:49`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:62`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:48`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:46`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:23`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:61`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:49`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:63`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:58`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:59`   | 

#### syn-python-selenium-8.0 ARNs
<a name="syn-python-selenium-8.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-8.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:57`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:60`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:58`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:59`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:58`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:57`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:45`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:52`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:27`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:43`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:58`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:33`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:56`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:61`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:62`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:57`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:20`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:18`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:58`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:58`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:101`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:56`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:56`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:58`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:59`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:57`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:59`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:58`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:45`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:58`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:44`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:42`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:19`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:57`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:45`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:59`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:54`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:55`   | 

#### syn-python-selenium-7.0 ARNs
<a name="syn-python-selenium-7.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-7.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:49`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:52`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:50`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:51`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:50`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:49`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:37`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:44`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:19`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:35`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:50`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:25`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:48`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:53`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:54`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:49`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:12`   | 
|  亞太區域 (泰國)  |   ` arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:10`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:50`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:50`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:93`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:48`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:48`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:50`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:51`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:49`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:51`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:50`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:37`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:50`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:36`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:34`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:11`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:49`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:37`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:51`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:46`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:47`   | 

#### syn-python-selenium-6.0 ARNs
<a name="syn-python-selenium-6.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-6.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:47`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:50`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:48`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:49`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:48`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:47`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:35`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:42`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:17`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:33`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:48`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:25`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:46`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:51`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:52`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:47`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:10`   | 
|  亞太區域 (泰國)  |   `arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:8`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:48`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:48`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:91`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:46`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:46`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:48`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:49`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:47`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:49`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:48`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:35`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:48`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:34`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:32`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:9`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:47`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:35`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:49`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:44`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:45`   | 

#### syn-python-selenium-5.1 的 ARN
<a name="syn-python-selenium-5.1"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-5.1`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:45`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:48`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:46`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:47`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:46`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:45`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:33`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:40`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:15`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:31`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:46`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:24`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:44`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:49`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:50`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:45`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:8`   | 
|  亞太區域 (泰國)  |   `arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:6`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:46`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:44`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:89`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:44`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:44`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:46`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:47`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:45`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:47`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:46`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:33`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:46`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:32`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:30`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:7`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:45`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:33`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:47`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:42`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:43`   | 

#### syn-python-selenium-5.0 的 ARN
<a name="syn-python-selenium-5.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-5.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:43`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:46`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:44`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:45`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:44`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:43`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:31`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:38`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:13`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:29`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:44`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:23`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:42`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:47`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:48`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:43`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:3`   | 
|  亞太區域 (泰國)  |   `arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:4`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:44`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:44`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:87`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:43`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:43`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:44`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:45`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:43`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:45`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:44`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:31`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:44`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:30`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:28`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:5`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:43`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:31`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:45`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:41`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:42`   | 

#### syn-python-selenium-4.1 的 ARN
<a name="syn-python-selenium-4.1"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-4.1`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:40`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:43`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:41`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:42`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:41`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:40`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:28`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:35`   | 
|  亞太地區 (馬來西亞)  |   ` arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:10`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:26`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:41`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:22`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:39`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:44`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:45`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:40`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:4`   | 
|  亞太區域 (泰國)  |   `arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:1`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:41`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:41`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:84`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:40`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:40`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:41`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:42`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:40`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:42`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:41`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:28`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:41`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:27`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:25`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:3`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:40`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:28`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:42`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:38`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:39`   | 

#### syn-python-selenium-4.0 的 ARN
<a name="syn-python-selenium-4.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-4.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:38`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:41`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:39`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:40`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:39`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:38`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:26`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:33`   | 
|  亞太地區 (馬來西亞)  |   `arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:8`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:24`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:39`   | 
|  亞太區域 (紐西蘭)  |   ` arn:aws:lambda:ap-southeast-6:779414629109:layer:Synthetics_Selenium:21`   | 
|  亞太地區 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:37`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:42`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:43`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:38`   | 
|  亞太區域 (台北)  |   `arn:aws:lambda:ap-east-2:471112897378:layer:Synthetics_Selenium:5`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:39`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:39`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:82`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:38`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:38`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:39`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:40`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:38`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:40`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:39`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:26`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:39`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:25`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:23`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:38`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:26`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:40`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:36`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:37`   | 

#### syn-python-selenium-3.0 的 ARN
<a name="syn-python-selenium-3.0"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-3.0`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics_Selenium:32`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics_Selenium:34`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics_Selenium:32`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics_Selenium:34`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics_Selenium:32`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics_Selenium:32`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics_Selenium:20`   | 
|  亞太地區 (雅加達)  |   ` arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics_Selenium:26`   | 
|  亞太地區 (馬來西亞)  |   `arn:aws:lambda:ap-southeast-5:035872523913:layer:Synthetics_Selenium:7`   | 
|  亞太地區 (墨爾本)  |   ` arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics_Selenium:18`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics_Selenium:32`   | 
|  亞太區域 (大阪)  |   ` arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics_Selenium:30`   | 
|  亞太區域 (首爾)  |   ` arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics_Selenium:34`   | 
|  亞太區域 (新加坡)  |   ` arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics_Selenium:37`   | 
|  亞太地區 (雪梨)  |   ` arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics_Selenium:32`   | 
|  亞太區域 (泰國)  |   `arn:aws:lambda:ap-southeast-7:851725245975:layer:Synthetics_Selenium:3`   | 
|  亞太地區 (東京)  |   ` arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics_Selenium:32`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics_Selenium:32`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics_Selenium:76`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics_Selenium:32`   | 
|  中國 (寧夏)  |   ` arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics_Selenium:32`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics_Selenium:32`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics_Selenium:34`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics_Selenium:32`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics_Selenium:33`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics_Selenium:32`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics_Selenium:20`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics_Selenium:32`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics_Selenium:19`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics_Selenium:17`   | 
|  墨西哥 (中部)  |   `arn:aws:lambda:mx-central-1:654654265476:layer:Synthetics_Selenium:4`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics_Selenium:32`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics_Selenium:19`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics_Selenium:33`   | 
|  AWS GovCloud （美國東部）  |   ` arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics_Selenium:30`   | 
|  AWS GovCloud （美國西部）  |   ` arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics_Selenium:31`   | 

#### syn-python-selenium-2.1 的 ARN
<a name="syn-python-selenium-2.1"></a>

下表列出用於每個可用 AWS 區域中 CloudWatch Synthetics 執行時間` syn-python-selenium-2.1`版本的 ARNs。


| 區域 | ARN | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |   `arn:aws:lambda:us-east-1:378653112637:layer:Synthetics:29`   | 
|  美國東部 (俄亥俄)  |   `arn:aws:lambda:us-east-2:772927465453:layer:Synthetics:31`   | 
|  美國西部 (加利佛尼亞北部)  |   `arn:aws:lambda:us-west-1:332033056316:layer:Synthetics:29`   | 
|  美國西部 (奧勒岡)  |   `arn:aws:lambda:us-west-2:760325925879:layer:Synthetics:31`   | 
|  非洲 (開普敦)  |   `arn:aws:lambda:af-south-1:461844272066:layer:Synthetics:29`   | 
|  亞太地區 (香港)  |   `arn:aws:lambda:ap-east-1:129828061636:layer:Synthetics:29`   | 
|  亞太區域 (海德拉巴)  |   `arn:aws:lambda:ap-south-2:280298676434:layer:Synthetics:17`   | 
|  亞太地區 (雅加達)  |   `arn:aws:lambda:ap-southeast-3:246953257743:layer:Synthetics:23`   | 
|  亞太地區 (墨爾本)  |   `arn:aws:lambda:ap-southeast-4:200724813040:layer:Synthetics:15`   | 
|  亞太地區 (孟買)  |   `arn:aws:lambda:ap-south-1:724929286329:layer:Synthetics:29`   | 
|  亞太區域 (大阪)  |   `arn:aws:lambda:ap-northeast-3:608016332111:layer:Synthetics:27`   | 
|  亞太區域 (首爾)  |   `arn:aws:lambda:ap-northeast-2:989515803484:layer:Synthetics:30`   | 
|  亞太區域 (新加坡)  |   `arn:aws:lambda:ap-southeast-1:068035103298:layer:Synthetics:34`   | 
|  亞太地區 (雪梨)  |   `arn:aws:lambda:ap-southeast-2:584677157514:layer:Synthetics:29`   | 
|  亞太區域 (東京)  |   `arn:aws:lambda:ap-northeast-1:172291836251:layer:Synthetics:29`   | 
|  加拿大 (中部)  |   `arn:aws:lambda:ca-central-1:236629016841:layer:Synthetics:29`   | 
|  加拿大西部 (卡加利)  |   `arn:aws:lambda:ca-west-1:944448206667:layer:Synthetics:73`   | 
|  中國 (北京)  |   `arn:aws-cn:lambda:cn-north-1:422629156088:layer:Synthetics:29`   | 
|  中國 (寧夏)  |   `arn:aws-cn:lambda:cn-northwest-1:474974519687:layer:Synthetics:29`   | 
|  歐洲 (法蘭克福)  |   `arn:aws:lambda:eu-central-1:122305336817:layer:Synthetics:29`   | 
|  歐洲 (愛爾蘭)  |   `arn:aws:lambda:eu-west-1:563204233543:layer:Synthetics:31`   | 
|  歐洲 (倫敦)  |   `arn:aws:lambda:eu-west-2:565831452869:layer:Synthetics:29`   | 
|  歐洲 (米蘭)  |   `arn:aws:lambda:eu-south-1:525618516618:layer:Synthetics:30`   | 
|  Europe (Paris)  |   `arn:aws:lambda:eu-west-3:469466506258:layer:Synthetics:29`   | 
|  歐洲 (西班牙)  |   `arn:aws:lambda:eu-south-2:029793053121:layer:Synthetics:17`   | 
|  歐洲 (斯德哥爾摩)  |   `arn:aws:lambda:eu-north-1:162938142733:layer:Synthetics:29`   | 
|  歐洲 (蘇黎世)  |   `arn:aws:lambda:eu-central-2:224218992030:layer:Synthetics:16`   | 
|  以色列 (特拉維夫)  |   `arn:aws:lambda:il-central-1:313249807427:layer:Synthetics:14`   | 
|  Middle East (Bahrain)  |   `arn:aws:lambda:me-south-1:823195537320:layer:Synthetics:29`   | 
|  中東 (阿拉伯聯合大公國)  |   `arn:aws:lambda:me-central-1:239544149032:layer:Synthetics:16`   | 
|  南美洲 (聖保羅)  |   `arn:aws:lambda:sa-east-1:783765544751:layer:Synthetics:30`   | 
|  AWS GovCloud （美國東部）  |   `arn:aws-us-gov:lambda:us-gov-east-1:946759330430:layer:Synthetics:29`   | 
|  AWS GovCloud （美國西部）  |   `arn:aws-us-gov:lambda:us-gov-west-1:946807836238:layer:Synthetics:29`   | 

## 常見錯誤
<a name="CloudWatch_Synthetics_Debug_Errors"></a>

 **錯誤：在本機執行 AWS SAM 專案需要 Docker。您是否已安裝並執行它？** 

請務必在電腦上啟動 Docker。

 **SAM 本機調用失敗：呼叫 GetLayerVersion 操作時發生錯誤 (ExpiredTokenException)：請求中包含的安全權杖已過期** 

確定已設定 AWS 預設設定檔。

 **更常見的錯誤** 

如需 SAM 常見錯誤的詳細資訊，請參閱 [AWS SAM CLI 疑難排解](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-troubleshooting.html)。

# 對失敗的 Canary 進行故障診斷
<a name="CloudWatch_Synthetics_Canaries_Troubleshoot"></a>

如果 Canary 失敗，請檢查以下內容進行故障診斷。

 **一般性問題的故障診斷** 
+ 使用 Canary 詳細資訊頁面來尋找更多資訊。在 CloudWatch 主控台中，選擇導覽窗格中的 ** Canary**，然後選擇 Canary 的名稱以開啟 Canary 詳細資訊頁面。在**可用性**索引標籤中，檢查 ** SuccessPercent** 指標，以查看問題是持續還是間歇性。

  依然在 **Availability** (可用性) 標籤上，選擇失敗的資料點，以查看該失敗執行的螢幕擷取畫面、日誌和步驟報告 (如可用)。

  如果因為步驟屬於指令碼的一部分而提供步驟報告，請檢查哪個步驟失敗，並查看相關的螢幕擷取畫面，以查看客戶看到的問題。

  您也可以檢查 HAR 檔案，以查看是否有一或多個請求失敗。您可以使用日誌來深入探索失敗的請求和錯誤。最後，您可將這些成品與成功的金絲雀部署執行的成品進行比較，以確定問題。

  根據預設，CloudWatch Synthetics 會擷取 UI Canary 中每個步驟的螢幕擷取畫面。不過，您的指令碼可能會設定為停用螢幕擷取畫面。在偵錯期間，您可能想要再次啟用螢幕擷取畫面。同樣，對於 API Canary，您可能希望在偵錯過程中查看 HTTP 請求和回應標頭與內文。如需如何在報告內包含此資料的相關資訊，請參閱 [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_executeHttpStep)。
+ 如果您最近有部署到您的應用程式，請將其轉返，然後稍後再進行偵錯。
+ 手動連接到您的端點，看看是否可以重現相同的問題。

**Topics**
+ [Canary 在 Lambda 環境更新後失敗](#Troubleshoot_upgradeLambda)
+ [我的 Canary 被 封鎖 AWS WAF](#Canary_Blocked_WAF)
+ [等待元素出現](#CloudWatch_Synthetics_Canaries_Troubleshoot_waiting)
+ [節點不可見或不是 page.click() 的 HTMLElement](#CloudWatch_Synthetics_Canaries_Troubleshoot_notvisible)
+ [無法上傳成品到 S3，例外狀況：無法擷取 S3 儲存貯體位置：拒絕存取](#CloudWatch_Synthetics_Canaries_Troubleshoot_noupload)
+ [錯誤：通訊協定錯位 (Runtime.callFunctionOn)：目標關閉。](#CloudWatch_Synthetics_Canaries_Troubleshoot_protocolError)
+ [Canary 失敗。錯誤：沒有資料點 - Canary 顯示逾時錯誤](#CloudWatch_Synthetics_Canaries_Troubleshoot_nodatapoint)
+ [嘗試存取內部端點](#CloudWatch_Synthetics_Canaries_Troubleshoot_internalendpoint)
+ [Canary 執行時間版本升級和降級問題](#CloudWatch_Synthetics_Canaries_Troubleshoot_upgradeissues)
+ [跨來源請求共享 (CORS) 問題](#CloudWatch_Synthetics_Canaries_CORS)
+ [Canary 競爭條件問題](#CloudWatch_Synthetics_Canaries_RaceCondition)
+ [對 VPC 上的 Canary 進行故障診斷](#CloudWatch_Synthetics_Canaries_VPC_troubleshoot)
+ [對自動重試 Canary 進行疑難排解](#CloudWatch_Synthetics_Canaries_autoretry)

## Canary 在 Lambda 環境更新後失敗
<a name="Troubleshoot_upgradeLambda"></a>

CloudWatch Synthetics Canary 會在您的帳戶中實作為 Lambda 函式。這些 Lambda 函式會受到定期 Lambda 執行時期更新的影響，包含安全性更新、錯誤修正和其他改善。Lambda 致力於提供與現有函式回溯相容的執行時期更新。但是與軟體修補一樣，在極少數情況下，執行階段更新可能會對現有函數產生負面影響。如果您認為 Canary 受到 Lambda 執行時期更新的影響，可以使用 Lambda 執行時期管理手動模式 (在支援的區域中) 暫時復原 Lambda 執行時期版本。這可讓您的 Canary 函式保持正常運作並將中斷時間縮到最短，這樣便有時間在改回最新執行時期版本之前，修正不相容的情況。

如果您的 Canary 在 Lambda 執行時期更新後失敗，最佳解決方案是升級至最新的 Synthetics 執行時期之一。如需有關最新執行時期的詳細資訊，請參閱 [Synthetics 執行時間版本](CloudWatch_Synthetics_Canaries_Library.md)。

作為替代解決方案，在提供 Lambda 執行時期管理控制的區域中，您可以使用手動模式進行執行時期管理控制，將 Canary 還原至較舊的 Lambda 受管執行時期。您可以使用 AWS CLI 或使用 Lambda 主控台，使用下列各節中的步驟來設定手動模式。

**警告**  
當您將執行時期設定變更為手動模式時，您的 Lambda 函式不會收到自動安全性更新，直到還原為自動模式為止。在此期間，您的 Lambda 函式可能容易受到安全漏洞的影響。

 **先決條件** 
+ 安裝 [ jq](https://jqlang.github.io/jq/)
+ 安裝最新版本的 AWS CLI。如需詳細資訊，請參閱 [AWS CLI 安裝和更新說明](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions)。

### 步驟 1：取得 Lambda 函式 ARN
<a name="UpgradeLambda_ObtainFunctionARN"></a>

執行下列命令，從回應中擷取 `EngineArn` 欄位。這個 `EngineArn` 是與 Canary 關聯之 Lambda 函式的 ARN。您會在後續步驟中用到此 ARN。

```
aws synthetics get-canary --name my-canary | jq '.Canary.EngineArn'
```

`EngingArn` 的輸出範例：

```
"arn:aws:lambda:us-west-2:123456789012:function:cwsyn-my-canary-dc5015c2-db17-4cb5-afb1-EXAMPLE991:8"
```

### 步驟 2：取得最後一個有效的 Lambda 執行時期版本 ARN
<a name="UpgradeLambda_RuntimeARN"></a>

為協助了解您的 Canary 是否受到 Lambda 執行時期更新的影響，請檢查日誌中 Lambda 執行時期版本 ARN 變更的時間點，是否與您觀察到的 Canary 環境受影響的時間點相符。如果不相符，問題很可能並非由 Lambda 執行時期更新所導致。

如果您的 Canary 受到 Lambda 執行時期更新的影響，您必須識別先前使用之正常運作 Lambda 執行時期版本的 ARN。依循[識別執行時期版本變更](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html#runtime-management-identify.html)中的說明，尋找先前執行時期的 ARN。記錄執行時期版本 ARN，並繼續執行步驟 3：設定執行時期管理組態。

如果您的 Canary 尚未受到 Lambda 環境更新的影響，您可以找到目前正在使用之 Lambda 執行時期版本的 ARN。執行下列命令，從回應中擷取 Lambda 函式的 `RuntimeVersionArn`。

```
aws lambda get-function-configuration \
--function-name "arn:aws:lambda:us-west-2:123456789012:function:cwsyn-my-canary-dc5015c2-db17-4cb5-afb1-EXAMPLE991:8" | jq '.RuntimeVersionConfig.RuntimeVersionArn'
```

`RuntimeVersionArn` 的輸出範例：

```
"arn:aws:lambda:us-west-2::runtime:EXAMPLE647b82f490a45d7ddd96b557b916a30128d9dcab5f4972911ec0f"
```

### 步驟 3：更新 Lambda 執行時期管理組態
<a name="UpgradeLambda_Update"></a>

您可以使用 AWS CLI 或 Lambda 主控台來更新執行時間管理組態。

 **使用 AWS CLI設定 Lambda 執行時期管理組態手動模式** 

輸入下列命令，將 Lambda 函式的執行時期管理變更為手動模式。請務必使用您在步驟 1 中找到的值，將 *function-name* 和*限定詞*分別取代為 Lambda 函數 ARN 和 Lambda 函數版本編號。也請將 * runtime-version-arn* 取代為您在步驟 2 中找到的版本 ARN。

```
aws lambda put-runtime-management-config \
    --function-name "arn:aws:lambda:us-west-2:123456789012:function:cwsyn-my-canary-dc5015c2-db17-4cb5-afb1-EXAMPLE991" \
    --qualifier 8 \
    --update-runtime-on "Manual" \
    --runtime-version-arn "arn:aws:lambda:us-west-2::runtime:a993d90ea43647b82f490a45d7ddd96b557b916a30128d9dcab5f4972911ec0f"
```

**使用 Lambda 主控台將 Canary 變更為手動模式**

1. 在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1. 選擇**版本**索引標籤，選擇與您的 ARN 對應的版本編號連結，然後選擇**程式碼**索引標籤。

1. 向下捲動至**執行時期設定**，展開**執行時期管理組態**，然後複製**執行時期版本 ARN**。  
![\[顯示畫面的執行時期設定區段，並顯示執行時期版本 ARN 在此區段中的位置。\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/SyntheticsManual1.png)

1. 選擇**編輯執行時間管理組態**，選擇**手動**，將您先前複製的執行時間版本 ARN 貼到**執行時間版本 ARN** 欄位。然後選擇 **Save** (儲存)。  
![\[顯示執行時期管理組態畫面，並顯示要將先前複製的執行時期版本 ARN 貼至何處。\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/SyntheticsManual2.png)

## 我的 Canary 被 封鎖 AWS WAF
<a name="Canary_Blocked_WAF"></a>

若要允許 Canary 流量通過 AWS WAF，請建立 AWS WAF 字串比對條件，以允許您指定的自訂字串。如需詳細資訊，請參閱 AWS WAF 文件中的[使用字串比對條件](https://docs.aws.amazon.com/waf/latest/developerguide/classic-web-acl-string-conditions.html)。

我們強烈建議您使用自己的自訂使用者代理程式字串，而非使用預設值。這可以更好地控制 AWS WAF 篩選並提升安全性。

若要設定自訂使用者代理程式字串，請執行下列動作：
+ 對於 Playwright 執行時間，您可以使用 Synthetics 組態檔案附加 AWS WAF 已核准的自訂使用者代理程式字串。如需詳細資訊，請參閱[CloudWatch Synthetics 組態](Synthetics_WritingCanary_Nodejs_Playwright.md#Synthetics_canary_configure_Playwright_script)。
+ 對於 Puppeteer 或 Selenium 執行時期，您可以使用支援的程式庫函式新增自訂使用者代理程式字串。如需了解 Puppeteer 執行時期，請參閱 [async addUserAgent(page, userAgentString);](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_addUserAgent)。如需了解 Selenium 執行時期，請參閱 [add\$1user\$1agent(user\$1agent\$1str)](CloudWatch_Synthetics_Canaries_Library_Python.md#CloudWatch_Synthetics_Library_add_user_agent)。

## 等待元素出現
<a name="CloudWatch_Synthetics_Canaries_Troubleshoot_waiting"></a>

分析日誌和螢幕擷取畫面後，如果您看到指令碼正在等待元素出現在螢幕上並逾時，請檢查相關的螢幕擷取畫面，看看元素是否出現在頁面上。確認您的 `xpath`，以確保它正確無誤。

對於 Puppetteer 相關問題，請檢查 [Puppeteer 的 GitHub 頁面](https://github.com/puppeteer/puppeteer/issues)或網際網路論壇。

## 節點不可見或不是 page.click() 的 HTMLElement
<a name="CloudWatch_Synthetics_Canaries_Troubleshoot_notvisible"></a>

如果節點不可見或不是 `page.click()` 的 `HTMLElement`，首先驗證您正在使用的 `xpath`，以按一下元素。另外，如果元素位於屏幕底部，請調整檢視區。CloudWatch Synthetics 預設使用的檢視區是 1920 \$1 1080。您可以在啟動瀏覽器或使用 Puppeteer 函數 `page.setViewport` 時，設定不同的檢視區。

## 無法上傳成品到 S3，例外狀況：無法擷取 S3 儲存貯體位置：拒絕存取
<a name="CloudWatch_Synthetics_Canaries_Troubleshoot_noupload"></a>

如果您的 Canary 因 Simple Storage Service (Amazon S3) 錯誤而失效，則 CloudWatch Synthetics 會因為許可問題而無法上傳為 Canary 建立的螢幕擷取畫面、日誌或報告。請檢查以下內容：
+ 檢查 Canary 的 IAM 角色是否具有 `s3:ListAllMyBuckets` 許可、正確 Simple Storage Service (Amazon S3) 儲存貯體的 `s3:GetBucketLocation` 許可，以及 Canary 存放其成品之儲存貯體的 `s3:PutObject` 許可。如果 Canary 執行視覺監控，則角色也需要儲存貯體的 ` s3:GetObject` 許可。如果 Canary 部署在具有 VPC 端點的 VPC 中，則 Amazon VPC S3 閘道端點政策也需要這些相同的許可。
+  如果 Canary 使用 AWS KMS 客戶受管金鑰進行加密，而不是標準 AWS 受管金鑰 （預設），則該 Canary 的 IAM 角色可能沒有使用該金鑰加密或解密的許可。如需詳細資訊，請參閱[加密 Canary 成品](CloudWatch_Synthetics_artifact_encryption.md)。
+ 您的儲存貯體政策可能不允許 Canary 使用的加密機制。例如，如果您的儲存貯體政策要求使用特定的加密機制或 KMS 金鑰，則您必須為 Canary 選取相同的加密模式。

如果 Canary 執行視覺監控，請參閱 [使用視覺監控時更新成品位置和加密](CloudWatch_Synthetics_artifact_encryption.md#CloudWatch_Synthetics_artifact_encryption_visual) 以了解詳細資訊。

## 錯誤：通訊協定錯位 (Runtime.callFunctionOn)：目標關閉。
<a name="CloudWatch_Synthetics_Canaries_Troubleshoot_protocolError"></a>

如果頁面或瀏覽器關閉後存在某些網路請求，就會出現此錯誤。您可能忘記等待非同步操作。執行您的指令碼後，CloudWatch Synthetics 會關閉瀏覽器。瀏覽器關閉後執行任何非同步操作可能會導致 `target closed error`。

## Canary 失敗。錯誤：沒有資料點 - Canary 顯示逾時錯誤
<a name="CloudWatch_Synthetics_Canaries_Troubleshoot_nodatapoint"></a>

這意味著您的 Canary 執行超過逾時時間。在 CloudWatch Synthetics 發布成功百分比 CloudWatch 指標或更新成品 (例如 HAR 檔案、日誌和螢幕擷取畫面) 之前，Canary 執行已停止。如果您的逾時太低，您可以增加它。

預設情況下，Canary 逾時值等於其頻率。您可以手動將逾時值調整為小於或等於 Canary 頻率。如果您的 Canary 頻率很低，則必須增加頻率以增加逾時。當您使用 CloudWatch Synthetics 主控台建立或更新 Canary 時，您可於 **Schedule** (排程) 之下調整頻率和逾時值。

請確定您的逾時值不短於 15 秒，以允許 Lambda 冷啟動和啟動 canary 儀器所需的時間。

發生此錯誤時，無法在 CloudWatch Synthetics 主控台中檢視 Canary 成品。您可以使用 CloudWatch Logs 來查看 Canary 的日誌。

**若要使用 CloudWatch Logs 查看 Canary 的日誌**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在左側導覽窗格中，選擇 **Log groups** (日誌群組)。

1. 在篩選條件方塊中輸入 Canary 名稱，以尋找日誌群組。Canary 的日誌群組具有名稱 **/aws/lambda/cwsyn-*canaryName* -randomId**。

## 嘗試存取內部端點
<a name="CloudWatch_Synthetics_Canaries_Troubleshoot_internalendpoint"></a>

如果您希望 Canary 存取內部網路上的端點，我們建議您將 CloudWatch Synthetics 設定為使用 VPC。如需詳細資訊，請參閱[在 VPC 上執行 Canary](CloudWatch_Synthetics_Canaries_VPC.md)。

## Canary 執行時間版本升級和降級問題
<a name="CloudWatch_Synthetics_Canaries_Troubleshoot_upgradeissues"></a>

如果您最近將 Canary 從執行時間版本 `syn-1.0` 升級至最新版本，它可能是跨來源請求共享 (CORS) 問題。如需詳細資訊，請參閱[跨來源請求共享 (CORS) 問題](#CloudWatch_Synthetics_Canaries_CORS)。

如果您最近將 Canary 降級到較舊的執行時間版本，請檢查以確定您正在使用的 CloudWatch Synthetics 函數在您降級到較舊的執行時間版本中可用。例如，`executeHttpStep` 函數可用於執行時間版本 `syn-nodejs-2.2` 和更新版本。若要檢查函數的可用性，請參閱 [撰寫 Canary 指令碼](CloudWatch_Synthetics_Canaries_WritingCanary.md)。

**注意**  
當您計劃升級或降級 Canary 的執行時期版本時，我們建議您先複製 Canary 並更新所複製 Canary 中的執行時期版本。一旦您驗證了含新版執行時間的複製 Canary 可運作，您可以更新原始 Canary 的執行時間版本並刪除複製的 Canary。

## 跨來源請求共享 (CORS) 問題
<a name="CloudWatch_Synthetics_Canaries_CORS"></a>

在 UI Canary 中，如果某些網絡請求失敗並顯示 `403` 或 ` net::ERR_FAILED`，請檢查 Canary 是否已啟用作用中追蹤，並使用 Puppeteer 函數 `page.setExtraHTTPHeaders` 以新增標頭。如果是這樣，失敗的網路請求可能是跨來源請求共享 (CORS) 限制所造成。您可以藉由停用作用中追蹤或移除額外的 HTTP 標頭來確認是否會發生這種情況。

 **為什麼會出現這種情況？** 

使用作用中追蹤時，會將額外的標頭新增至所有傳出要求，以追蹤呼叫。透過新增追蹤標頭或使用 Puppeteer 的 `page.setExtraHTTPHeaders` 會導致 XMLHttpRequest (XHR) 請求的 CORS 檢查。

如果您不想停用作用中追蹤或移除額外的標題，則可以更新 Web 應用程式以允許跨來源存取，或者您可以在您的指令碼中啟動 Chrome 瀏覽器時使用 `disable-web-security` 旗標。

您可以覆寫 CloudWatch Synthetics 使用的啟動參數，並使用 CloudWatch Synthetics 啟動函數傳遞其他 ` disable-web-security` 旗標參數。如需詳細資訊，請參閱[適用於使用 Puppeteer 之 Node.js Canary 指令碼的程式庫函式](CloudWatch_Synthetics_Canaries_Library_Nodejs.md)。

**注意**  
當您使用執行時間版本 `syn-nodejs-2.1` 或更新版本時，您可以覆寫 CloudWatch Synthetics 使用的啟動參數。

## Canary 競爭條件問題
<a name="CloudWatch_Synthetics_Canaries_RaceCondition"></a>

為獲得最佳的 CloudWatch Synthetics 使用體驗，請確保為 Canary 編寫的程式碼具有冪等性。否則，在極少數情況下， Canary 執行可能會遇到競態條件，即 Canary 在不同執行中與同一資源交互時發生衝突。

## 對 VPC 上的 Canary 進行故障診斷
<a name="CloudWatch_Synthetics_Canaries_VPC_troubleshoot"></a>

如果您在建立或更新 VPC 上的 Canary 後發生問題，下列其中一個章節可能可以協助您對問題進行故障診斷。

### 處於錯誤狀態的新 Canary 或 Canary 無法更新
<a name="CloudWatch_Synthetics_Canaries_VPC_troubleshoot_errorstate"></a>

如果您建立要在 VPC 上執行的 Canary，而且它立即進入錯誤狀態，或您無法更新要在 VPC 上執行的 Canary，Canary 的角色可能不具備適當的許可。若要在 VPC 上執行，Canary 必須具有 ` ec2:CreateNetworkInterface`、`ec2:DescribeNetworkInterfaces` 和 ` ec2:DeleteNetworkInterface` 許可。這些許可都包含在 ` AWSLambdaVPCAccessExecutionRole` 受管政策中。如需詳細資訊，請參閱[執行角色和使用者許可](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-permissions)。

如果此問題是在您建立 Canary 時發生，您必須刪除 Canary，然後建立新的 Canary。如果您使用 CloudWatch 主控台建立新的 Canary，請在 **Access Permissions** (存取許可)，選取 **Create a new role** (建立新角色)。系統會建立包含執行 Canary 所需之所有許可的新角色。

如果此問題是在您更新 Canary 時發生，您可以再次更新 Canary，並提供具備必要許可的新角色。

### 「No test result returned」(未傳回測試結果) 錯誤
<a name="CloudWatch_Synthetics_Canaries_VPC_troubleshoot_noresult"></a>

如果 Canary 顯示「no test result returned」(未傳回測試結果) 錯誤，則原因可能是下列其中一個問題：
+ 如果 VPC 沒有網際網路存取權，您必須使用 VPC 端點來讓 Canary 存取 CloudWatch 和 Simple Storage Service (Amazon S3)。您必須在 VPC 中啟用 **DNS resolution (DNS 解析)** 和 **DNS hostname (DNS 主機名稱)** 選項，才能正確解析這些端點位址。如需詳細資訊，請參閱[搭配 VPC 使用 DNS](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html) 和[搭配介面 VPC 端點使用 CloudWatch 和 CloudWatch Synthetics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-and-interface-VPC.html)。
+ Canary 必須在 VPC 內的私有子網路中執行。若要檢查此問題，請在 VPC 主控台中開啟**子網路**頁面。檢查您在設定 Canary 時所選取的子網路。如果子網路具有網際網路閘道 (**igw-**) 的路徑，則不是私有子網路。

為協助您對這些問題進行故障診斷，請參閱 Canary 的日誌。

**如何查看來自 Canary 的日誌事件**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇 **Log groups** (日誌群組)。

1. 選擇 Canary 日誌群組的名稱。日誌群組名稱開頭為 ` /aws/lambda/cwsyn-canary-name`。

## 對自動重試 Canary 進行疑難排解
<a name="CloudWatch_Synthetics_Canaries_autoretry"></a>

若要了解 Canary 失敗的原因或分析特定嘗試為何失敗，請依循這些疑難排解步驟。

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

1. 選擇 **Canary**。

1. 在**可用性**索引標籤下，您可以採用以下任一方法，檢查執行詳細資訊：
   + 在 Canary Runs 圖形上選取特定點
   + 在**問題**下，選取記錄。請注意，重試嘗試會加上標籤，並與排程的執行共用時間戳記

   您可以在**步驟**、**螢幕擷取畫面**、**日誌**、**HAR 檔案**或**追蹤 （如果啟用主動追蹤）** 下檢視其他資訊。

1. 在 **Canary 成品和 Amazon S3 位置**下，可以存取成品，並透過可用的連結導覽至 Amazon S3 資料夾或儲存貯體。

1. **Canary 執行**圖形使用不同的彩色點來表示各種狀態：
   + 藍點 – 表示成功排程的執行，一致性值為 100%
   + 紅點 – 顯示排程執行與所有重試均失敗，標記為 0%
   + 橘點 – 顯示 0% 或 100%。0% 表示先前嘗試失敗後持續重試，100% 表示重試後成功

# Canary 指令碼的範本程式碼
<a name="CloudWatch_Synthetics_Canaries_Samples"></a>

本節包含說明 CloudWatch Synthetics Canary 指令碼的一些可能函數的程式碼範例。

## Node.js 和 Playwright 的範例
<a name="Synthetics_Canaries_Samples_nodejs_playwright"></a>

### 具有多個步驟的 Playwright Canary
<a name="Synthetics_canary_example_nodejs_playwright_multistep"></a>

下列指令碼是包含多個步驟的 Node.js Playwright Canary 範例。

```
import { synthetics } from '@aws/synthetics-playwright';

export async function handler(event, context) {
  try {
    console.log('Running Synthetics Playwright canary');
    const browser = await synthetics.launch();
    const browserContext = await browser.newContext();
    const page = await synthetics.getPage(browserContext);
    

    // Add steps
    // Step 1
    await synthetics.executeStep("home-page", async () => {
      console.log("Verify home page loads")
      await page.goto('https://www.amazon.com', {waitUntil: "load"});
      await new Promise(r => setTimeout(r, 5000));
    });
    
    // Step 2
    await synthetics.executeStep("search", async () => {
      console.log("Searching for a product")
      const searchInput = page.getByPlaceholder("Search Amazon").first();
      await searchInput.click()
      await searchInput.fill('Amazon echo');
      const btn = page.getByRole('button', { name: 'Go' }).first()
      await btn.click({ timeout: 15000 })
      console.log("Clicked search button")
    });

    // Step 3
    await synthetics.executeStep("search-results", async () => {
      console.log("Verifying search results")
      const resultsHeading = page.getByText("Results", {exact: true}).first()
      await resultsHeading.highlight();
      await new Promise(r => setTimeout(r, 5000));
    });

  } finally {
    // Close all browser contexts and browser
    await synthetics.close();
  }
}
```

### Playwright Canary 設定 Cookie
<a name="Synthetics_canaries_nodejs_playwright_cookies"></a>

下列指令碼是 Node.js Playwright Canary 設定三個 Cookie 的範例。

```
import { synthetics } from '@aws/synthetics-playwright';

export const handler = async (event, context) => {
  try {
    let url = "http://smile.amazon.com/";
    const browser = await synthetics.launch();
    const page = await synthetics.getPage(browser);
    const cookies = [{
        'name': 'cookie1',
        'value': 'val1',
        'url': url
    },
    {
        'name': 'cookie2',
        'value': 'val2',
        'url': url
    },
    {
        'name': 'cookie3',
        'value': 'val3',
        'url': url
    }
   ];
   await page.context().addCookies(cookies);
   await page.goto(url, {waitUntil: 'load', timeout: 30000});
   await page.screenshot({ path: '/tmp/smile.png' });
    
  } finally {
    await synthetics.close();
  }
};
```

## Node.js 與 Puppeteer 的範例
<a name="CloudWatch_Synthetics_Canaries_Samples_nodejspup"></a>

### 設定 Cookie
<a name="CloudWatch_Synthetics_Canaries_Samples_cookies"></a>

網站依賴 Cookie 來提供自訂功能或追蹤使用者。透過在 CloudWatch Synthetics 指令碼中設定 Cookie，您可以模擬此自訂行為並進行驗證。

例如，網站可能會顯示 **Login** (登入) 連結，以重新造訪使用者而不是 **Register** (登錄) 連結。

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');

const pageLoadBlueprint = async function () {

    let url = "http://smile.amazon.com/";

    let page = await synthetics.getPage();

    // Set cookies.  I found that name, value, and either url or domain are required fields.
    const cookies = [{
      'name': 'cookie1',
      'value': 'val1',
      'url': url
    },{
      'name': 'cookie2',
      'value': 'val2',
      'url': url
    },{
      'name': 'cookie3',
      'value': 'val3',
      'url': url
    }];
    
    await page.setCookie(...cookies);

    // Navigate to the url
    await synthetics.executeStep('pageLoaded_home', async function (timeoutInMillis = 30000) {
        
        var response = await page.goto(url, {waitUntil: ['load', 'networkidle0'], timeout: timeoutInMillis});

        // Log cookies for this page and this url
        const cookiesSet = await page.cookies(url);
        log.info("Cookies for url: " + url + " are set to: " + JSON.stringify(cookiesSet));
    });

};

exports.handler = async () => {
    return await pageLoadBlueprint();
};
```

### 裝置模擬
<a name="CloudWatch_Synthetics_Canaries_Samples_device"></a>

您可以編寫模擬各種裝置的指令碼，以便您可以大致了解頁面在這些裝置上的外觀和行為。

下列範例會模擬 iPhone 6 裝置。如需模擬的詳細資訊，請參閱 Puppeteer 文件中的 [ page.emulate(options)](https://pptr.dev/#?product=Puppeteer&version=v5.3.1&show=api-pageemulateoptions)。

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');
const puppeteer = require('puppeteer-core');

const pageLoadBlueprint = async function () {
    
    const iPhone = puppeteer.devices['iPhone 6'];

    // INSERT URL here
    const URL = "https://amazon.com";

    let page = await synthetics.getPage();
    await page.emulate(iPhone);

    //You can customize the wait condition here. For instance,
    //using 'networkidle2' may be less restrictive.
    const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000});
    if (!response) {
        throw "Failed to load page!";
    }
    
    await page.waitFor(15000);

    await synthetics.takeScreenshot('loaded', 'loaded');
    
    //If the response status code is not a 2xx success code
    if (response.status() < 200 || response.status() > 299) {
        throw "Failed to load page!";
    }
};

exports.handler = async () => {
    return await pageLoadBlueprint();
};
```

### 多步驟 API Canary
<a name="CloudWatch_Synthetics_Canaries_Samples_APIsteps"></a>

此範本程式碼示範了具有兩個 HTTP 步驟的 API Canary：為正面和負面測試案例測試相同的 API。傳遞步驟組態，以啟用請求/回應標頭的報告。此外，它會隱藏授權標頭和 X-Amz-Security-Token，因為它們包含使用者憑證。

當此指令碼用作 Canary 時，您可以檢視每個步驟和相關 HTTP 請求的詳細資訊，例如步驟通過/失敗、持續時間和效能度量，例如 DNS 查詢時間和第一個位元組時間。您可以檢視 Canary 執行的 2xx、4xx 和 5xx 數目。

```
var synthetics = require('@aws/synthetics-puppeteer');
const log = require('@aws/synthetics-logger');

const apiCanaryBlueprint = async function () {
    
    // Handle validation for positive scenario
    const validatePositiveCase = async function(res) {
        return new Promise((resolve, reject) => {
            if (res.statusCode < 200 || res.statusCode > 299) {
                throw res.statusCode + ' ' + res.statusMessage;
            }
     
            let responseBody = '';
            res.on('data', (d) => {
                responseBody += d;
            });
     
            res.on('end', () => {
                // Add validation on 'responseBody' here if required. For ex, your status code is 200 but data might be empty
                resolve();
            });
        });
    };
    
    // Handle validation for negative scenario
    const validateNegativeCase = async function(res) {
        return new Promise((resolve, reject) => {
            if (res.statusCode < 400) {
                throw res.statusCode + ' ' + res.statusMessage;
            }
            
            resolve();
        });
    };
    
    let requestOptionsStep1 = {
        'hostname': 'myproductsEndpoint.com',
        'method': 'GET',
        'path': '/test/product/validProductName',
        'port': 443,
        'protocol': 'https:'
    };
    
    let headers = {};
    headers['User-Agent'] = [synthetics.getCanaryUserAgentString(), headers['User-Agent']].join(' ');
    
    requestOptionsStep1['headers'] = headers;

    // By default headers, post data and response body are not included in the report for security reasons. 
    // Change the configuration at global level or add as step configuration for individual steps
    let stepConfig = {
        includeRequestHeaders: true, 
        includeResponseHeaders: true,
        restrictedHeaders: ['X-Amz-Security-Token', 'Authorization'], // Restricted header values do not appear in report generated.
        includeRequestBody: true,
        includeResponseBody: true
    };
       

    await synthetics.executeHttpStep('Verify GET products API with valid name', requestOptionsStep1, validatePositiveCase, stepConfig);
    
    let requestOptionsStep2 = {
        'hostname': 'myproductsEndpoint.com',
        'method': 'GET',
        'path': '/test/canary/InvalidName(',
        'port': 443,
        'protocol': 'https:'
    };
    
    headers = {};
    headers['User-Agent'] = [synthetics.getCanaryUserAgentString(), headers['User-Agent']].join(' ');
    
    requestOptionsStep2['headers'] = headers;

    // By default headers, post data and response body are not included in the report for security reasons. 
    // Change the configuration at global level or add as step configuration for individual steps
    stepConfig = {
        includeRequestHeaders: true, 
        includeResponseHeaders: true,
        restrictedHeaders: ['X-Amz-Security-Token', 'Authorization'], // Restricted header values do not appear in report generated.
        includeRequestBody: true,
        includeResponseBody: true
    };
    
    await synthetics.executeHttpStep('Verify GET products API with invalid name', requestOptionsStep2, validateNegativeCase, stepConfig);
    
};

exports.handler = async () => {
    return await apiCanaryBlueprint();
};
```

## Python 和 Selenium 範例
<a name="CloudWatch_Synthetics_Canaries_Samples_pythonsel"></a>

以下範例 Selenium 程式碼是一個在未載入目標元素時失敗並顯示自訂錯誤訊息的 Canary。

```
from aws_synthetics.selenium import synthetics_webdriver as webdriver
from aws_synthetics.common import synthetics_logger as logger
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def custom_selenium_script():
    # create a browser instance
    browser = webdriver.Chrome()
    browser.get('https://www.example.com/')
    logger.info('navigated to home page')
    # set cookie
    browser.add_cookie({'name': 'foo', 'value': 'bar'})
    browser.get('https://www.example.com/')
    # save screenshot
    browser.save_screenshot('signed.png')
    # expected status of an element
    button_condition = EC.element_to_be_clickable((By.CSS_SELECTOR, '.submit-button'))
    # add custom error message on failure
    WebDriverWait(browser, 5).until(button_condition, message='Submit button failed to load').click()
    logger.info('Submit button loaded successfully')
    # browser will be quit automatically at the end of canary run, 
    # quit action is not necessary in the canary script
    browser.quit()

# entry point for the canary
def handler(event, context):
    return custom_selenium_script()
```

# Canary 和 X-Ray 追蹤
<a name="CloudWatch_Synthetics_Canaries_tracing"></a>

您可以選擇在使用 ` syn-nodejs-2.0`或更新版本執行時間的 Canary 上啟用主動 AWS X-Ray 追蹤。啟用追蹤後，系統會針對使用瀏覽器、 AWS SDK 或 HTTP 或 HTTPS 模組的 Canary 進行的所有呼叫傳送追蹤。已啟用追蹤功能的 Canary 會在您為應用程式啟用它之後顯示在 [X-Ray 追蹤地圖](https://docs.aws.amazon.com/xray/latest/devguide/xray-console-servicemap.html)和 [Application Signals](CloudWatch-Application-Monitoring-Sections.md) 中。

**注意**  
在亞太地區（雅加達），啟用 canary 上的 X-Ray 追蹤尚未獲得支援。  
Firefox 瀏覽器 Canary 不支援 X-Ray 追蹤。

當 Canary 出現在 X-Ray 追蹤地圖上時，它會顯示為新的用戶端節點類型。您可以將滑鼠暫留在 Canary 節點上，以查看有關延遲、請求和錯誤的資料。您也可以選擇 Canary 節點以在頁面底部查看更多資料。在頁面的這個區域中，您可以選擇 **View in Synthetics** (在 Synthetics 中檢視) 跳至 CloudWatch Synthetics 主控台，以取得有關 Canary 的詳細資訊；或選擇 **View Traces** (檢視追蹤) 查看有關此 Canary 執行的追蹤的詳細資訊。

啟用追蹤的 Canary 也有一個 **Tracing** (追蹤) 標籤，其中包含有關 Canary 執行中的追蹤和區段的詳細資訊。

啟用追蹤會將 Canary 執行時間增加 2.5% 至 7%。

啟用追蹤的 Canary 必須使用具有下列許可的角色。如果您在建立 Canary 時使用主控台建立角色，則會授予這些許可。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Sid230934",
            "Effect": "Allow",
            "Action": [
                "xray:PutTraceSegments"
            ],
            "Resource": "*"
        }
    ]
}
```

------

Canary 產生的追蹤會產生費用。如需 X-Ray 儲存定價的詳細資訊，請參閱 [AWS X-Ray 定價](https://aws.amazon.com/xray/pricing/)。

# 在 VPC 上執行 Canary
<a name="CloudWatch_Synthetics_Canaries_VPC"></a>

您可以在 VPC 的端點以及公有內部端點上執行 Canary。若要在 VPC 上執行 Canary，您必須同時在 VPC 上啟用 **DNS Resolution (DNS 解析)** 和 **DNS hostnames (DNS 主機名稱)** 選項。如需詳細資訊，請參閱[使用 DNS 與您的 VPC 搭配](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。

當您在 VPC 端點上執行 Canary 時，您必須提供方法讓它將其指標傳送至 CloudWatch 並將其成品傳送至 Simple Storage Service (Amazon S3)。如果 VPC 已啟用網際網路存取功能，您不需要再執行任何其他操作。Canary 會在 VPC 中執行，但可存取網際網路以上傳其指標和成品。

若未針對網際網路存取啟用 VPC，則有下列兩種選擇：
+ 啟用 IPv4 網際網路存取權，讓 Canary 能夠將指標傳送至 CloudWatch 和 Amazon S3。如需詳細資訊，請參閱下一節「[為 VPC 上的 Canary 提供網際網路存取](#CloudWatch_Synthetics_VPC_Internet)」。
+ 若要將 VPC 保持為私有狀態，您可設定 Canary 以透過私有 VPC 端點將其資料傳送至 CloudWatch 和 Simple Storage Service (Amazon S3)。如果您尚未這樣做，則必須為 CloudWatch 建立 VPC 端點 (com.amazonaws.*region*.monitoring)，並為 Amazon S3 建立閘道端點。如需詳細資訊，請參閱 [使用 CloudWatch、CloudWatch Synthetics 和 CloudWatch 網路監控搭配介面 VPC 端點](cloudwatch-and-interface-VPC.md) 和 [Simple Storage Service (Amazon S3) 的 Amazon VPC 端點](https://docs.aws.amazon.com/glue/latest/dg/vpc-endpoints-s3.html)。

## 為 VPC 上的 Canary 提供網際網路存取
<a name="CloudWatch_Synthetics_VPC_Internet"></a>

請依循下列步驟，讓您的 VPC Canary 存取網際網路，或為您的 Canary 指派靜態 IP 位址

**為 VPC 上的 Canary 提供網際網路存取權 (IPv4)**

1. 建立 VPC 公有子網路的 NAT 閘道。如需說明，請參閱[建立 NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-creating)。

1. 將新路由新增至啟動 Canary 之私有子網路中的路由表。指定下列內容：
   + 針對 **Destination** (目的地)，輸入 **0.0.0.0/0**
   + 對於**目標**，選擇 **NAT 閘道**，然後選擇您所建立之 NAT 閘道的 ID。
   + 選擇 **Save routes** (儲存路由)。

   如需將路由新增至路由表的詳細資訊，請參閱[從路由表新增和移除路由](https://docs.aws.amazon.com/vpc/latest/userguide/WorkWithRouteTables.html#AddRemoveRoutes)。

**為 VPC 上的 Canary 提供網際網路存取權 (IPv6)**

1. 將 VPC 設定為具有雙堆疊子網路。您必須將輸出限定網際網路閘道新增至 VPC、更新路由表以允許流量通過網際網路閘道，並允許從關聯的安全群組實作出站存取。如需詳細資訊，請參閱[新增 VPC 的 IPv6 支援](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-add.html)。

1. 使用 `CreateCanary` 或 `UpdateCanary` API 在 Canary VPC 組態中設定 `Ipv6AllowedForDualstack `。如需詳細資訊，請參閱 [VpcConfigInput](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_VpcConfigInput.html)。

   若要啟用來自 Canary 的出站 IPv6 流量，必須為 Canary 連結的 VPC 子網路啟用雙堆疊功能。

**注意**  
請確定 NAT 閘道的路由處於 **active** (作用中) 狀態。如果 NAT 閘道已刪除，而您尚未更新路由，則它們會處於黑洞狀態。如需詳細資訊，請參閱[使用 NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-working-with)。

# 加密 Canary 成品
<a name="CloudWatch_Synthetics_artifact_encryption"></a>

CloudWatch Synthetics 會將 Canary 成品 (例如螢幕擷取畫面、HAR 檔案和報告) 存放在 Simple Storage Service (Amazon S3) 儲存貯體中。根據預設，這些成品會使用 AWS 受管金鑰進行靜態加密。如需詳細資訊，請參閱[客戶金鑰和 AWS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-mgmt.html) 。

您可以選擇使用其他加密選項。CloudWatch Synthetics 支援下列各項：
+ **SSE-S3** – 使用 Simple Storage Service (Amazon S3) 受管金鑰的伺服器端加密。
+ **SSE-KMS** – 使用 AWS KMS 客戶受管金鑰的伺服器端加密 (SSE)。

如果您想要搭配 AWS 受管金鑰使用預設加密選項，則不需要任何其他許可。

若要使用 SSE-S3 加密，建立或更新 Canary 時，您可以指定 **SSE\$1S3** 作為加密模式。您不需要任何其他許可，即可使用此加密模式。如需詳細資訊，請參閱[使用伺服器端加密與 Simple Storage Service (Amazon S3) 受管加密金鑰 (SSE-S3) 保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。

若要使用 AWS KMS 客戶受管金鑰，請在建立或更新 Canary 時指定 **SSE-KMS** 做為加密模式，並提供金鑰的 Amazon Resource Name (ARN)。您也可以使用跨帳戶 KMS 金鑰。

若要使用客戶受管金鑰，您需要以下設定：
+ 您的 Canary IAM 角色必須有許可才能使用您的金鑰加密成品。如果正在使用視覺監控，則您也必須為其授予許可以解密成品。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AllowKMSKeyUsage",
              "Effect": "Allow",
              "Action": [
                  "kms:GenerateDataKey",
                  "kms:Decrypt"
              ],
              "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
          }
      ]
  }
  ```

------
+ 您可以將 IAM 角色新增至金鑰政策，而不是將許可新增至 IAM 角色。如果對多個 Canary 使用相同的角色，則您應該考慮這種方法。

  ```
  {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
          "AWS": "Your synthetics IAM role ARN"
      },
      "Action": [
          "kms:GenerateDataKey",
          "kms:Decrypt"
      ],
      "Resource": "*"
  }
  ```
+ 如果您使用的是跨帳戶 KMS 金鑰，請參閱[允許其他帳戶中的使用者使用 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

 **使用客戶受管金鑰時檢視加密的 Canary 成品** 

若要檢視 Canary 成品，請更新您的客戶受管金鑰，將 AWS KMS 解密許可提供給檢視成品的使用者。或者，將解密許可新增至正在檢視成品的使用者或 IAM 角色。

預設 AWS KMS 政策可讓帳戶中的 IAM 政策允許存取 KMS 金鑰。如果您使用的是跨帳戶 KMS 金鑰，請參閱[為什麼跨帳戶使用者在嘗試存取由自訂 AWS KMS 金鑰加密的 Amazon S3 物件時收到存取遭拒錯誤？](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-denied-error-s3/)。

如需因 KMS 金鑰而存取遭拒之問題的疑難排解詳細資訊，請參閱[對金鑰存取進行疑難排解](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html)。

## 使用視覺監控時更新成品位置和加密
<a name="CloudWatch_Synthetics_artifact_encryption_visual"></a>

為了執行視覺監控，CloudWatch Synthetics 會將您的螢幕擷取畫面與在選取作為基準之執行中取得的基準螢幕擷取畫面進行比較。如果更新成品位置或加密選項，則您必須執行以下其中一項：
+ 確保您的 IAM 角色對成品的先前 Simple Storage Service (Amazon S3) 位置和新 Simple Storage Service (Amazon S3) 位置具有足夠的許可。同時請確保其具有先前和新加密方法以及 KMS 金鑰的許可。
+ 透過選取下一個 Canary 執行作為新基準來建立新基準。如果使用此選項，則您只需確保您的 IAM 角色具有足夠的許可，可供新的成品位置和加密選項使用。

建議您選取下一次執行作為新基準的第二個選項。這避免了依賴於您不再為 Canary 使用的成品位置或加密選項。

例如，假設您的 Canary 使用成品位置 A 和 KMS 金鑰 K 來上傳成品。如果將 Canary 更新為成品位置 B 和 KMS 金鑰 L，則您可以確保 IAM 角色擁有兩個成品位置 (A 和 B) 和兩個 KMS 金鑰 (K 和 L) 的許可。或者，您可以選取下一次執行作為新基準，並確保您的 Canary IAM 角色擁有成品位置 B 和 KMS 金鑰 L 的許可。

# 檢視 Canary 統計資料和詳細資訊
<a name="CloudWatch_Synthetics_Canaries_Details"></a>

您可以檢視 Canary 的詳細資訊，並查看其執行的統計資料。

您必須登入具有足夠許可的帳戶，才能查看 Canary 執行結果的所有詳細資訊。如需詳細資訊，請參閱[CloudWatch Canary 的必要角色和許可](CloudWatch_Synthetics_Canaries_Roles.md)。

**檢視 Canary 統計資料和詳細資訊**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

   在您建立的 Canary 的詳細資訊中：
   + **Status (狀態)** 會以視覺化方式顯示您的 Canary 有多少個已通過最近的執行。
   + **Groups** (群組) 會顯示您已建立的群組，並顯示其中有多少個已失敗或有警示的 Canary。
   + **Slowest performers** (效能最差) 會顯示 Canary 效能最差的群組和區域。此項的計算方法是將群組或區域內所有 Canary (所選取的時間範圍內) 的平均持續時間相加，然後除以群組或區域中的 Canary 數量。如果選擇 Slowest (最差) 群組指标，系統會對資料表進行篩選，僅顯示效能最差的群組及其 Canary。資料表是依平均持續時間排序。
   + 頁面底部附近有一個顯示了所有 Canary 的表格。您可以使用篩選列篩選資料表，依特定 Canary 名稱、上次的執行結果、成功百分比、警示、執行率、Canary 狀態、執行時期和唯一標籤顯示 Canary。

     對於警示資料欄，只會顯示符合 Canary 警示命名標準的警示。此標準為 `Synthetics-Alarm-canaryName -index`。您在 CloudWatch 主控台的 ** Synthetics** 區段中建立的 Canary 警示會自動使用此命名慣例。如果您在 CloudWatch 主控台的**警示**區段中或使用 建立 Canary 警示 AWS CloudFormation，而且您不使用此命名慣例，則警示會運作，但不會出現在此清單中。

1. 若要查看單一 Canary 的詳細資訊，請在 Canary 資料表中選擇 ** Canary **的名稱。

   在關於 Canary 的詳細資訊中：
   + **Availability** (可用性) 標籤會顯示有關此 Canary 最近執行的資訊。

     在 **Canary runs (Canary 執行)** 下，您可以選擇其中一行，以查看該執行的詳細資訊。

     在圖表下，您可以選擇**步驟**、**螢幕擷取畫面** 、**日誌**或 **HAR 檔案**，以查看這些類型的詳細資訊。如果 Canary 已啟用主動追蹤，您也可以選擇**追蹤**來查看 Canary 執行的追蹤資訊。

     Canary 執行的日誌儲存在 S3 儲存貯體和 CloudWatch Logs 中。

     螢幕擷取畫面會顯示您的客戶如何檢視您的網頁。您可以使用 HAR 檔案 (HTTP 封存檔案) 來檢視有關網頁的詳細效能資料。您可以分析 Web 請求的清單，並掌握效能問題，例如項目載入的時間。日誌檔案顯示 Canary 執行和網頁之間的互動記錄，並可用於識別錯誤的詳細資訊。

     如果 Canary 使用 `syn-nodejs-2.0-beta` 執行時間或更新版本，您可以依狀態碼、請求大小或持續時間來排序 HAR 檔案。

     **Steps** (步驟) 索引標籤會顯示一份清單，其中包含 Canary 的步驟、每個步驟的狀態、失敗原因、步驟執行後的 URL、螢幕擷取畫面以及步驟執行持續時間。對於具有 HTTP 步驟的 API Canary，如果您使用的是執行時間 `syn-nodejs-2.2` 或更新版本，則可以查看步驟和相應的 HTTP 請求。

     選擇 **HTTP Requests** (HTTP 請求) 標籤來檢視由 Canary 發出的每個 HTTP 請求的日誌。您可以檢視請求/回應標頭、回應內文、狀態碼、錯誤和效能計時 (總持續時間、TCP 連線時間、TLS 交握時間、第一個位元組時間和內容傳輸時間)。此處可擷取所有實際使用 HTTP/HTTPS 模組的 HTTP 請求。

     根據預設，在 API Canary 中，基於安全原因，報告中不會包含請求標頭、回應標頭、請求內文和回應內文。如果選擇包含它們，則資料只會存放於 S3 儲存貯體中。如需如何在報告內包含此資料的相關資訊，請參閱 [executeHttpStep(stepName, requestOptions, [callback], [stepConfig])](CloudWatch_Synthetics_Canaries_Library_Nodejs.md#CloudWatch_Synthetics_Library_executeHttpStep)。

     支援文字、HTML 和 JSON 的回應內文內容類型。支援 text/HTML、text/plain、application/JSON 和 application/x-amz-json-1.0 之類的內容類型。不支援壓縮回應。
   + **Monitoring** (監控) 標籤會顯示此 Canary 發布的 CloudWatch 指標圖形。如需這些指標的詳細資訊，請參閱 [Canary 公佈的 CloudWatch 指標](CloudWatch_Synthetics_Canaries_metrics.md)。

     Canary 發布的 CloudWatch 圖形下方是與 Canary Lambda 程式碼相關的 Lambda 指標圖形。
   + **Configuration** (組態) 標籤會顯示有關 Canary 的組態和排程資訊。
   + **Groups** (群組) 索引標籤會顯示與此 Canary 關聯的群組 (如果有)。
   + **Tags** (標籤) 標籤會顯示與 Canary 相關的標籤。

# Canary 公佈的 CloudWatch 指標
<a name="CloudWatch_Synthetics_Canaries_metrics"></a>

Canary 會將以下指標發布到 `CloudWatchSynthetics` 命名空間中的 CloudWatch。如需檢視 CloudWatch 指標的詳細資訊，請參閱 [檢視可用的指標](viewing_metrics_with_cloudwatch.md) 。

**注意**  
對於多瀏覽器 Canary，預設會啟用瀏覽器維度指標，助力了解 Chrome、Firefox 和其他瀏覽器的效能。若要停用瀏覽器指標，請將 `browserDimension` 設定為 `false`。  
對於單一瀏覽器 Canary，瀏覽器維度指標預設停用，以避免備援。若要檢視依瀏覽器細分的指標，請將 `browserDimension` 設定為 ` true`。


| 指標 | Description | 
| --- | --- | 
|   `2xx`   |  傳回 OK 回應的 Canary 執行的網路請求數目，回應代碼介於 200 到 299 之間。 為使用執行時間版本 ` syn-nodejs-2.0` 或更新版本的 UI Canary 報告了此指標，也為使用執行時間版本 `syn-nodejs-2.2` 或更新版本的 API Canary 報告了此指標。 有效維度：CanaryName、Browser 有效統計資訊：總和 單位：Count  | 
|   `4xx`   |  傳回 Error 回應的 Canary 執行的網路請求數目，回應代碼介於 400 到 499 之間。 為使用執行時間版本 ` syn-nodejs-2.0` 或更新版本的 UI Canary 報告了此指標，也為使用執行時間版本 `syn-nodejs-2.2` 或更新版本的 API Canary 報告了此指標。 有效維度：CanaryName、Browser 有效統計資訊：總和 單位：Count  | 
|   `5xx`   |  傳回 Fault 回應的 Canary 執行的網路請求數目，回應代碼介於 500 到 599 之間。 為使用執行時間版本 ` syn-nodejs-2.0` 或更新版本的 UI Canary 報告了此指標，也為使用執行時間版本 `syn-nodejs-2.2` 或更新版本的 API Canary 報告了此指標。 有效維度：CanaryName、Browser 有效統計資訊：總和 單位：Count  | 
|   `Duration`   |  Canary 執行的持續時間 (以毫秒為單位)。 有效維度：CanaryName、Browser 有效的統計數字：平均 單位：毫秒  | 
|   `DurationDryRun`   |  DryRun 執行的持續時間。 有效維度：CanaryName、Browser 有效的統計數字：平均 單位：毫秒  | 
|   `EphemeralStorageUsagePercent`   |  相較於設定的總臨時儲存空間，實際使用之臨時儲存空間的百分比上限。此指標每 10 秒收集一次。  | 
|   `Failed`   |  無法執行的 Canary 執行次數。這些失敗與 Canary 本身有關。 有效維度：CanaryName、Browser 有效統計資訊：總和 單位：Count  | 
|   `Failed requests`   |  Canary 在目標網站上執行失敗且沒有回應的 HTTP 請求數目。 有效維度：CanaryName、Browser 有效統計資訊：總和 單位：Count  | 
|   `RetryCount`   |  Canary 重試的次數。此指標僅在發生重試時顯示。 有效維度：CanaryName、Browser 有效統計資訊：總和 單位：Count  | 
|   `SuccessPercent`   |  此 Canary 成功執行且找不到失敗的百分比。 有效維度：CanaryName、Browser 有效的統計數字：平均 單位：百分比  | 
|   `SuccessPercentDryRun`   |  DryRun 執行成功的百分比。 有效維度：CanaryName、Browser 有效的統計數字：平均 單位：百分比  | 
|   `SuccessPercentWithRetries`   |  在所有嘗試後成功執行此 Canary 的百分比。 有效維度：CanaryName、Browser 有效的統計數字：平均 單位：百分比  | 
|   `VisualMonitoringSuccessPercent`   |  在 Canary 執行期間，成功比對基線螢幕擷取畫面的視覺化比較百分比。 有效維度：CanaryName、Browser 有效的統計數字：平均 單位：百分比  | 
|   `VisualMonitoringTotalComparisons`   |  在 Canary 執行期間發生的視覺化比較總數。 有效維度：CanaryName、Browser 單位：Count  | 

**注意**  
使用來自 Synthetics 程式庫的 `executeStep()` 或 `executeHttpStep()` 方法的 Canary 還會為每個步驟發布具有維度 `CanaryName` 和 `StepName` 的 `SuccessPercent` 和 ` Duration` 指標。

 

# 編輯或刪除 Canary
<a name="synthetics_canaries_deletion"></a>

您可以編輯或刪除現有 Canary。

 **編輯 Canary** 

當您編輯 Canary 時，即使您沒有變更其排程，排程也會根據您編輯 Canary 的時間進行重設。例如，如果您的 Canary 每小時執行一次，並且您編輯該 Canary，則在編輯完成後會立即執行，然後每小時執行一次。

**若要編輯或更新 Canary**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

1. 選取 Canary 名稱旁的按鈕，然後選擇**動作**、**編輯**。

1. (選用) 如果此 Canary 執行螢幕擷取畫面的視覺化監控，而您想要將下一次的 Canary 執行設定為基準，請選取 **Set next run as new baseline** (將下一次執行設定為新基準)。

1. (選用) 如果此 Canary 執行螢幕擷取畫面的視覺化監控，而您想要從視覺化監控中移除螢幕擷取畫面，或者您想要在視覺化比較期間指定要忽略螢幕擷取畫面的部分，請在 **Visual Monitoring** (視覺化監控) 下選擇 **Edit Baseline** (編輯基準)。

   出現螢幕擷取畫面時，您可以執行下列其中一項：
   + 若要移除用於視覺化監控的螢幕擷取畫面，請選取 **Remove screenshot from visual test baseline** (從視覺化測試基準中移除螢幕擷取畫面)。
   + 若要指定要在視覺化比較期間忽略的螢幕擷取畫面的部分，請按一下並拖曳以繪製要忽略的螢幕區域。一旦您對比較期間想要忽略的所有區域執行此操作，請選擇 **Save** (儲存)。

1. 在**指令碼編輯器**、**執行時期版本**下，選取 Synthetics 執行時期版本以執行 Canary。如需 Synthetics 執行時期版本的資訊，請參閱 [Synthetics 執行時期版本](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html)。

   在**瀏覽器組態**下，您可以啟用瀏覽器以測試 Canary。必須至少選擇一個瀏覽器。

1. 對 Canary 進行任何其他您想要的變更，然後選擇 **Save** (儲存)。

 **刪除 Canary** 

刪除 Canary 時，您可以選擇是否同時刪除 Canary 使用和建立的其他資源。如果 Canary 的 `ProvisionedResourceCleanup` 欄位設定為 ` AUTOMATIC`，或者在刪除 Canary 時將 `DeleteLambda` 指定為 `true`，CloudWatch Synthetics 會自動刪除 Canary 使用的 Lambda 函式和圖層。

刪除 Canary 時，也應一併刪除下列內容：
+ 此 Canary 使用的 Lambda 函數和圖層。它們的字首是 `cwsyn- MyCanaryName`。
+ 為此 Canary 建立的 CloudWatch 警示。這些警示的名稱以 ` Synthetics-Alarm-MyCanaryName` 為開頭。如需刪除警示的詳細資訊，請參閱[編輯或刪除 CloudWatch 警示](Edit-CloudWatch-Alarm.md)。
+ Simple Storage Service (Amazon S3) 物件和儲存貯體，例如 Canary 的結果位置和成品位置。
+ 為 Canary 建立的 IAM 角色。它們的名稱為 ` role/service-role/CloudWatchSyntheticsRole-MyCanaryName`。
+ 為 Canary 建立的 CloudWatch Logs 中的日誌群組。這些日誌群組具有下列名稱：`/aws/lambda/cwsyn-MyCanaryName-randomId`。

刪除 Canary 之前，您可能需要檢視 Canary 詳細資料，並記下此資訊。這樣，您才能在刪除 Canary 後刪除正確的資源。

**若要刪除 Canary**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

1. 如果 Canary 目前處於 `RUNNING` 狀態，必須將其停用。您只能刪除處於 `STOPPED`、`READY(NOT_STARTED)` 或 `ERROR` 狀態的 Canary。

   若要停止 Canary，請選取 Canary 名稱旁的按鈕，然後選擇**動作**、**停止**。

1. 選取 Canary 名稱旁的按鈕，然後選擇**動作**、**刪除**。

1. 選擇是否同時刪除 Canary 建立和使用的其他資源。Lambda 函式和圖層將與 Canary 一起刪除，但您也可以選擇刪除 Canary 的 IAM 角色和 IAM 政策。

   在方塊中輸入 **Delete**，然後選擇 **Delete** (刪除)。

1. 如本節稍早所列，刪除為 Canary 使用和建立的其他資源。

# 啟動、停止、刪除或更新多個 Canary 的執行階段
<a name="synthetics_canaries_multi-action"></a>

您可以使用一個動作來停止、啟動、刪除或更新多達五個 Canary 的執行階段。如果您更新 Canary 的執行階段，它會更新為適用於 Canary 使用的語言和架構的最新執行階段。

如果您選取多個 Canary，且只有部分處於對所選動作有效的狀態，則只會在該動作有效的 Canary 上執行動作。例如，如果您選取一些正在執行的 Canary 和一些沒有執行的 Canary，並且您選擇啟動 Canary，則尚未執行的 Canary 將會啟動，而已在執行的 Canary 不會受到影響。

如果您選取的 Canary 都不適用於某個動作，則該動作將無法在選單中使用。

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，依序選擇 **Application Signals**、**Synthetics Canary**。

1. 選取要停止、啟動或刪除的 Canary 旁邊的核取方塊。

1. 選擇**動作**，然後選擇**開始**、**停止**、**刪除**、**開始幹執行**或**更新執行時間**。

   此外，選擇**更新執行時期**時，您可以選擇在遞交變更之前，先模擬執行執行時期更新。

# 使用 Amazon EventBridge 監控 Canary 事件
<a name="monitoring-events-eventbridge"></a>

當 Canary 變更狀態或完成執行時，Amazon EventBridge 事件規則可以通知您。EventBridge 提供near-real-time的系統事件串流，說明 AWS 資源的變更。CloudWatch Synthetics 會*全力*將這些事件傳送至 Eventbridge。全力傳遞意味著 CloudWatch Synthetics 會嘗試將所有事件傳送至 EventBridge，但在某些罕見的情況下，事件可能無法傳遞。EventBridge 至少會處理一次接收的所有事件。此外，您的事件接聽程式可能不會依事件發生順序接收事件。

**注意**  
Amazon EventBridge 是匯流排服務，可讓您用於將應用程式與來自各種來源的資料互相連線。如需詳細資訊，請參閱*《Amazon EventBridge 使用者指南》*中的[什麼是 Amazon EventBridge？](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)。

當 Canary 變更狀態或完成執行時，CloudWatch Synthetics 會發出事件。您可以建立包含事件模式的 EventBridge 規則，以符合從 CloudWatch Synthetics 傳送的所有事件類型，或只符合特定事件類型。當 Canary 觸發規則時，Eventbridge 會叫用該規則已定義的目標動作。這可讓您傳送通知、擷取事件資訊、採取修正動作、回應 Canary 狀態變更或完成 Canary 執行。例如，您可以為下列使用案例建立規則：
+ 調查 Canary 執行失敗的時間
+ 調查 Canary 何時進入 `ERROR` 狀態
+ 追蹤 Canary 的生命週期
+ 作為工作流程的一部分，監控 Canary 執行成功或失敗

## 來自 CloudWatch Synthetics 的範例事件
<a name="synthetics-event-examples"></a>

此區段列出了來自 CloudWatch Synthetics 的範例事件。如需有關事件格式的詳細資訊，請參閱 [EventBridge 中的事件和時間模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html)。

 **Canary 狀態變更** 

在此事件類型中，`current-state` 和 `previous-state` 可以是下列項目：

`CREATING` \$1 `READY` \$1 `STARTING` \$1 `RUNNING` \$1 `UPDATING` \$1 `STOPPING` \$1 `STOPPED` \$1 `ERROR`

```
{
                "version": "0",
                "id": "8a99ca10-1e97-2302-2d64-316c5dedfd61",
                "detail-type": "Synthetics Canary Status Change",
                "source": "aws.synthetics",
                "account": "123456789012",
                "time": "2021-02-09T22:19:43Z",
                "region": "us-east-1",
                "resources": [],
                "detail": {
                                "account-id": "123456789012",
                                "canary-id": "EXAMPLE-dc5a-4f5f-96d1-989b75a94226",
                                "canary-name": "events-bb-1",
                                "current-state": "STOPPED",
                                "previous-state": "UPDATING",
                                "source-location": "NULL",
                                "updated-on": 1612909161.767,
                                "changed-config": {
                                                "executionArn": {
                                                                "previous-value": "arn:aws:lambda:us-east-1:123456789012:function:cwsyn-events-bb-1-af3e3a05-dc5a-4f5f-96d1-989EXAMPLE:1",
                                                                "current-value": "arn:aws:lambda:us-east-1:123456789012:function:cwsyn-events-bb-1-af3e3a05-dc5a-4f5f-96d1-989EXAMPLE:2"
                                                },
                                                "vpcId": {
                                                                "current-value": "NULL"
                                                },
                                                "testCodeLayerVersionArn": {
                                                                "previous-value": "arn:aws:lambda:us-east-1:123456789012:layer:cwsyn-events-bb-1-af3e3a05-dc5a-4f5f-96d1-989EXAMPLE:1",
                                                                "current-value": "arn:aws:lambda:us-east-1:123456789012:layer:cwsyn-events-bb-1-af3e3a05-dc5a-4f5f-96d1-989EXAMPLE:2"
                                                }
                                },
                                "message": "Canary status has changed"
                }
}
```

 **已完成成功的 Canary 執行** 

```
{
                "version": "0",
                "id": "989EXAMPLE-f4a5-57a7-1a8f-d9cc768a1375",
                "detail-type": "Synthetics Canary TestRun Successful",
                "source": "aws.synthetics",
                "account": "123456789012",
                "time": "2021-02-09T22:24:01Z",
                "region": "us-east-1",
                "resources": [],
                "detail": {
                                "account-id": "123456789012",
                                "canary-id": "989EXAMPLE-dc5a-4f5f-96d1-989b75a94226",
                                "canary-name": "events-bb-1",
                                "canary-run-id": "c6c39152-8f4a-471c-9810-989EXAMPLE",
                                "artifact-location": "cw-syn-results-123456789012-us-east-1/canary/us-east-1/events-bb-1-ec3-28ddbe266797/2021/02/09/22/23-41-200",
                                "test-run-status": "PASSED",
                                "state-reason": "null",
                                "canary-run-timeline": {
                                                "started": 1612909421,
                                                "completed": 1612909441
                                },
                                "message": "Test run result is generated successfully"
                }
}
```

 **已完成失敗的 Canary 執行** 

```
{
                "version": "0",
                "id": "2644b18f-3e67-5ebf-cdfd-bf9f91392f41",
                "detail-type": "Synthetics Canary TestRun Failure",
                "source": "aws.synthetics",
                "account": "123456789012",
                "time": "2021-02-09T22:24:27Z",
                "region": "us-east-1",
                "resources": [],
                "detail": {
                                "account-id": "123456789012",
                                "canary-id": "af3e3a05-dc5a-4f5f-96d1-9989EXAMPLE",
                                "canary-name": "events-bb-1",
                                "canary-run-id": "0df3823e-7e33-4da1-8194-b04e4d4a2bf6",
                                "artifact-location": "cw-syn-results-123456789012-us-east-1/canary/us-east-1/events-bb-1-ec3-989EXAMPLE/2021/02/09/22/24-21-275",
                                "test-run-status": "FAILED",
                                "state-reason": "\"Error: net::ERR_NAME_NOT_RESOLVED \""
                                "canary-run-timeline": {
                                                "started": 1612909461,
                                                "completed": 1612909467
                                },
                                "message": "Test run result is generated successfully"
                }
}
```

事件可能會重複或不按順序。若要判斷事件的順序，請使用 `time` 屬性。

## 建立 EventBridge 規則的先決條件
<a name="create-events-rule-prereqs"></a>

在您為 CloudWatch Synthetics 建立 Eventbridge 規則之前，請執行下列動作：
+ 熟悉 Eventbridge 中的事件、規則和目標。
+ 建立和設定將由您的 Eventbridge 規則叫用的目標。規則可以叫用許多類型的目標，包括：
  + Amazon SNS 主題
  + AWS Lambda 函數
  + Kinesis 串流
  + Amazon SQS 佇列

如需詳細資訊，請參閱*《Amazon EventBridge 使用者指南》*中的[什麼是 Amazon EventBridge？](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html) 和 [Amazon EventBridge 入門](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-getting-set-up.html)。

## 建立 EventBridge 規則 (CLI)
<a name="create-events-rule-cli"></a>

下列範例中的步驟會建立 EventBridge 規則，該規則會在 `us-east-1` 中名為 `my-canary-name` 的 Canary 完成執行或變更狀態時發布 Amazon SNS 主題。

1. 建立 規則。

   ```
   aws events put-rule \
     --name TestRule \
     --region us-east-1 \ 
     --event-pattern "{\"source\": [\"aws.synthetics\"], \"detail\": {\"canary-name\": [\"my-canary-name\"]}}"
   ```

   模式省略的任何屬性會遭到忽略。

1. 新增主題作為規則目標。
   + 使用 Amazon SNS 主題的 Amazon Resource Name (ARN) 取代為 *topic-arn*。

   ```
   aws events put-targets \
     --rule TestRule \
     --targets "Id"="1","Arn"="topic-arn"
   ```
**注意**  
若要讓 Amazon EventBridge 呼叫您的目標主題，您必須將以資源為基礎的政策新增到您的主題。如需詳細資訊，請參閱*《Amazon EventBridge 使用者指南》*中的 [Amazon SNS 許可](https://docs.aws.amazon.com/eventbridge/latest/userguide/resource-based-policies-eventbridge.html#sns-permissions)。

如需詳細資訊，請參閱*《Amazon EventBridge 使用者指南》*中的 [EventBridge 中的事件和事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html)。

# 執行安全 Canary 更新
<a name="performing-safe-canary-upgrades"></a>

CloudWatch 合成安全 Canary 更新可讓您在套用變更之前，先測試現有 Canary 的更新。此功能可協助您驗證 Canary 與新執行時期和其他組態變更的相容性，例如程式碼或記憶體變更。這有助於將錯誤更新造成的潛在監控中斷降至最低。

透過在執行時期版本更新、組態變更和程式碼指令碼修改中使用 Canary 安全更新，您可以降低風險、維持不間斷的監控、在遞交前驗證變更、進行更新並減少停機時間。

**Topics**
+ [先決條件](#performing-safe-canary-upgrades-prereq)
+ [最佳實務](#performing-safe-canary-upgrades-best-practices)
+ [使用模擬執行測試 Canary](#performing-safe-canary-upgrades-getting-started)
+ [限制](#performing-safe-canary-upgrades-limitations)

## 先決條件
<a name="performing-safe-canary-upgrades-prereq"></a>

確定滿足必要條件。
+ AWS 具有 CloudWatch 合成許可的帳戶
+ 支援的執行時期版本上的現有 Canary (請參閱[限制](#performing-safe-canary-upgrades-limitations)了解相容的執行時期)
+ 執行模擬執行時包含相容的執行時期 (請參閱[限制](#performing-safe-canary-upgrades-limitations)了解相容的執行時期)

## 最佳實務
<a name="performing-safe-canary-upgrades-best-practices"></a>

以下是執行 Canary 時要遵循的一些最佳實務。
+ 執行模擬執行以驗證執行時期更新
+ 在生產更新至 Canary 之前執行模擬執行
+ 模擬執行完成後檢閱 Canary 日誌和成品
+ 使用模擬執行來驗證相依項和程式庫相容性

## 使用模擬執行測試 Canary
<a name="performing-safe-canary-upgrades-getting-started"></a>

您可以使用下列選項來測試 Canary 更新：

 **使用 AWS 管理主控台的編輯工作流程** 

1. 前往 CloudWatch 合成主控台。

1. 選取要更新的 Canary。

1. 從**動作**下拉式清單中，選擇**編輯**。

   使用要測試的變更來更新 Canary。例如，變更執行時期版本或編輯指令碼的程式碼。

1. 在 **Canary 指令碼**下，選擇**啟動模擬執行**以立即測試和檢視結果，或選擇頁面底部的**稍後驗證並儲存**以開始測試，並稍後前往 **Canary 詳細資訊**頁面檢視結果。

1. 模擬執行成功後，選擇**提交**以遞交 Canary 更新。

 **使用 AWS 管理主控台 更新批次中的 Canary** 

1. 前往 CloudWatch 合成主控台。

1. 選擇 **Synthetics** 清單頁面。

1. 選取最多五個您要更新執行時期的 Canary。

1. 從**動作**下拉式清單中，選擇**更新執行時期**。

1. 選擇**針對新的執行時期開始模擬執行**，以開始模擬執行，並在更新之前測試您的變更。

1. 在 **Synthetics** 清單頁面上，您會在 Canary 的**執行時間**版本旁看到文字，顯示乾執行的進度 （這只會針對涉及執行時間更新的乾執行顯示）。

   一旦模擬執行成功，您會看到**啟動更新**文字。

1. 選擇**啟動更新**以遞交執行時期更新。

1. 如果模擬執行失敗，您會看到**更新模擬執行失敗**的文字。選擇文字以檢視 Canary 詳細資訊頁面的偵錯連結。

 **使用 AWS CLI 或 SDK** 

API 會啟動所提供 Canary 名稱 `MyCanary` 的模擬執行，並將執行時期版本更新為 `syn-nodejs-puppeteer-10.0`。

```
aws synthetics start-canary-dry-run \
    --name MyCanary \
    --runtime-version syn-nodejs-puppeteer-10.0
      
      // Or if you wanted to update other configurations:

aws synthetics start-canary-dry-run \
    --name MyCanary \
    --execution-role-arn arn:aws:iam::123456789012:role/NewRole
```

API 會在 `DryRunId`內傳回 `DryRunConfigOutput` 。

使用所提供的 `DryRunId` 呼叫 `GetCanary`，可接收 Canary 的模擬執行組態，以及包含列為 `DryRunConfig` 之模擬執行狀態的額外欄位 `LastDryRunExecutionStatus`。

```
aws synthetics get-canary \
    --name MyCanary \
    --dry-run-id XXXX-XXXX-XXXX-XXXX
```

如需詳細資訊，請使用 `GetCanaryRuns` 搭配提供的 `DryRunId` 來擷取執行和其他資訊。

```
aws synthetics get-canary-runs \
    --name MyCanary \
    --dry-run-id XXXX-XXXX-XXXX-XXXX
```

模擬執行成功後，您可以搭配提供的 ` DryRunId` 使用 `UpdateCanary`，以遞交變更。

```
aws synthetics update-canary \
    --name MyCanary \
    --dry-run-id XXXX-XXXX-XXXX-XXXX
```

當它因任何原因 (GetCanaryRuns 的結果詳細說明) 失敗時，`GetCanaryRuns` 的結果會有一個成品位置，其中包含要偵錯的日誌。沒有日誌時，就無法建立模擬執行。您可以使用 ` GetCanary` 驗證。

```
aws synthetics get-canary \
    --name MyCanary \
    --dry-run-id XXXX-XXXX-XXXX-XXXX
```

*狀態*、*StateReason* 和 * StateReasonCode* 會顯示試轉的狀態。

 **使用 CloudFormation** 

在 Synthetics Canary 的範本中，提供接受布林值 `true` 或 `false` 的欄位 `DryRunAndUpdate`。

當值為 `true` 時，每次更新都會執行一次模擬執行，以驗證變更內容，隨後才會自動更新 Canary。當試轉失敗時，Canary 不會更新，而且會以有效的原因使部署和 CloudFormation 部署失敗。若要偵錯此問題，請透過 [AWS Synthetics 主控台](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Troubleshoot.html)執行；或者如果使用 API，請使用 `GetCanaryRuns` API 取得 `ArtifactS3Location`，然後下載 `*-log.txt` 檔案以檢閱 Canary 日誌執行是否有錯誤。驗證之後，請修改 CloudFormation 範本並重試部署，或使用上述 API 進行驗證。

當值為 `false` 時，合成不會執行模擬執行以驗證變更，而是直接遞交您的更新。

如需排解 Canary 故障的資訊，請參閱 [對失敗的 Canary 進行故障診斷](CloudWatch_Synthetics_Canaries_Troubleshoot.md)。

範本範例。

```
SyntheticsCanary:
    Type: 'AWS::Synthetics::Canary'
    Properties:
      Name: MyCanary
      RuntimeVersion: syn-nodejs-puppeteer-10.0
      Schedule: {Expression: 'rate(5 minutes)', DurationInSeconds: 3600}
      ...
      DryRunAndUpdate: true
```

## 限制
<a name="performing-safe-canary-upgrades-limitations"></a>
+ 支援執行時間版本 – syn-nodejs-puppeteer-10.0\$1、syn-nodejs-playwright-2.0\$1、syn-python-selenium-5.1\$1 和 syn-nodejs-3.0\$1
+ 每個 Canary 一次只能執行一個模擬執行
+ 當模擬執行失敗時，您無法更新 Canary
+ 模擬執行無法測試任何**排程**欄位變更

**注意**  
當您使用 Playwright Canary 的程式碼變更啟動模擬執行，並且想要更新 Canary 而不提供相關聯的 `DryRunId` 時，必須明確指定程式碼參數。