AWS Systems Manager
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

Systems Manager Inventory Manager 演练

使用以下演练收集和管理清单数据。我们建议您首先在测试环境中使用托管实例执行这些演练。

开始前的准备工作

在开始这些演练之前,请完成下列任务。

  • 更新需要清点的实例上的 SSM 代理。通过运行最新版本的 SSM 代理,可确保您能够收集所有支持的清单类型的元数据。有关如何使用 状态管理器 更新 SSM 代理 的信息,请参阅演练:自动更新 SSM 代理 (CLI)

  • 验证您的实例是否满足 Systems Manager 先决条件。有关更多信息,请参阅 Systems Manager 先决条件

  • (可选) 创建用于收集自定义清单的 JSON 文件。有关更多信息,请参阅 使用自定义清单

将自定义清单元数据分配给某个实例

以下步骤为您演示了使用 PutInventory API 操作将自定义清单元数据分配给托管实例的过程。此示例将机架位置信息分配给某个实例。有关自定义清单的更多信息,请参阅 使用自定义清单

将自定义清单元数据分配给某个实例

  1. 在您的本地计算机上,下载最新版本的 AWS CLI。

  2. 打开 AWS CLI 并运行以下命令指定您的凭证和区域。您必须在 Amazon EC2 中具有管理员权限,或者您必须在 AWS Identity and Access Management (IAM) 中被授予相应权限。

    aws configure

    系统将提示您指定以下内容。

    AWS Access Key ID [None]: key_name AWS Secret Access Key [None]: key_name Default region name [None]: region Default output format [None]: ENTER
  3. 执行以下命令,以便将机架位置信息分配给某个实例。

    aws ssm put-inventory --instance-id "ID" --items '[{"CaptureTime": "2016-08-22T10:01:01Z", "TypeName": "Custom:RackInfo", "Content":[{"RackLocation": "Bay B/Row C/Rack D/Shelf E"}], "SchemaVersion": "1.0"}]'
  4. 执行以下命令以便查看该实例的自定义清单条目。

    aws ssm list-inventory-entries --instance-id ID --type-name "Custom:RackInfo"

    系统会使用类似以下形式的信息进行响应。

    { "InstanceId": "ID", "TypeName": "Custom:RackInfo", "Entries": [ { "RackLocation": "Bay B/Row C/Rack D/Shelf E" } ], "SchemaVersion": "1.0", "CaptureTime": "2016-08-22T10:01:01Z" }
  5. 执行以下命令以便查看自定义元数据。

    aws ssm get-inventory

    系统会使用类似以下形式的信息进行响应。

    { "Entities": [ { "Data": { "AWS:InstanceInformation": { "Content": [ { "ComputerName": "WIN-9JHCEPEGORG.WORKGROUP", "InstanceId": "ID", "ResourceType": "EC2Instance", "AgentVersion": "3.19.1153", "PlatformVersion": "6.3.9600", "PlatformName": "Windows Server 2012 R2 Standard", "PlatformType": "Windows" } ], "TypeName": "AWS:InstanceInformation", "SchemaVersion": "1.0" } }, "Id": "ID" } ] }

使用 AWS CLI 收集清单

以下步骤为您演示了使用 Inventory 从 Amazon EC2 实例中收集元数据的过程。配置清单收集时,首先创建 Systems Manager 状态管理器 关联。Systems Manager 会在关联运行时收集清单数据。如果您不先创建关联,并试图使用 Run Command 等调用 aws:softwareInventory 插件,则系统会返回以下错误:

The aws:softwareInventory plugin can only be invoked via ssm-associate

注意

一个实例一次只能配置一个清单关联。如果您为实例配置了两个或更多清单关联,则关联不会运行,而且系统不会收集清单数据。

