

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用亚马逊监控 AWS PCS 实例 CloudWatch
<a name="monitoring-cloudwatch_instances"></a>

AWS PCS 会根据需要启动 Amazon EC2 实例，以满足您的 PCS 计算节点组中定义的扩展要求。您可以使用 Amazon 在这些实例运行时对其进行监控 CloudWatch。您可以通过登录实例并使用交互式命令行工具来检查正在运行的实例的日志。但是，默认情况下， CloudWatch 指标数据仅在实例终止后保留一段有限的时间，并且实例日志通常会与支持该实例的 EBS 卷一起删除。要保留终止后由 PCS 启动的实例的指标或日志数据，您可以使用 EC2 启动模板在您的实例上配置 CloudWatch 代理。本主题概述了监控正在运行的实例，并提供了如何配置永久性实例指标和日志的示例。

## 监控正在运行的实例
<a name="monitoring-cloudwatch_instances_running"></a>

### 查找 AWS PCS 实例
<a name="monitoring-cloudwatch_instances_finding"></a>

 要监控由 PCS 启动的实例，请查找与集群或计算节点组关联的正在运行的实例。然后，在给定实例的 EC2 控制台中，检查**状态和警报**以及**监控**部分。如果为这些实例配置了登录访问权限，则可以连接到这些实例并检查这些实例上的各种日志文件。有关识别哪些实例由 PCS 管理的更多信息，请参阅[在 AWS PCS 中查找计算节点组实例](working-with_compute-instances.md)。

