---
# System prepended metadata

title: Untitled

---

使用 AWS Glue 对数据集执行 ETL
实验室概述和目标
大数据问题往往涉及大量异构数据源。作为数据分析师，您可能不知道某些数据源的架构。这是大数据五个 V（数量、多样性、速度、准确性和价值）的多样性方面。在本实验中，您将使用 AWS Glue 对数据集执行提取、转换和加载 (ETL)。您可以将 AWS Glue 定向到数据源，它可以根据发现的数据类型推断架构。然后，AWS Glue 构建一个数据目录，其中包含有关各种数据源的元数据。

AWS Glue 与 Amazon Athena 相似，因为您分析的实际数据保留在数据源中。主要区别在于您可以使用 AWS Glue 构建爬虫来发现架构，然后从数据集中提取数据。您还可以转换架构，然后将数据加载到 AWS Glue 数据库中。然后，您可以在 Athena 中使用 SQL 语句分析数据。

在本实验中，您将学习如何使用 AWS Glue 从 Amazon Simple Storage Service (Amazon S3) 导入数据集。然后，您将提取数据、转换其架构并将数据集加载到 AWS Glue 数据库中，以便稍后使用 Athena 进行分析。

完成本实验后，您将能够执行以下操作：

在 AWS 管理控制台中访问 AWS Glue 并创建爬虫。
使用爬网程序创建包含表和架构的 AWS Glue 数据库。
使用 Athena 查询 AWS Glue 数据库中的数据。
使用 AWS CloudFormation 模板创建和部署 AWS Glue 爬网程序。
查看用户的 AWS Identity and Access Management (IAM) 策略以运行 AWS Glue 爬虫并在 Athena 中查询 AWS Glue 数据库。
确认具有 IAM 策略的用户可以使用 AWS 命令行界面 (AWS CLI) 访问爬网程序创建的 AWS Glue 数据库。
确认用户可以在源数据更改时运行 AWS Glue 爬网程序。

设想
数据科学团队要求您创建一系列概念证明 (POC)，以使用 AWS 服务来满足大学的许多数据工程和数据分析需求。 Mary 是数据科学团队的成员之一，她看到了 Athena 可以做些什么来创建具有定义模式的表并且印象深刻。她问您是否可以自动推断列和数据类型。当她处理大量不同的数据时，定义模式会花费她很多时间。您想要开发一个 POC 以使用 AWS Glue，它专为与此类似的用例而设计。

为了开发 POC，Mary 建议您使用一个公开可用的数据集，即全球历史气候学网络每日 [GHCN-D] 数据集，其中包含来自地面站的每日天气摘要，可追溯到 1763 年。该数据集在S3 桶。

Mary 解释说，数据集中最常见的记录参数是每日温度、降雨量和降雪量。这些参数可用于评估干旱、洪水和极端天气的风险。本实验室中使用的数据定义可在 NOAA 全球历史气候学网络日报 (GHCN-D) 数据集页面上找到。

注：截至 2022 年 10 月，数据集已拆分为子数据集，by_year 和 by_station。在本实验中，您将使用 by_year，它可以在 s3://noaa-ghcn-pds/csv/by_year/ 找到。

当您启动实验室时，环境将包含下图中显示的资源。对于此实验室环境，原始数据源是存在于另一个 AWS 账户中的 S3 存储桶。
 
实验室环境是使用启动实验室时部署的 CloudFormation 模板创建的。生成的 CloudFormation 堆栈创建了两个名为 data-science-bucket 和 glue-1950-bucket 的 S3 存储桶、一个名为 Policy-For-Data-Scientists 的 IAM 策略和一个名为 gluelab 的 IAM 角色。

 提示：要查看构建此环境的 CloudFormation 模板，请导航至 CloudFormation 控制台。在导航窗格中，选择堆栈。

在本实验结束时，您将创建下图所示的附加架构。图表后的表格详细说明了体系结构及其与您将在本实验中完成的任务的关系。
 
 

