使用 Amazon EC2 Systems Manager 创建自定义 AMI 并将更新推送至正在运行的 Amazon EMR 集群

阅读数:7 2019 年 12 月 16 日 15:50

使用 Amazon EC2 Systems Manager 创建自定义 AMI 并将更新推送至正在运行的 Amazon EMR 集群

使用
Amazon EMR ,您可以完全控制集群,并且可以灵活地自定义集群并轻松安装其他应用程序。 EMR 客户经常使用
引导操作(bootstrap actions)来在群集中安装和配置自定义软件。但是,引导操作仅在群集或节点启动期间运行。这使您很难在集群已运行之后进行配置更改。Amazon EMR 也可以使用自定义的 Amazon Machine Image(AMI)来启动集群。
通过自定义 Amazon Linux AMI 启动集群,现在让 EMR 集群管理变得更加容易。 但是,随着环境中 AMI 的数量开始增加,创建和管理自定义 AMI 的任务会变得越来越困难。Amazon EC2
Systems Manager 可帮助您自动化各种管理任务,例如自动化 AMI 创建或跨数百个实例运行命令或脚本。 在本文中,我将展示如何使用 Systems Manager
Automation 来自动创建用于 EMR 的自定义 Amazon Linux AMI 和为 AMI 打补丁。使用 Systems Manager
Run Command ,您可以远程管理 Amazon EC2 实例或本地计算机的配置。 Run Command 可用于帮助您在 EMR 群集节点上执行以下类型的任务:安装应用程序,重新启动守护程序(HDFS,YARN,Presto 等),并进行配置更改。 我还将展示如何使用 Run Command 将命令发送到正在运行的 EMR 群集的所有节点。

使用自定义AMI的好处

尽管您可以使用引导操作轻松地自定义 EMR 群集,但是使用自定义 AMI 可能会有好处。

    • 缩短集群启动时间

在某些情况下,引导操作可能会影响您的群集启动时间。 例如,您的引导操作可能是在做一些事情,例如通过 Internet 下载大型程序并延迟群集准备就绪的时间。 通过直接在 AMI 中添加和安装程序,可以减少完成集群启动的时间。

    • 防止由于意外引起的引导操作失败

在某些情况下,直接在 AMI 中安装和配置自定义软件可以降低意外失败的风险。 例如,您的引导操作用于下载程序的镜像或存储库可能处于脱机状态或无法访问。 这可能会导致引导操作失败,从而可能导致集群启动失败。

    • 支持Amazon EBS根卷加密

EMR安全配置提供了许多安全和加密功能。 这包括为 HDFS(本地卷 / Amazon EBS)和 Amazon S3 加密静态数据的功能。 但是,某些法规 / 合规性策略可能要求对根(引导)卷也进行加密。 通过使用您自己的 Amazon Linux AMI,您可以创建使用加密的 EBS 根卷的 AMI,并将这些 AMI 用于您的 EMR 集群。

使用您自定义 ****AMI 的要求

用于 EMR 的自定义 AMI 必须满足以下要求:

      • 必须是 Amazon Linux AMI
        • 必须是 HVM AMI
        • 必须是 EBS 支持的AMI
        • 不得有多个 EBS 卷
        • 必须是 64 位 AMI
        • 不得具有与应用程序同名的用户(例如:hadoop,hdfs,yarn 或 spark)

这个 AMI 不一定属于您自己,但是您的 _service role_ 必须具有启动该 AMI 的权限。 因此,AMI 应该是以下之一:

      • 由您拥有
        • 公共 AMI
        • 由其所有者与您共享

有关 EMR 定制 AMI 的最佳实践和注意事项,请参阅使用定制 AMI。

演练

通过本文中的示例,我将向您展示如何实现以下方案:

      • 使用预安装的软件自动执行创建自定义 AMI 的工作流程
        • 在运行中的 EMR 群集的所有节点上运行命令或更改应用程序配置

开始之前

在本文中,将使用 AWS CLI 来执行所示的示例和步骤。 但是, AWS CLI 不是必须要安装的,也可以使用 AWS 管理控制台执行相同的任务。