### 启用详细指标
<a name="monitoring-cloudwatch_instances_enable-metrics"></a>

 默认情况下，每隔 5 分钟收集一次实例指标。要每隔一分钟收集指标，请在计算节点组启动模板中启用详细 CloudWatch 监控。有关更多信息，请参阅 [开启详细 CloudWatch 监控](working-with_launch-templates_parameters.md#working-with_launch-templates_parameters_cw)。

## 配置永久性实例指标和日志
<a name="monitoring-cloudwatch_instances_config-metrics"></a>

 您可以通过在实例上安装和配置 Amazon CloudWatch 代理，保留实例中的指标和日志。这包括三个主要步骤：

1.  创建 CloudWatch 代理配置。

1.  将配置存储在 PCS 实例可以检索的地方。

1.  编写一个 EC2 启动模板，用于安装 CloudWatch 代理软件、获取您的配置并使用配置启动 CloudWatch 代理。

 有关更多信息，请参阅 *Amazon CloudWatch 用户指南*中的使用[ CloudWatch 代理收集指标、日志和跟踪](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)，以及[在 AWS PCS 上使用亚马逊 EC2 启动模板](working-with_launch-templates.md)。

### 创建 CloudWatch 代理配置
<a name="monitoring-cloudwatch_instances_agent-config"></a>

 在您的实例上部署 CloudWatch 代理之前，您必须生成一个 JSON 配置文件，该文件指定要收集的指标、日志和跟踪。可以使用向导创建配置文件，也可以使用文本编辑器手动创建配置文件。将为本演示手动创建配置文件。

 在安装了 AWS CLI 的计算机上，创建一个名为 **config.json** 的 CloudWatch 配置文件，其中包含以下内容。您也可以使用以下 URL 下载该文件的副本。

```
https://aws-hpc-recipes.s3.amazonaws.com/main/recipes/pcs/cloudwatch/assets/config.json
```

**注意**
+ 示例文件中的日志路径适用于亚马逊 Linux 2。如果您的实例将使用不同的基础操作系统，请根据需要更改路径。
+ 要捕获其他日志，请在下添加其他条目`collect_list`。
+ 中的值`{brackets}`是模板化变量。有关支持变量的完整列表，请参阅 *Amazon CloudWatch 用户指南*中的[手动创建或编辑 CloudWatch 代理配置文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html)。
+ 您可以选择省略`logs`或`metrics`不想收集这些信息类型。

```
{
    "agent": {
        "metrics_collection_interval": 60
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/cloud-init.log",
                        "log_group_class": "STANDARD",
                        "log_group_name": "/PCSLogs/instances",
                        "log_stream_name": "{instance_id}.cloud-init.log",
                        "retention_in_days": 30
                    },
                    {
                        "file_path": "/var/log/cloud-init-output.log",
                        "log_group_class": "STANDARD",
                        "log_stream_name": "{instance_id}.cloud-init-output.log",
                        "log_group_name": "/PCSLogs/instances",
                        "retention_in_days": 30
                    },
                    {
                        "file_path": "/var/log/amazon/pcs/bootstrap.log",
                        "log_group_class": "STANDARD",
                        "log_stream_name": "{instance_id}.bootstrap.log",
                        "log_group_name": "/PCSLogs/instances",
                        "retention_in_days": 30
                    },
                    {
                        "file_path": "/var/log/slurmd.log",
                        "log_group_class": "STANDARD",
                        "log_stream_name": "{instance_id}.slurmd.log",
                        "log_group_name": "/PCSLogs/instances",
                        "retention_in_days": 30
                    },
                    {
                        "file_path": "/var/log/messages",
                        "log_group_class": "STANDARD",
                        "log_stream_name": "{instance_id}.messages",
                        "log_group_name": "/PCSLogs/instances",
                        "retention_in_days": 30
                    },
                    {
                        "file_path": "/var/log/secure",
                        "log_group_class": "STANDARD",
                        "log_stream_name": "{instance_id}.secure",
                        "log_group_name": "/PCSLogs/instances",
                        "retention_in_days": 30
                    }
                ]
            }
        }
    },
    "metrics": {
        "aggregation_dimensions": [
            [
                "InstanceId"
            ]
        ],
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "cpu": {
                "measurement": [
                    "cpu_usage_idle",
                    "cpu_usage_iowait",
                    "cpu_usage_user",
                    "cpu_usage_system"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ],
                "totalcpu": false
            },
            "disk": {
                "measurement": [
                    "used_percent",
                    "inodes_free"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "diskio": {
                "measurement": [
                    "io_time"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "swap": {
                "measurement": [
                    "swap_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}
```

 此文件指示 CloudWatch 代理监视多个文件，这些文件可能有助于诊断引导、身份验证和登录以及其他疑难解答域中的错误。这些方法包括：
+ `/var/log/cloud-init.log`— 实例配置初始阶段的输出
+ `/var/log/cloud-init-output.log`— 实例配置期间运行的命令的输出
+ `/var/log/amazon/pcs/bootstrap.log`— 在实例配置期间运行的 PC 特定操作的输出
+ `/var/log/slurmd.log`— 来自 Slurm 工作负载管理器的守护程序 slurmd 的输出
+ `/var/log/messages`— 来自内核、系统服务和应用程序的系统消息
+ `/var/log/secure`— 与身份验证尝试相关的日志，例如 SSH、sudo 和其他安全事件

 日志文件将发送到名为的 CloudWatch 日志组`/PCSLogs/instances`。日志流是实例 ID 和日志文件基本名称的组合。该日志组的保留时间为 30 天。

 此外，该文件还指示 CloudWatch 代理收集几个常用指标，按实例 ID 汇总这些指标。

### 存储配置
<a name="monitoring-cloudwatch_instances_store-config"></a>

 CloudWatch 代理配置文件必须存储在 PCS 计算节点实例可以访问的地方。有两种常见的方法可以做到这一点。您可以将其上传到您的计算节点组实例可以通过其实例配置文件访问的 Amazon S3 存储桶，或者，您可以将其作为 SSM 参数存储在 Amazon Systems Manager 参数存储中。

#### 上传到 S3 存储桶
<a name="monitoring-cloudwatch_instances_store-config_s3"></a>

 要将文件存储在 S3 中，请使用下面的 AWS CLI 命令。在运行命令之前，请进行以下替换：
+  *amzn-s3-demo-bucket*替换为您自己的 S3 存储桶名称 

 首先，（如果您已有存储桶，则这是可选的），创建一个存储桶来存放您的配置文件。

```
aws s3 mb s3://amzn-s3-demo-bucket
```

 接下来，将文件上传到存储桶。

```
aws s3 cp ./config.json s3://amzn-s3-demo-bucket/
```

#### 作为 SSM 参数存储
<a name="monitoring-cloudwatch_instances_store-config_ssm"></a>

要将文件存储为 SSM 参数，请使用以下命令。在运行命令之前，请进行以下替换：
+ *region-code*替换为您正在使用 AWS PCS 的 AWS 区域。
+ （可选）将参数*AmazonCloudWatch-PCS*替换为您自己的名称。请注意，如果您更改名称的前缀，则需要在节点组实例配置文件中专门添加对 SSM 参数的读取权限。`AmazonCloudWatch-`

```
aws ssm put-parameter \
   --region region-code \
   --name "AmazonCloudWatch-PCS" \
   --type String \
   --value file://config.json
```

### 编写 EC2 启动模板
<a name="monitoring-cloudwatch_instances_lt"></a>

 启动模板的具体细节取决于您的配置文件存储在 S3 还是 SSM 中。

#### 使用存储在 S3 中的配置
<a name="w2aac48c14c13b7c13b5"></a>

此脚本安装 CloudWatch 代理，从 S3 存储桶导入配置文件，然后使用该文件启动 CloudWatch 代理。用您自己的详细信息替换此脚本中的以下值：
+  *amzn-s3-demo-bucket*— 您的账户可以读取的 S3 存储桶的名称 
+  */config.json*— 相对于存储配置的 S3 存储桶根目录的路径 

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/cloud-config; charset="us-ascii"

packages:
- amazon-cloudwatch-agent

runcmd:
- aws s3 cp s3://amzn-s3-demo-bucket/config.json /etc/s3-cw-config.json
- /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file://etc/s3-cw-config.json

--==MYBOUNDARY==--
```

 节点组的 IAM 实例配置文件必须有权访问存储桶。以下是上述用户数据脚本中存储桶的 IAM 策略示例。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket",
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        }
    ]
}
```

------

 另请注意，这些实例必须允许流向 S3 和 CloudWatch终端节点的出站流量。这可以使用安全组或 VPC 终端节点来实现，具体取决于您的集群架构。

#### 使用存储在 SSM 中的配置
<a name="monitoring-cloudwatch_instances_use-ssm"></a>

此脚本安装 CloudWatch 代理，从 SSM 参数导入配置文件，然后使用该文件启动 CloudWatch 代理。用您自己的详细信息替换此脚本中的以下值：
+ （可选）将参数*AmazonCloudWatch-PCS*替换为您自己的名称。

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/cloud-config; charset="us-ascii"

packages:
- amazon-cloudwatch-agent

runcmd:
- /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-PCS

--==MYBOUNDARY==--
```

 节点组的 IAM 实例策略必须**CloudWatchAgentServerPolicy**附加。

 如果您的参数名称不是以开头，`AmazonCloudWatch-`则需要在节点组实例配置文件中专门添加对 SSM 参数的读取权限。以下是一个 IAM 策略示例，它说明了前缀的相关内容*DOC-EXAMPLE-PREFIX*。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement" : [
    {
      "Sid" : "CustomCwSsmMParamReadOnly",
      "Effect" : "Allow",
      "Action" : [
        "ssm:GetParameter"
      ],
      "Resource" : "arn:aws:ssm:*:*:parameter/DOC-EXAMPLE-PREFIX*"
    }
  ]
}
```

------

 另请注意，这些实例必须允许流向 SSM 和 CloudWatch终端节点的出站流量。这可以使用安全组或 VPC 终端节点来实现，具体取决于您的集群架构。