访问AWS管理控制台 在这些说明的顶部，选择“开始实验”。 实验会话开始。 页面顶部显示一个计时器，显示会话剩余时间。 提示：要在任何时候刷新会话长度，请在计时器达到00:00之前再次选择“开始实验”。 在继续之前，请等待位于左上角AWS链接旁边的圆形图标变为绿色。 要连接到AWS管理控制台，请选择左上角的AWS链接。 会打开一个新的浏览器标签，并将您连接到控制台。 提示：如果没有打开新的浏览器标签，通常浏览器顶部会有一个横幅或图标，显示您的浏览器正在阻止网站打开弹出窗口的消息。选择横幅或图标，然后选择“允许弹出窗口”。 任务1：使用AWS Glue爬虫处理GHCN-D数据集 作为数据工程师或分析师，您可能并不总是了解要分析的数据的模式。AWS Glue就是为这种情况而设计的。您可以指示AWS Glue对存储在AWS上的数据进行分析，并且该服务将发现您的数据。然后，AWS Glue会将相关的元数据（例如表定义和模式）存储在AWS Glue数据目录中。要实现这一点，您需要创建一个爬虫，它会检查数据源并根据数据推断出模式。 在此任务中，您将使用一个公开可用的S3存储桶中的数据执行以下操作： 配置和创建一个AWS Glue爬虫。运行爬虫以提取、转换和加载数据到AWS Glue数据库。查看爬虫创建的表的元数据。编辑表的模式。首先，您需要配置和创建一个爬虫，以发现GHCN-D数据集的模式并从中提取数据。 配置和创建AWS Glue爬虫。 在AWS管理控制台中，在“服务”旁边的搜索框中搜索并选择AWS Glue以打开AWS Glue控制台。 在导航窗格中，选择“数据库”下的“表”。 选择“使用爬虫添加表”。 对于名称，输入Weather。 展开“标签（可选）”部分。 注意，这是您可以添加标签或额外安全配置的地方。保留默认设置。 在页面底部选择“下一步”。 选择“添加数据源”并配置以下内容： 数据源：选择S3。 S3数据的位置：选择在其他帐户中。 S3路径：输入以下公开可用数据集的S3存储桶位置：
```
s3://noaa-ghcn-pds/csv/by_year/
```
后续爬虫运行：选择“爬取所有子文件夹”。 选择“添加S3数据源”。 选择“下一步”。 对于现有的IAM角色，选择gluelab。 此角色已在实验环境中为您提供。有关参考，请参阅实验的CloudFormation模板。以下是此角色的YAML片段： 
```
GlueLab:
    Type: AWS::IAM::Role
    Properties:
      RoleName: "gluelab"
      Path: "/"
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - glue.amazonaws.com
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
```
选择“下一步”。 在“输出配置”部分，选择“添加数据库”。 会打开一个新的浏览器标签。 输入名称为weatherdata。 选择“创建数据库”。 返回到打开的浏览器标签，即AWS Glue控制台中的“设置输出和调度”页面。 对于目标数据库，请选择刚刚创建的weatherdata数据库。 提示：要刷新可用数据库列表，请选择下拉列表右侧的刷新图标。 在“爬虫调度”部分，对于频率，请保留默认的“按需”。 选择“下一步”。 确认您的爬虫配置与以下配置类似。  

选择“创建爬虫”。 为了执行ETL过程的提取和加载步骤，现在您将运行爬虫。 您可以创建AWS Glue爬虫，以按需或按计划运行。因为您创建的爬虫是按需运行的，所以您必须运行爬虫来构建数据库并生成元数据。 
运行爬虫。 在爬虫页面上，选择刚刚创建的Weather爬虫。 选择“运行”。 爬虫状态将变为“运行中”。 重要提示：在进行下一步之前，请等待状态变为“就绪”。这大约需要3分钟。 AWS Glue将创建一个表来存储有关GHCN-D数据集的元数据。接下来，您将检查AWS Glue捕获的有关数据源的数据。 查看AWS Glue创建的元数据。 在导航窗格中，选择“数据库”。 选择weatherdata数据库的链接。 在表部分，选择by_year链接。 查看weather爬虫捕获的元数据，如下图所示。模式列出了爬虫在导入的数据集中发现的列。  

现在，您将编辑数据库的模式，这是ETL过程中数据转换的一部分。 编辑模式。 从页面右上角的操作菜单中，选择“编辑模式”。 根据以下表格更改列名。 要更改列名，选择要修改的项目的复选框，然后选择“编辑”。 在打开的窗口中，更改“名称”的值，然后选择“编辑”。为每个列名重复这些步骤。 注意：AWS Glue仅支持小写列名。 
Previous Name	New Name
id	station
date	date
element	type
data_value	observation
m_flag	mflag
q_flag	qflag
s_flag	sflag
obs_time	time