从实例收集清单

  1. 在您的本地计算机上,下载最新版本的 AWS CLI。

  2. 打开 AWS CLI 并运行以下命令指定您的凭证和区域。您必须在 Amazon EC2 中具有管理员权限,或者您必须在 AWS Identity and Access Management (IAM) 中被授予相应权限。

    aws configure

    系统将提示您指定以下内容。

    AWS Access Key ID [None]: key_name AWS Secret Access Key [None]: key_name Default region name [None]: region Default output format [None]: ENTER
  3. 执行以下命令,创建一个在实例上运行 Inventory 的 状态管理器 关联。此命令将服务配置为每六小时运行一次,并收集实例上的网络配置、Windows 更新和应用程序元数据。

    aws ssm create-association --name "AWS-GatherSoftwareInventory" --targets "Key=instanceids,Values=an instance ID" --schedule-expression "cron(0 0/30 * 1/1 * ? *)" --output-location "{ \"S3Location\": { \"OutputS3Region\": \"us-east-1\", \"OutputS3BucketName\": \"Test bucket\", \"OutputS3KeyPrefix\": \"Test\" } }" --parameters "networkConfig=Enabled,windowsUpdates=Enabled,applications=Enabled"

    系统会使用类似以下形式的信息进行响应。

    { "AssociationDescription": { "ScheduleExpression": "cron(0 0/30 * 1/1 * ? *)", "OutputLocation": { "S3Location": { "OutputS3KeyPrefix": "Test", "OutputS3BucketName": "Test bucket", "OutputS3Region": "us-east-1" } }, "Name": "The name you specified", "Parameters": { "applications": [ "Enabled" ], "networkConfig": [ "Enabled" ], "windowsUpdates": [ "Enabled" ] }, "Overview": { "Status": "Pending", "DetailedStatus": "Creating" }, "AssociationId": "1a2b3c4d5e6f7g-1a2b3c-1a2b3c-1a2b3c-1a2b3c4d5e6f7g", "DocumentVersion": "$DEFAULT", "LastUpdateAssociationDate": 1480544990.06, "Date": 1480544990.06, "Targets": [ { "Values": [ "i-1a2b3c4d5e6f7g" ], "Key": "InstanceIds" } ] } }

    您可以使用 Targets 参数来确定带有 EC2 标签的大型目标实例组。

    aws ssm create-association --name "AWS-GatherSoftwareInventory" --targets "Key=tag:Environment,Values=Production" --schedule-expression "cron(0 0/30 * 1/1 * ? *)" --output-location "{ \"S3Location\": { \"OutputS3Region\": \"us-east-1\", \"OutputS3BucketName\": \"Test bucket\", \"OutputS3KeyPrefix\": \"Test\" } }" --parameters "networkConfig=Enabled,windowsUpdates=Enabled,applications=Enabled"

    您还可以使用带有表达式的 fileswindowsRegistry 清单类型来清点 Windows 实例上的文件和 Windows 注册表项。有关这些清单类型的更多信息,请参阅使用文件和 Windows 注册表清单

    aws ssm create-association --name "AWS-GatherSoftwareInventory" --targets "Key=instanceids,Values=i-0704358e3a3da9eb1" --schedule-expression "cron(0 0/30 * 1/1 * ? *)" --parameters '{"files":["[{\"Path\": \"C:\\Program Files\", \"Pattern\": [\"*.exe\"], \"Recursive\": true}]"], "windowsRegistry": ["[{\"Path\":\"HKEY_LOCAL_MACHINE\\Software\\Amazon\", \"Recursive\":true}]"]}' --profile dev-pdx
  4. 执行以下命令查看关联状态。

    aws ssm describe-instance-associations-status --instance-id an instance ID

    系统会使用类似以下形式的信息进行响应。

    { "InstanceAssociationStatusInfos": [ { "Status": "Pending", "DetailedStatus": "Associated", "Name": "reInvent2016PolicyDocumentTest", "InstanceId": "i-1a2b3c4d5e6f7g", "AssociationId": "1a2b3c4d5e6f7g-1a2b3c-1a2b3c-1a2b3c-1a2b3c4d5e6f7g", "DocumentVersion": "1" } ] }

使用资源数据同步聚合清单数据

以下演练介绍如何使用 AWS CLI 创建资源数据同步配置。资源数据同步自动将所有托管实例的清单数据传输到中央 Amazon S3 存储桶。当发现新的清单数据时,同步自动更新中央 Amazon S3 存储桶中的数据。此演练还介绍如何使用 Amazon Athena 和 Amazon QuickSight 查询和分析聚合数据。有关使用 Amazon EC2 控制台创建资源数据同步的信息,请参阅 配置清单的资源数据同步

注意

本演练包括有关如何使用 AWS Key Management Service (AWS KMS) 加密同步的信息。清单不收集任何用户特定、专有或敏感数据,因此加密是可选的。有关 AWS KMS 的更多信息,请参阅 AWS Key Management Service Developer Guide

开始前的准备工作

在开始本演练之前,您必须从您的托管实例收集清单元数据。对于本演练中的 Amazon Athena 和 Amazon QuickSight,建议您收集应用程序元数据。有关如何收集清单数据的更多信息,请参阅 使用 AWS CLI 收集清单

(可选) 如果要使用 AWS KMS 加密同步,则必须创建包括以下策略的新密钥,或更新现有密钥并向其添加此策略。

{ "Version":"2012-10-17", "Id":"ssm-access-policy", "Statement":[ { "Sid":"ssm-access-policy-statement", "Action":[ "kms:GenerateDataKey" ], "Effect":"Allow", "Principal":{ "Service":"ssm.amazonaws.com" }, "Resource":"arn:aws:kms:region:AWS-account-ID:key/KMS-key-id" } ] }