本文示例所使用的区域是 us-east-1(N. Virginia)。

使用Systems Manager Automation构建自定义 ****AMI

在本节中,我将展示如何使用 System Manager Automation 来创建自定义 AMI。 下图概述了自动化将执行的操作:

使用 Amazon EC2 Systems Manager 创建自定义 AMI 并将更新推送至正在运行的 Amazon EMR 集群

1)为Automation 配置角色

在开始之前,您必须为 Automation 配置 IAM 实例配置文件角色(instance profile role)和服务角色(service role)。 实例配置文件角色授予 Automation 对您的实例执行操作的权限,例如执行命令或启动和停止服务。 服务角色(或 assume 角色)授予 Automation 代表您执行操作的权限。

配置 Automation 所需的 IAM 角色通常是设置 Automation 最困难的部分之一。 幸运的是,您只需要配置一次。 我们还有一个 AWS CloudFormation 模板,可用于创建和配置 Automation 所需的角色。 有关更多信息,请参阅方法 1:使用 AWS CloudFormation 配置 Automation 角色

要手动为 Automation 配置角色,请参阅使用 IAM 配置自动化角色

2**)创建一个自定义的Automation文档 **

Automation文档定义了 Systems Manager 执行的操作。在此步骤中,您将创建一个执行以下步骤的自定义 Automation 文档(customEmrAmiDocument):

      • 从基础的 Amazon Linux AMI 启动一个 EC2 实例
        • 更新实例上已安装的软件
        • 运行其他 Linux 命令(可选)
        • 关闭实例
        • 创建实例的 AMI
        • 终止实例

创建自定义 Automation 文档,请首先将 customEmrAmiDocument.json 文档下载到本地计算机。 然后,您可以使用控制台,AWS CLI 或 AWS 开发工具包在您的账户中创建(上传)该 Automation 文档。 以下示例显示了如何使用 AWS CLI 创建名为“ customEmrAmiDocument”的自动化文档:

$ aws ssm create-document –name “customEmrAmiDocument” –content file:///<PATH_TO>/customEmrAmiDocument.json –document-type Automation –region us-east-1

注意:创建 Automation 文档后,该文档不会被执行。 您可以在下一步中执行此文档。 还要注意,必须引用 file://,后跟内容文件的路径。

有关更多信息,请参见创建 Automation 文档

3**)执行自定义Automation文档 **

在上一步中创建的“ customEmrAmiDocument”自动化文档具有参数列表(SourceAmiId,InstanceIamRole 等),以及每个参数的描述。 要查看文档参数,请运行以下命令:

$ aws ssm describe-document –name customEmrAmiDocument –query “Document.Parameters” –region us-east-1

前面的命令返回类似于以下内容的输出:

[

{

“Type”: “String”,

“Description”: “(Required) The source Amazon Machine Image ID.”,

“Name”: “SourceAmiId”

},

{

“Type”: “String”,

“Description”: “(Required) The name of the role that enables Systems Manager (SSM) to manage the instance.”,

“DefaultValue”: “ManagedInstanceProfile”,

“Name”: “InstanceIamRole”

},

启动 Automation 执行时,必须传递所需的参数(SourceAmiId)以及要覆盖其默认值的所有其他参数。如果使用 CloudFormation 创建所需的 IAM 角色,则无需指定 InstanceRole 和 AutomationAssumeRole 参数。

要执行文档而不包括 InstanceRole 和 AutomationAssumeRole 参数,请运行以下命令:

aws ssm start-automation-execution –document-name “customEmrAmiDocument” –parameters “SourceAmiId=<AMI_ID>, CustomCommands=[<List_of_linux_commands_to_run>]” –region us-east-1

如果您的角色名称或 ARN 的值不是默认值,请确保相应地指定这些参数。 例如,如果您的实例配置文件 / 角色称为“ MyManagedInstanceProfile”,而 Automation 服务角色 ARN 为“ arn:aws:iam::012345678910:role/MyAutomationServiceRole”,则用于执行 Automation 的参数应类似于以下内容:

–parameters “SourceAmiId=<AMI_ID>, InstanceIamRole=MyManagedInstanceProfile, AutomationAssumeRole=arn:aws:iam::<ACCOUNT_ID>:role/MyAutomationServiceRole, InstanceType=<Instance_Type>, CustomCommands=[<List_of_linux_commands_to_run>]”

使用以下命令,启动 Automation 执行创建自定义 Amazon Linux AMI。该 AMI 会安装 Python 3.5 和 boto3:

aws ssm start-automation-execution –document-name “customEmrAmiDocument” –parameters “SourceAmiId=ami-4fffc834, InstanceIamRole=<INSTANCE_PROFILE_NAME>, AutomationAssumeRole=arn:aws:iam:: <ACCOUNT_ID>:role/<AUTOMATION_SERVICE_ROLE_NAME>, InstanceType=m3.large, CustomCommands=[yum -y install python35-devel python35-pip, /usr/bin/python35 -m pip install boto3]” –region us-east-1

这里,我把 SourceAmiId 参数指定了“ ami-4fffc834”,并无其他含义,只因为它是该文章发布时 us-east-1(N. Virginia)地区中最新的 Amazon Linux AMI。 它还具有 EMR 定制 AMI 所需的所有要求。 如果要在其他区域中运行 Automation 文档,请将 SourceAmiId 参数设置为在该特定区域中可用的 AMI(例如:us-west-2 为“ ami-aa5ebdd2”)。

4**)查找有关Automation执行的详细信息 **