选择“更新模式”。 现在，该表的模式如下图所示。  

 任务1总结在这个任务中，您使用控制台在AWS Glue中创建了一个爬虫。您将爬虫指向存储在S3存储桶中的数据，并且爬虫发现了这些数据。然后，爬虫将相关的元数据（表定义和模式）存储在数据目录中。通过使用AWS Glue中的爬虫，您可以检查数据源并推断其模式。 团队现在可以使用爬虫快速检查数据源，并减少从Amazon S3数据源创建数据库模式的手动步骤。您将这个POC的结果与Mary分享，她对新功能感到满意。接下来，她希望能够在AWS Glue数据目录中对数据进行更多分析。 任务2：使用Athena查询表 现在您已经创建了数据目录，可以使用元数据通过Athena进一步查询数据。 在这个任务中，您将完成以下步骤： 配置一个S3存储桶来存储Athena查询结果。在Athena中预览数据库表。为1950年后的数据创建一个表。对选定的数据运行查询。 配置一个S3存储桶来存储Athena查询结果。 在导航窗格中，选择“数据库”下的“表”。 选择by_year表的链接。 选择“操作” > “查看数据”。 当弹出窗口出现警告您将被带到Athena控制台时，选择“继续”。 Athena控制台打开。注意到错误消息指示没有提供输出位置。在Athena中运行查询之前，您需要指定一个S3存储桶来保存查询结果。 选择“设置”选项卡。 选择“管理”。 在“查询结果位置”右侧，选择“浏览S3”。 选择与以下类似的存储桶名称：data-science-bucket-XXXXXX 重要提示：不要选择包含glue-1950-bucket的存储桶名称。 选择“选择”。 保留其他选项的默认设置，选择“保存”。 在Athena中预览表。 选择“编辑器”选项卡。 在左侧的“数据”面板中，注意到数据源是AwsDataCatalog。 对于数据库，选择weatherdata。 在“表”部分，选择by_year表的省略号（三点）图标，然后选择“预览表”。 提示：要查看此表中的列名和其数据类型，请选择表名左侧的图标。 weatherdata表的前10条记录将显示，类似于以下屏幕截图：  

注意查询的运行时间和扫描的数据量。随着您开发更复杂的应用程序，最小化资源消耗以优化成本非常重要。您将在本任务的后面看到如何优化Athena查询的成本示例。 在下一步中，您将创建一个仅包含1950年以后数据的AWS Glue数据库表。为了优化使用Athena，您将使用Apache Parquet格式存储数据。Apache Parquet是一种开源的列式数据格式，经过优化以提供卓越的性能和存储效率。 创建一个1950年以后的数据表。 首先，您需要获取为您创建的用于存储这些数据的存储桶的名称。 在“服务”旁边的搜索框中搜索并选择S3。 在存储桶列表中，将包含glue-1950-bucket的存储桶名称复制到您选择的文本编辑器中。 返回到Athena查询编辑器。 将以下查询复制并粘贴到编辑器中的一个查询选项卡中。将<glue-1950-bucket>替换为您记录的存储桶名称： 
```
CREATE table weatherdata.late20th
WITH (
  format='PARQUET', external_location='s3://<glue-1950-bucket>/lab3'
) AS SELECT date, type, observation  FROM by_year
WHERE date/10000 between 1950 and 2015;
```
选择运行。 查询运行后，运行时和数据扫描值类似如下：
```
Time in queue: 128 ms
Run time: 1 min 8.324 sec
Data scanned: 98.44 GB
```
要预览结果，请在表部分中的第 20 个表的右侧，选择省略号图标，然后选择预览表。  结果类似于以下屏幕截图。
 

现在您已经隔离了您感兴趣的数据，您可以编写查询以进行进一步分析。  对新表运行查询。  首先，创建一个仅包含最大温度读数或 TMAX 值的视图。  在新的查询选项卡中运行以下查询：
```
CREATE VIEW TMAX AS
SELECT date, observation, type
FROM late20th
WHERE type = 'TMAX'
```
 要预览结果，请在视图部分的 tmax 视图右侧，选择省略号图标，然后选择预览视图。 结果类似于以下屏幕截图：
 
 在新的查询选项卡中运行以下查询。
```
SELECT date/10000 as Year, avg(observation)/10 as Max
FROM tmax
GROUP BY date/10000 ORDER BY date/10000;
```
此查询的目的是计算数据集中每年的平均最高温度。  查询运行后，运行时和数据扫描值类似如下：
```
Time in queue: 0.211 sec
Run time: 25.109 sec
Data scanned: 2.45 GB
```
结果显示了从 1950 年到 2015 年每年的平均最高温度。以下屏幕截图显示了一个示例：
 