创建清单的资源数据同步

  1. Open the Amazon S3 console at https://console.amazonaws.cn/s3/.

  2. 创建用来存储聚合清单数据的存储桶。有关更多信息,请参阅 Amazon Simple Storage Service Getting Started Guide 中的创建存储桶。请记下存储桶名称和创建此存储桶的 AWS 区域。

  3. 创建存储桶后,选择 Permissions 选项卡,然后选择 Bucket Policy

  4. 将下面的存储桶策略复制并粘贴到策略编辑器中。使用您创建的 Amazon S3 存储桶的名称和有效的 AWS 账户 ID 替换 Bucket-NameAccount-ID。或者,使用 Amazon S3 前缀 (子目录) 的名称替换 Bucket-Prefix。如果您未创建前缀,则从该策略的 ARN 中删除 Bucket-Prefix/。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "SSMBucketPermissionsCheck", "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::Bucket-Name" }, { "Sid": " SSMBucketDelivery", "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "s3:PutObject", "Resource": ["arn:aws:s3:::Bucket-Name/Bucket-Prefix/*/accountid=Account_ID_number/*"], "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
  5. (可选) 如果要加密同步,则必须将以下策略添加到存储桶。重复上一步骤以向存储桶添加以下策略。

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"ssm.amazonaws.com" }, "Action":"s3:PutObject", "Resource":"arn:aws:s3:::bucket-name/prefix/*", "Condition":{ "StringEquals":{ "s3:x-amz-server-side-encryption":"aws:kms", "s3:x-amz-server-side-encryption-aws-kms-key-id":"arn:aws:kms:region:AWS-account-ID:key/KMS-key-ID" } } } ] }
  6. 在您的本地计算机上,下载最新版本的 AWS CLI。

  7. 打开 AWS CLI 并运行以下命令指定您的凭证和区域。您必须在 Amazon EC2 中具有管理员权限,或者您必须在 AWS Identity and Access Management (IAM) 中被授予相应权限。

    aws configure

    系统将提示您指定以下内容。

    AWS Access Key ID [None]: key_name AWS Secret Access Key [None]: key_name Default region name [None]: region Default output format [None]: ENTER
  8. (可选) 如果要加密同步,请执行以下命令以验证存储桶策略是否强制执行 KMS 密钥要求。

    aws s3 cp ./A file in the bucket s3://bucket-name/prefix/ --sse aws:kms --sse-kms-key-id "arn:aws:kms:region:AWS-account-ID:key/KMS-key-id" --region region
  9. 执行以下命令,以使用您在此程序开始时创建的 Amazon S3 存储桶创建资源数据同步配置。此命令从您当前已登录的 AWS 区域创建同步。

    注意

    如果同步和目标 Amazon S3 存储桶位于不同区域,您可能需要支付数据传输价格。有关更多信息,请参阅 Amazon S3 定价

    aws ssm create-resource-data-sync --sync-name a name --s3-destination "BucketName=the name of the S3 bucket,Prefix=the name of the prefix, if specified,SyncFormat=JsonSerDe,Region=the region where the S3 bucket was created"

    您可以使用 region 参数指定创建同步配置的位置。在下例中,来自 us-west-1 区域的清单数据将同步到 us-west-2 区域中的 Amazon S3 存储桶。

    aws ssm create-resource-data-sync --sync-name InventoryDataWest --s3-destination "BucketName=InventoryData,Prefix=HybridEnv,SyncFormat=JsonSerDe,Region=us-west-2" --region us-west-1

    (可选) 如果要使用 AWS KMS 加密同步,请执行以下命令创建同步。如果您加密同步,则 AWS KMS 密钥和 Amazon S3 存储桶必须位于相同区域。

    aws ssm create-resource-data-sync --sync-name sync-name --s3-destination "BucketName=bucket-name,Prefix=prefix,SyncFormat=JsonSerDe,AWSKMSKeyARN=arn:aws:kms:region:AWS-account-ID:key/KMS-key-id,Region=bucket-region" --region region
  10. 执行以下命令查看同步配置的状态。

    aws ssm list-resource-data-sync

    如果您在其他区域中创建了同步配置,则必须指定 region 参数,如下例所示。

    aws ssm list-resource-data-sync --region us-west-1
  11. 在成功创建同步配置后,浏览 Amazon S3 中的目标存储桶。清单数据应在几分钟内显示。

在 Amazon Athena 中处理数据

以下部分介绍如何在 Amazon Athena 中查看和查询数据。

在 Amazon Athena 中查看和查询数据

  1. 在 Amazon Athena 控制台中,将以下语句复制并粘贴到查询编辑器中,然后选择 Run Query

    CREATE DATABASE ssminventory

    系统将创建一个名为 ssminventory 的数据库。

  2. 将以下语句复制并粘贴到查询编辑器中,然后选择 Run Query。使用 Amazon S3 目标的名称和前缀替换 Bucket-NameBucket-Prefix

    CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_Application ( `ResourceId` string, `Name` string, `ApplicationType` string, `Publisher` string, `Version` string, `InstalledTime` string, `Architecture` string, `URL` string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://Bucket-Name/Bucket-Prefix/AWS:Application/'

    系统将使用应用程序清单类型的分区信息创建一个表。

  3. 将以下语句复制并粘贴到查询编辑器中,然后选择 Run Query

    MSCK REPAIR TABLE ssminventory.AWS_Application

    系统将对表进行分区。

    注意

    如果您从其他 AWS 区域或账户创建资源数据同步,则必须再次运行该命令,以更新分区。您可能还需要更新您的 Amazon S3 存储桶策略。

  4. 要预览数据,请选择 AWS_Application 表旁边的视图图标。

     alt-text
  5. 将以下语句复制并粘贴到查询编辑器中,然后选择 Run Query

    SELECT a.name, a.version, count( a.version) frequency from aws_application a where a.name = 'aws-cfn-bootstrap' group by a.name, a.version order by frequency desc

    此查询返回不同版本的 aws-cfn-bootstrap 的计数,这是 Amazon EC2 Linux 和 Windows 实例上出现的 AWS 应用程序。

  6. 将以下语句分别复制并粘贴到查询编辑器中,将 Bucket-NameBucket-Prefix 替换为有关 Amazon S3 的信息,然后选择 Run Query。这些语句在 Athena 中设置其他清单表。

    CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_AWSComponent ( `ResourceId` string, `Name` string, `ApplicationType` string, `Publisher` string, `Version` string, `InstalledTime` string, `Architecture` string, `URL` string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://Bucket-Name/Bucket-Prefix/AWS:AWSComponent/' MSCK REPAIR TABLE ssminventory.AWS_AWSComponent
    CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_WindowsUpdate ( `ResourceId` string, `HotFixId` string, `Description` string, `InstalledTime` string, `InstalledBy` string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://Bucket-Name/Bucket-Prefix/AWS:WindowsUpdate/' MSCK REPAIR TABLE ssminventory.AWS_WindowsUpdate
    CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_InstanceInformation ( `AgentType` string, `AgentVersion` string, `ComputerName` string, `IamRole` string, `InstanceId` string, `IpAddress` string, `PlatformName` string, `PlatformType` string, `PlatformVersion` string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://Bucket-Name/Bucket-Prefix/AWS:InstanceInformation/' MSCK REPAIR TABLE ssminventory.AWS_InstanceInformation
    CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_Network ( `ResourceId` string, `Name` string, `SubnetMask` string, `Gateway` string, `DHCPServer` string, `DNSServer` string, `MacAddress` string, `IPV4` string, `IPV6` string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://Bucket-Name/Bucket-Prefix/AWS:Network/' MSCK REPAIR TABLE ssminventory.AWS_Network
    CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_PatchCompliance ( `ResourceId` string, `Title` string, `KBId` string, `Classification` string, `Severity` string, `State` string, `InstalledTime` string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://Bucket-Name/Bucket-Prefix/AWS:PatchCompliance/' MSCK REPAIR TABLE ssminventory.AWS_PatchCompliance
    CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_PatchSummary ( `ResourceId` string, `PatchGroup` string, `BaselineId` string, `SnapshotId` string, `OwnerInformation` string, `InstalledCount` int, `InstalledOtherCount` int, `NotApplicableCount` int, `MissingCount` int, `FailedCount` int, `OperationType` string, `OperationStartTime` string, `OperationEndTime` string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://Bucket-Name/Bucket-Prefix/AWS:PatchSummary/' MSCK REPAIR TABLE ssminventory.AWS_PatchSummary

在 Amazon QuickSight 中处理数据

以下部分提供概述,包含用于在 Amazon QuickSight 中构建可视化内容的链接。

在 Amazon QuickSight 中构建可视化内容

  1. 注册 Amazon QuickSight,然后登录 QuickSight 控制台。

  2. 从 AWS_Application 表和您创建的任何其他表创建数据集。有关更多信息,请参阅使用 Amazon Athena 数据创建数据集

  3. 联接表。例如,您可以联接 AWS_InstanceInformation 中的 instanceid 列,因为它与其他清单表中的 resourceid 列匹配。有关联接表的更多信息,请参阅联接表

  4. 构建可视化内容。有关更多信息,请参阅处理 Amazon QuickSight 视觉对象