Automation 执行完成后,除了每个步骤的状态及其输出之外,您还可以查看已执行的步骤。 可以运行以下命令,查看使用“ customEmrAmiDocument”文档的所有 Automation 执行情况:

$ aws ssm describe-automation-executions –query ‘AutomationExecutionMetadataList[?DocumentName==customEmrAmiDocument]’ –region us-east-1

要收集指定 Automation 执行的详细信息,请将前面命令中返回的 AutomationExecutionId 参数值,填入下面命令中:

$ aws ssm get-automation-execution –region us-east-1 –automation-execution-id

上述命令的输出,包含该 Automation 所执行过程的每个步骤的详细信息。 运行以下命令,可以轻松查找在自动化 createImage 步骤中创建的 AMI 的 AMI ID / imageID:

$ aws ssm get-automation-execution –region us-east-1 –automation-execution-id –query ‘AutomationExecution.StepExecutions[?StepName== createImage]’

如果 Automation 执行失败,则可能需要手动停止实例或禁用在 Automation 执行过程中启动的服务。 有关更多信息,请参见 Automation CLI 演练和《 Systems Manager 自动化疑难解答》

5**)使用自定义AMI启动EMR集群 **

完成上述步骤后,您现在就有了可用于 EMR 的自定义 Amazon Linux AMI。 有关更多信息,请参阅使用自定义 AMI

可以使用以下命令通过 AWS CLI 启动 EMR 集群:

$ aws emr create-cluster –name “Cluster with My Custom AMI” –custom-ami-id <custom_AMI_ID> –ebs-root-volume-size 20 –release-label emr-5.8.0 –use-default-roles –instance-count 2 –instance-type m3.xlarge –ec2-attributes

有关如何查找由 Automation 创建的自定义 AMI 的 AMI ID 的信息,请参阅步骤 4。

Run CommandEMR结合使用

在本节中,我将说明如何使用“Run Command”将命令发送到正在运行的 EMR 群集的节点。下图概述了“Run Command”执行过程:

使用 Amazon EC2 Systems Manager 创建自定义 AMI 并将更新推送至正在运行的 Amazon EMR 集群

1**)为Systems Manager配置实例IAM角色 **

EC2 实例(EMR 群集节点)需要 IAM 角色才能与 Systems Manager API 通信。 因为 EMR 已经为每个群集节点分配了 IAM 角色(通常称为 EMR_EC2_DefaultRole),所以您可以将附加的托管策略(系统管理器策略)附加到该角色。

以下命令将“ AmazonEC2RoleforSSM”托管策略附加到 EMR_EC2_DefaultRole 角色:

$ aws iam attach-role-policy –policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM –role-name EMR_EC2_DefaultRole