请记住，使用Athena创建查询时，查询结果必须存储回Amazon S3。在之前的步骤中，您指定了存储查询结果的Amazon S3位置。 在使用AWS服务时，通常按使用量付费。然而，由于您将查询限制为从1950年到2015年的三列温度数据，您减少了存储成本。此外，由于您将查询数据以Apache Parquet的列式格式进行了排列，执行此任务中的查询所花费的时间减少了，因此在Athena中使用的计算资源也减少了，从而减少了成本。 您向Mary展示了如何通过使用AWS Glue与Athena相结合并仍然使用视图来加快她的处理过程。她感到非常高兴。 任务2总结在此任务中，您学习了如何使用Athena查询AWS Glue爬虫创建的数据库中的表。您创建了一个表，其中包含从原始数据集中1950年之后的所有数据。您使用了Apache Parquet格式来优化Athena查询，从而减少了完成每个查询所需的时间，减少了成本。在隔离这些数据之后，您创建了一个视图，计算了每年的平均最高温度。 AWS Glue与存储在Amazon S3中的原始数据集集成。AWS Glue可以创建爬虫将原始数据集摄入到数据库中，并推断出适当的模式。然后，您可以迅速转向Athena来开发查询并更好地理解数据。这种集成减少了从数据中获取洞察力并将这些洞察力应用于做出更好决策所需的时间。 任务3：为AWS Glue爬虫创建CloudFormation模板在任务1中，您使用控制台创建了一个AWS Glue爬虫，以检查数据源并推断模式。然而，团队在不同的AWS账户中使用许多数据集，包括开发、测试和生产环境。因此，如果可以在这些环境中重复使用爬虫，特别是在数据集中添加新数据时，将会很有帮助。还可以使用AWS CLI运行爬虫。 如果爬虫运行多次，例如按计划运行，它会查找数据存储中的新文件或更改的文件或表。爬虫的输出包括自上次运行以来找到的新表和分区。 在本任务中，您将学习如何使用CloudFormation创建和部署爬虫。 找到gluelab IAM角色的Amazon资源编号（ARN）。您需要此ARN来部署CloudFormation模板。 在“服务”旁边的搜索框中搜索并选择IAM以打开IAM控制台。 在导航窗格中，选择“角色”。 选择gluelab角 提示：如果需要，您可以搜索角色。 ARN显示在摘要部分的页面上。 将ARN复制到文本编辑器中，以便在下一步中使用。 导航到AWS Cloud9集成开发环境（IDE）。 在“服务”旁边的搜索框中搜索并选择Cloud9以打开AWS Cloud9控制台。 列出了AWS Cloud9环境。 对于名为Cloud9 Instance的环境，选择“打开IDE”。 将打开一个新的浏览器选项卡，显示AWS Cloud9 IDE。 创建一个新的CloudFormation模板。 在AWS Cloud9 IDE中，选择“文件”>“新建文件”。 将空文件保存为gluecrawler.cf.yml，但保持打开状态。 将以下代码复制并粘贴到文件中： 
```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:                                                                       # The name of the crawler to be created
 CFNCrawlerName:  
   Type: String
   Default: cfn-crawler-weather
 CFNDatabaseName:
   Type: String
   Default: cfn-database-weather
 CFNTablePrefixName:
   Type: String
   Default: cfn_sample_1-weather    
# Resources section defines metadata for the Data Catalog
Resources:
# Create a database to contain tables created by the crawler
 CFNDatabaseWeather:
   Type: AWS::Glue::Database
   Properties:
     CatalogId: !Ref AWS::AccountId
     DatabaseInput:
       Name: !Ref CFNDatabaseName
       Description: "AWS Glue container to hold metadata tables for the weather crawler"
#Create a crawler to crawl the weather data on a public S3 bucket
 CFNCrawlerWeather:
   Type: AWS::Glue::Crawler
   Properties:
     Name: !Ref CFNCrawlerName
     Role: <GLUELAB-ROLE-ARN>
     #Classifiers: none, use the default classifier
     Description: AWS Glue crawler to crawl weather data
     #Schedule: none, use default run-on-demand
     DatabaseName: !Ref CFNDatabaseName
     Targets:
       S3Targets:
         # Public S3 bucket with the weather data
         - Path: "s3://noaa-ghcn-pds/csv/by_year/"
     TablePrefix: !Ref CFNTablePrefixName
     SchemaChangePolicy:
       UpdateBehavior: "UPDATE_IN_DATABASE"
       DeleteBehavior: "LOG"
     Configuration: "{\"Version\":1.0,\"CrawlerOutput\":{\"Partitions\":{\"AddOrUpdateBehavior\":\"InheritFromTable\"},\"Tables\":{\"AddOrUpdateBehavior\":\"MergeNewColumns\"}}}"
```

注意：此代码块使用 AWS Glue 开发人员指南中适用于 AWS Glue 的 AWS CloudFormation 中适用于 Amazon S3 的 AWS Glue 爬虫的示例 AWS CloudFormation 模板。  在该文件中，将 <GLUELAB-ROLE-ARN> 替换为 gluelab IAM 角色的 ARN。查找以 Role 开头的行，即第 27 行左右。  保存对模板文件的更改。  检查代码以查看正在创建的内容。此 CloudFormation 模板执行以下操作：  为 AWS Glue 爬网程序设置自定义资源名称。 为 AWS Glue 数据库设置自定义资源名称。 为 AWS Glue 数据库中的第一个表设置自定义资源名称。 创建一个爬虫来爬取公共 S3 存储桶上的天气数据。 设置爬虫将用于创建关联的 AWS Glue 数据库的 IAM 角色 (gluelab)。这与您用于手动创建搜寻器的角色相同。请注意，此 IAM 角色是在实验室环境中为您创建的。该角色具有创建和运行搜寻器以及创建数据库所需的所有权限。 要验证 CloudFormation 模板，请在 AWS Cloud9 终端中运行以下命令：
```
aws cloudformation validate-template --template-body file://gluecrawler.cf.yml
```
 注意：如果您收到一条错误消息，指出 YAML 格式不正确，请检查 gluelab 角色名称的值。还要检查每行的制表符和间距。 YAML 文档需要精确的间距，如果间距不匹配，解析器将遇到错误。 如果模板通过验证，将显示以下输出：
```
{
    "Parameters": [
        {
            "ParameterKey": "CFNCrawlerName",
            "DefaultValue": "cfn-crawler-weather",
            "NoEcho": false
        },
        {
            "ParameterKey": "CFNTablePrefixName",
            "DefaultValue": "cfn_sample_1-weather",
            "NoEcho": false
        },
        {
            "ParameterKey": "CFNDatabaseName",
            "DefaultValue": "cfn-database-weather",
            "NoEcho": false
        }
    ]
}
```
重要提示：在验证模板之前不要进入下一步。  现在您将使用该模板创建 CloudFormation 堆栈。堆栈实现和管理模板中概述的资源组。使用堆栈，您可以一起管理这些资源的状态和依赖关系。将 CloudFormation 模板视为蓝图。然后，堆栈是在 AWS 中注册并实际创建资源的模板的实际实例。  要创建 CloudFormation 堆栈，请运行以下命令：
```
aws cloudformation create-stack --stack-name gluecrawler --template-body file://gluecrawler.cf.yml --capabilities CAPABILITY_NAMED_IAM
```
注意：该命令包含具有 CAPABILITY_NAMED_IAM 功能的 --capabilities 参数。这是因为您正在使用影响权限的自定义名称创建以下资源：  名为 cfn-crawler-weather 的 AWS Glue 爬虫  一个名为 cfn-database-weather 的 AWS Glue 数据库  AWS Glue 数据库中名为 cfn_sample_1-weather 的表      如果堆栈经过验证，CloudFormation ARN 将显示在输出中，类似于以下内容：
```
{
"StackId": "arn:aws:cloudformation:us-east-1:338778555682:stack/gluecrawler/2d8cec90-5c42-11ec-8fbf-12034b0079a5"
}
```
CloudFormation create-stack 命令创建堆栈并部署它。如果验证通过并且没有任何事情导致堆栈创建回滚，请继续执行下一步。   提示：要检查堆栈创建的进度，请导航至 CloudFormation 控制台。在导航窗格中，选择堆栈。  要验证 AWS Glue 数据库是否已在堆栈中创建，请运行以下命令：
```
aws glue get-databases
```
输出类似于以下内容：
```
{
    "DatabaseList": [
        {
            "Name": "cfn-database-weather",
            "Description": "AWS Glue container to hold metadata tables for the weather crawler",
            "Parameters": {},
            "CreateTime": 1649267047.0,
            "CreateTableDefaultPermissions": [
                {
                    "Principal": {
                        "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
                    },
                    "Permissions": [
                        "ALL"
                    ]
                }
            ],
            "CatalogId": "034140262343"
        },
        {
            "Name": "weatherdata",
            "CreateTime": 1649263434.0,
            "CreateTableDefaultPermissions": [
                {
                    "Principal": {
                        "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
                    },
                    "Permissions": [
                        "ALL"
                    ]
                }
            ],
            "CatalogId": "034140262343"
        }
    ]
}
```
 验证爬虫是否已在堆栈中创建。 要验证爬虫是否已创建，请运行以下命令：
```
aws glue list-crawlers
```
 输出类似于以下内容：