如果您没有使用默认的 EC2 角色,则将 role-name 参数值替换为您用于该角色的角色名称。

有关为 Systems Manager 配置 IAM 角色和策略的详细信息,请参阅为 Systems Manager 配置安全角色

2**)安装SSM代理 **

如果您的自定义 AMI 是由 Automation 创建的,请跳过此步骤。 默认情况下,用于创建定制 AMI 的 customEmrAmiDocument Automation 文档将安装 SSM 代理。

Systems Manager(SSM)代理用于处理 System Manager 请求,并按照请求中的指定内容,配置您的实例。 有关更多信息,请参阅在 Linux 上安装 SSM 代理

3**)使用Run Command运行命令 **

现在,您应该能够在运行了 SSM 代理并且配置了 SSM 的 IAM 角色的实例上运行命令或 Linux 脚本(本节中的步骤 1)。 要查看准备接收命令的实例列表,请运行以下命令:

$ aws ssm describe-instance-information –output json –query “InstanceInformationList[*]” –region us-east-1

向所有群集节点发送命令的最简单方法是使用资源标签作为 Run Command 的目标。 如果在启动过程中未将任何标签添加到 EMR 群集,则可以使用以下命令添加标签:

$ aws emr add-tags –resource-id <EMR_CLUSTER_ID> –tags environment=”emr-ssm” –region us-east-1

前面的命令将标签添加到 EMR 群集。 标签的键是“environment”,值是“ emr-ssm”。 您现在可以使用标签作为目标发送命令:

$ aws ssm send-command –document-name “AWS-RunShellScript” –targets ‘{“Key”:”tag:environment”,”Values”:[“emr-ssm”]}’ –parameters ‘{“commands”:[“hostname -f”,”python3 -V”]}’ –timeout-seconds 60 –region us-east-1

前面的命令将发送(executed)到具有以下标记的所有 EC2 实例:environment =“ emr-ssm”。

4**)查看Run Command执行的详细信息 **

对于在上一步中执行的运行命令(send-command),Run Command 执行的命令是,显示实例的主机名(hostname -f)及其 Python 3 版本(python3 -V)。

执行 Run Command(send-command)后,它应在输出中返回“ CommandID”字段。 您可以使用该命令 ID 来收集有关命令发送到的实例的信息,并查看命令执行的状态:

$ aws ssm list-command-invocations –command-id <command_id> –region us-east-1

您还可以查看在特定 EC2 实例中由 Run Command 执行的命令的输出(在我们的示例中为’hostname -f’和’python3 -V’):

$ aws ssm get-command-invocation –command-id <command_id> –instance-id <instance_id> –query “StandardOutputContent” –region us-east-1

前面的命令返回类似于以下内容的内容:

“ip-xxxxxxxxxx\nPython 3.5.1\n”

有关使用 Run Command 运行命令和 Shell 脚本的更多信息,请参见 Systems Manager 运行命令

结论

这篇文章向您展示了为 Amazon EMR 使用自定义 AMI 的一些好处,以及如何使用 Automation 来自动化的管理和创建自定义 AMI。 我还展示了如何使用 Run Command 来发送命令并在运行的 EMR 集群的所有节点上进行配置更改。

如果您有任何疑问或建议,请在下面评论。


附加阅读

了解如何在 Amazon EMR 上运行 Jupyter Notebook 和 JupyterHub

使用 Amazon EC2 Systems Manager 创建自定义 AMI 并将更新推送至正在运行的 Amazon EMR 集群


作者介绍:

使用 Amazon EC2 Systems Manager 创建自定义 AMI 并将更新推送至正在运行的 Amazon EMR 集群Bruno Faria 是 AWS 的 EMR 解决方案架构师。 他与我们的客户合作,为他们在 Amazon EMR 上运行复杂应用程序提供架构方面的指导。在业余时间,他喜欢与家人共度时光和学习新的大数据解决方案。

本文转载自 AWS 技术博客。

原文链接: https://amazonaws-china.com/cn/blogs/china/create-custom-amis-and-push-updates-to-a-running-amazon-emr-cluster-using-amazon-ec2-systems-manager/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布