```
{
    "CrawlerNames": [
        "Weather",
        "cfn-crawler-weather"
    ]
}
```
要检索爬虫的详细信息，请运行以下命令。
```
aws glue get-crawler --name cfn-crawler-weather
```
输出类似于以下内容：
```
{
    "Crawler": {
       "Name": "cfn-crawler-weather",
        "Role": "WeatherCrawler-001-CFNRoleWeather-17WB9OM5H5MFL",
        "Targets": {
            "S3Targets": [
                {
                    "Path": "s3://noaa-ghcn-pds/csv/by_year/",
                    "Exclusions": []
                }
            ],
            "JdbcTargets": [],
            "MongoDBTargets": [],
            "DynamoDBTargets": [],
            "CatalogTargets": [],
            "DeltaTargets": []
        },
        "DatabaseName": "cfn-database-weather",
        "Description": "AWS Glue crawler to crawl weather data",
        "Classifiers": [],
        "RecrawlPolicy": {
            "RecrawlBehavior": "CRAWL_EVERYTHING"
        },
        "SchemaChangePolicy": {
            "UpdateBehavior": "UPDATE_IN_DATABASE",
            "DeleteBehavior": "LOG"
        },
        "LineageConfiguration": {
            "CrawlerLineageSettings": "DISABLE"
        },
        "State": "READY",
        "TablePrefix": "cfn_sample_1-weather",
        "CrawlElapsedTime": 0,
        "CreationTime": 1649083535.0,
        "LastUpdated": 1649083535.0,
        "Version": 1,
        "Configuration": "{\"Version\":1.0,\"CrawlerOutput\":{\"Partitions\":{\"AddOrUpdateBehavior\":\"InheritFromTable\"},\"Tables\":{\"AddOrUpdateBehavior\":\"MergeNewColumns\"}}}",
        "LakeFormationConfiguration": {
            "UseLakeFormationCredentials": false,
            "AccountId": ""
        }
    }
}
```
请注意，爬虫的状态为READY。这意味着爬虫已经部署，但尚未运行。在实验后面，您将使用Mary的IAM用户来运行爬虫。 任务3总结在这个任务中，您学习了如何将AWS Glue爬虫集成到CloudFormation模板中。您还学习了如何在AWS Cloud9终端中使用AWS CLI来验证和部署模板，以创建爬虫。通过模板，您可以在其他AWS账户中重复使用爬虫。然后，您学习了如何确认爬虫构建的资源（AWS Glue数据库及其关联表）。 许多公司在AWS中使用多个账户来维护独立的开发、测试和生产环境。隔离这些环境有助于确保团队遵循最佳实践。在开发账户中构建爬虫，然后在包含生产数据的受控账户中进行测试，可以确保爬虫按照预期设计，并提取、转换和加载特定业务任务所需的数据。在验证了爬虫之后，您可以使用CloudFormation和DevOps最佳实践快速将其部署到生产环境，以便适当的业务利益相关者可以重复使用爬虫，而无需从头开始构建。 任务4：审查Athena和AWS Glue访问的IAM策略现在您已经使用CloudFormation创建了爬虫，请审查爬虫的IAM策略，以确保其他人可以在生产环境中使用它。 注意：爬虫的IAM策略已经为您创建好；您没有在实验环境中创建IAM策略的权限。 在IAM中审查Policy-For-Data-Scientists策略。 在“服务”旁边的搜索框中搜索并选择IAM以打开IAM控制台。 在导航窗格中，选择“用户”。 注意到mary是列出的IAM用户之一。该用户是DataScienceGroup IAM组的一部分。 选择DataScienceGroup IAM组的链接。 在DataScienceGroup详情页上，选择“权限”选项卡。 在附加到该组的策略列表中，选择Policy-For-Data-Scientists策略的链接。 Policy-For-Data-Scientists详情页面打开。审查与此策略相关的权限。请注意，这些权限仅提供对Athena、AWS Glue和Amazon S3服务的有限访问。 提示：要更详细地查看IAM策略的详细信息，请选择{} JSON。在JSON策略文件中，您可以看到允许和拒绝的操作，包括用户可以在哪些资源上执行操作。 任务4总结在这个任务中，您审查了DataScienceGroup的IAM策略。该策略包含了对AmazonS3、AWS Glue和Athena的有限访问权限。该策略可以作为一个示例策略，供希望重复使用运维团队构建的爬虫的用户参考。与AWS中的所有服务一样，IAM用户必须应用适当的权限才能执行操作。 任务5：确认Mary可以访问和使用AWS Glue爬虫 现在您已经审查了IAM策略，将使用它来测试另一个用户对AWS Glue爬虫的访问权限。您还将测试该用户是否能够使用爬虫将存储在Amazon S3中的数据集提取、转换和加载到AWS Glue数据库中。 检索mary IAM用户的凭证，并将其存储为bash变量。 在“服务”旁边的搜索框中搜索并选择CloudFormation。 在导航窗格中，选择“堆栈”。 选择创建实验环境的堆栈的链接。堆栈名称包含一串随机的字母和数字，并且该堆栈的创建时间应该是最早的。 在堆栈详情页上，选择“输出”选项卡。 注意：当您创建CloudFormation模板时，可以选择输出模板将创建的资源的信息。创建实验环境的CloudFormation模板输出了mary用户的访问密钥和秘密访问密钥。 将MarysAccessKey的值复制到剪贴板。 返回到AWS Cloud9终端。 运行以下命令为访问密钥创建变量。将<ACCESS-KEY>替换为剪贴板中的值。
```
AK=<ACCESS-KEY>
```
 返回 CloudFormation 控制台，将 MarysSecretAccessKey 的值复制到剪贴板。 返回 AWS Cloud9 终端。 要为秘密访问密钥创建变量，请运行以下命令。将 <SECRET-ACCESS-KEY> 替换为剪贴板中的值。
```
SAK=<SECRET-ACCESS-KEY>
```
要测试 mary 用户是否可以执行特定命令，您可以将用户凭据作为 bash 变量（AK 和 SAK）与命令一起传递。然后，API 将尝试以指定用户的身份执行该命令。  测试 Mary 对 AWS Glue 爬网程序的访问。  测试mary用户是否可以执行list-crawlers命令，运行以下命令：
AWS_ACCESS_KEY_ID=$AK AWS_SECRET_ACCESS_KEY=$SAK aws glue list-crawlers
 输出类似于以下内容，看起来像您之前运行命令后显示的输出：
```
{
    "CrawlerNames": [
        "Weather",
        "cfn-crawler-weather"
    ]
}
```
 测试mary用户是否可以执行get-crawler命令，执行如下命令： 
AWS_ACCESS_KEY_ID=$AK AWS_SECRET_ACCESS_KEY=$SAK aws glue get-crawler --name cfn-crawler-weather

输出类似于以下内容，看起来像您之前运行命令后显示的输出。注意爬虫的状态是READY，但是没有显示任何状态信息。这是因为爬虫还没有运行。
```
{
    "Crawler": {
        "Name": "cfn-crawler-weather",
        "Role": "gluelab",
        "Targets": {
            "S3Targets": [
                {
                    "Path": "s3://noaa-ghcn-pds/csv/by_year/",
                    "Exclusions": []
                }
            ],
            "JdbcTargets": [],
            "MongoDBTargets": [],
            "DynamoDBTargets": [],
            "CatalogTargets": [],
            "DeltaTargets": []
        },
        "DatabaseName": "cfn-database-weather",
        "Description": "AWS Glue crawler to crawl weather data",
        "Classifiers": [],
        "RecrawlPolicy": {
            "RecrawlBehavior": "CRAWL_EVERYTHING"
        },
        "SchemaChangePolicy": {
            "UpdateBehavior": "UPDATE_IN_DATABASE",
            "DeleteBehavior": "LOG"
        },
        "LineageConfiguration": {
            "CrawlerLineageSettings": "DISABLE"
        },
        "State": "READY",
        "TablePrefix": "cfn_sample_1-weather",
        "CrawlElapsedTime": 0,
        "CreationTime": 1649267047.0,
        "LastUpdated": 1649267047.0,
        "Version": 1,
        "Configuration": "{\"Version\":1.0,\"CrawlerOutput\":{\"Partitions\":{\"AddOrUpdateBehavior\":\"InheritFromTable\"},\"Tables\":{\"AddOrUpdateBehavior\":\"MergeNewColumns\"}}}",
        "LakeFormationConfiguration": {
            "UseLakeFormationCredentials": false,
            "AccountId": ""
        }
    }
}
```
测试 mary 用户是否可以运行爬虫。  运行以下命令。
```
AWS_ACCESS_KEY_ID=$AK AWS_SECRET_ACCESS_KEY=$SAK aws glue start-crawler --name cfn-crawler-weather
```
 如果爬虫成功运行，终端不会显示任何输出。 要观察正在运行的爬网程序并将数据添加到表中，请导航到 AWS Glue 控制台。 在导航窗格中，选择爬网程序。 在这里您可以看到爬虫的状态信息，如以下屏幕截图所示。
 
当状态变为Ready时，爬虫运行完毕。这可能需要几分钟时间。  返回 AWS Cloud9 终端。  要确认爬虫已完成运行，请运行以下命令。
```
AWS_ACCESS_KEY_ID=$AK AWS_SECRET_ACCESS_KEY=$SAK aws glue get-crawler --name cfn-crawler-weather
```
The output is similar to the following:
```
{
    "Crawler": {
        "Name": "cfn-crawler-weather",
        "Role": "gluelab",
        "Targets": {
            "S3Targets": [
                {
                    "Path": "s3://noaa-ghcn-pds/csv/by_year/",
                    "Exclusions": []
                }
            ],
            "JdbcTargets": [],
            "MongoDBTargets": [],
            "DynamoDBTargets": [],
            "CatalogTargets": [],
            "DeltaTargets": []
        },
        "DatabaseName": "cfn-database-weather",
        "Description": "AWS Glue crawler to crawl weather data",
        "Classifiers": [],
        "RecrawlPolicy": {
            "RecrawlBehavior": "CRAWL_EVERYTHING"
        },
        "SchemaChangePolicy": {
            "UpdateBehavior": "UPDATE_IN_DATABASE",
            "DeleteBehavior": "LOG"
        },
        "LineageConfiguration": {
            "CrawlerLineageSettings": "DISABLE"
        },
        "State": "READY",
        "TablePrefix": "cfn_sample_1-weather",
        "CrawlElapsedTime": 0,
        "CreationTime": 1649267047.0,
        "LastUpdated": 1649267047.0,
        "LastCrawl": {
            "Status": "SUCCEEDED",
            "LogGroup": "/aws-glue/crawlers",
            "LogStream": "cfn-crawler-weather",
            "MessagePrefix": "5ef3cff5-ce6c-45d5-8359-e223a4227570",
            "StartTime": 1649267649.0
        },
        "Version": 1,
        "Configuration": "{\"Version\":1.0,\"CrawlerOutput\":{\"Partitions\":{\"AddOrUpdateBehavior\":\"InheritFromTable\"},\"Tables\":{\"AddOrUpdateBehavior\":\"MergeNewColumns\"}}}",
        "LakeFormationConfiguration": {
            "UseLakeFormationCredentials": false,
            "AccountId": ""
        }
    }
}
```
请注意，"LastCrawl"部分被包含在内，该部分的状态为"SUCCEEDED"。这意味着Mary成功运行了爬虫。 任务5总结这个结果确认了Mary对您使用CloudFormation创建和部署的AWS Glue爬虫具有访问权限。这是因为IAM策略中的权限允许她列出、获取和检索爬虫的元数据。与策略相关的其他权限包括： 对于AWS Glue：列出、读取和标记资源。运行使用CloudFormation部署的爬虫，但不能创建、删除资源或进行管理。对于Athena：列出、读取和标记资源，但不能创建或删除特定资源。（例如，此策略不提供创建或删除命名查询或数据目录的权限，但您的用户具有执行这些操作的权限。）对于Amazon S3：访问存储桶，列出存储桶内容和读取对象，但不能创建存储桶，并限制对特定存储桶的访问，例如我们为您创建的DataScienceBucket。恭喜！您已经学会了如何手动创建AWS Glue爬虫，以及如何使用CloudFormation将其部署给具有安全IAM策略的用户。由于爬虫位于CloudFormation模板中，您可以重复使用模板，在任何AWS账户中创建和部署爬虫，并根据需要更改参数。 团队的更新团队对您使用Athena、AWS Glue和CloudFormation所学习和展示的内容感到满意。现在您已经分享了您所学到的知识，团队将能够简化他们的工作负载，并以符合最佳实践的方式使用AWS。 提交您的工作要记录您的进度，请选择这些说明顶部的"提交"。 在提示时，选择"Yes"。 几分钟后，评分面板将显示您在每个任务中获得的分数。如果几分钟后结果没有显示出来，请选择这些说明顶部的"成绩"。 提示：您可以多次提交您的工作。在更改您的工作后，再次选择"提交"。您最后一次提交的内容将记录为此实验的成绩。 要查找关于您的工作的详细反馈，请选择"提交报告"。 实验完成恭喜！您已经完成了实验。 在本页面的顶部，选择"结束实验"，然后选择"Yes"以确认结束实验。 一个消息面板将显示实验正在终止。 要关闭面板，请选择右上角的"关闭"。 其他资源有关本实验涵盖的服务和概念的更多信息，请参阅以下资源： 入门AWS Glue 调度AWS Glue爬虫 Apache Parquet 爬虫的工作原理在CloudFormation中创建堆栈请求 © 2022 

