从 AWS Step Functions 同步运行 AWS Systems Manager Automation 任务 - AWS Prescriptive Guidance

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

从 AWS Step Functions 同步运行 AWS Systems Manager Automation 任务

创建者:Elie El khoury(AWS)

代码存储库:amazon-stepfunctions-ssm-waitfortasktoken

环境:生产

技术:无服务器;; DevOps终端用户计算;运营

AWS 服务:AWS Step Functions;AWS Systems Manager

Summary

此模式说明了如何 AWS Step Functions 与集成 AWS Systems Manager。它使用 AWS SDK 服务集成,使用状态机工作流程中的任务令牌调用 Systems Manager startAutomationExecutionAPI,然后暂停直到调用成功或失败时令牌返回。为了演示集成,此模式在或文档周围实现了一个自动化文档 (runbook) 包装器,并使用它.waitForTaskToken来同步调用AWS-RunShellScriptAWS-RunPowerShellScriptAWS-RunShellScript AWS-RunPowerShellScript有关 Step Functions 中软件开发 AWS 工具包服务集成的更多信息,请参阅AWS Step Functions 开发者指南

Step Function s 是一项低代码的可视化工作流服务,您可以使用它来构建分布式应用程序、自动执行 IT 和业务流程,以及使用 AWS 服务构建数据和机器学习管道。工作流程可以管理故障、重试、并行化、服务集成和可观测性,因此您可以专注于更高价值的业务逻辑。

自动化是一项功能,可简化亚马逊弹性计算云 (Amazon EC2)、亚马逊关系数据库服务 (Amazon RDS)、Amazon Redshift和亚马逊简单存储服务 (Amazon S3) Simple Storage S3 AWS 服务 等的常见维护、部署和补救任务。 AWS Systems Manager自动化使您可以精确控制自动化的并发性。例如,您可以指定同时定位多少资源,以及在停止自动化之前可能发生的错误数。

有关实施的详细信息,包括运行手册步骤、参数和示例,请参阅其他信息部分。

先决条件和限制

先决条件

  • 一个活跃的 AWS 账户

  • AWS Identity and Access Management (IAM) 访问 Step Functions 和 Systems Manager 的权限

  • 在实例上安装了 Systems Manager 代理(SSM 代理)的 EC2 实例

  • Systems Manager 的 IAM 实例配置文件附加到您计划运行运行手册的实例上

  • 具有以下 IAM 权限(遵循最低权限原则)的 Step Functions 角色:

{ "Effect": "Allow", "Action": "ssm:StartAutomationExecution", "Resource": "*" }

产品版本

  • SSM 文档架构版本 0.3 或更高版本

  • SSM Agent 版本 2.3.672.0 或更高版本

架构

目标技术堆栈

  • AWS Step Functions

  • AWS Systems Manager  自动化

目标架构

从 AWS Step Functions 同步运行 Systems Manager Automation 任务的架构

自动化和扩缩

工具

AWS 服务

  • AWS CloudFormation帮助您设置 AWS 资源,快速一致地配置资源,并在资源的整个生命周期中跨地区对其 AWS 账户 进行管理。

  • AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。

  • AWS Step Functions是一项无服务器编排服务,可帮助您组合 AWS Lambda 功能和其他功能 AWS 服务 来构建关键业务应用程序。

  • AWS Systems Manager 可帮助您管理在 AWS Cloud中运行的应用程序和基础设施。它简化了应用程序和资源管理,缩短了检测和解决操作问题的时间,并帮助您大规模安全地管理 AWS 资源。

代码

此模式的代码可在 GitHub Step Functions 和 Systems Manager 实现存储库中找到。 

操作说明

任务描述所需技能

下载 CloudFormation 模板。

从 GitHub 存储库的cloudformation 文件夹下载ssm-automation-documents.cfn.json模板。

AWS DevOps

创建运行手册。

登录 AWS Management Console,打开AWS CloudFormation 控制台,然后部署模板。有关部署 CloudFormation 模板的更多信息,请参阅 CloudFormation 文档中的在AWS CloudFormation 控制台上创建堆栈。 

该 CloudFormation 模板部署了三种资源:

  • SfnRunCommandByInstanceIds— 运行手册允许你运行AWS-RunShellScriptAWS-RunPowerShellScript使用实例 ID。

  • SfnRunCommandByTargets— 运行手册允许你跑AWS-RunPowerShellScriptAWS-RunShellScript或使用目标。

  • SSMSyncRole— 运行手册承担的 IAM 角色。

AWS DevOps
任务描述所需技能

创建测试状态机。

按照《AWS Step Functions 开发者指南》中的说明创建和运行状态机。对于定义,请使用以下代码。请务必使用您账户中启用系统管理器的有效实例的 ID 更新该 InstanceIds 值。

{ "Comment": "A description of my state machine", "StartAt": "StartAutomationWaitForCallBack", "States": { "StartAutomationWaitForCallBack": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution.waitForTaskToken", "Parameters": { "DocumentName": "SfnRunCommandByInstanceIds", "Parameters": { "InstanceIds": [ "i-1234567890abcdef0" ], "taskToken.$": "States.Array($$.Task.Token)", "workingDirectory": [ "/home/ssm-user/" ], "Commands": [ "echo \"This is a test running automation waitForTaskToken\" >> automation.log", "sleep 100" ], "executionTimeout": [ "10800" ], "deliveryTimeout": [ "30" ], "shell": [ "Shell" ] } }, "End": true } } }

此代码调用运行手册来运行两个命令来演示对 Systems Manager Automation 的 waitForTaskToken 调用。

shell参数值(ShellPowerShell)决定自动化文档是运行AWS-RunShellScript还是AWS-RunPowerShellScript

该任务将 “这是测试运行自动化 waitForTask令牌” 写入/home/ssm-user/automation.log文件,然后休眠 100 秒,然后使用任务令牌进行响应并释放工作流程中的下一个任务。

如果要改为调用 SfnRunCommandByTargets 运行手册,请将前述代码的 Parameters 部分替换为以下内容:

"Parameters": { "Targets": [ { "Key": "InstanceIds", "Values": [ "i-02573cafcfEXAMPLE", "i-0471e04240EXAMPLE" ] } ],
AWS DevOps

更新状态机的 IAM 角色。

上一步会自动为状态机创建专用 IAM 角色。但是,它不授予调用运行手册的权限。通过添加以下权限来更新角色:

{ "Effect": "Allow", "Action": "ssm:StartAutomationExecution", "Resource": "*" }
AWS DevOps

验证同步调用。

运行状态机以验证 Step Functions 和 Systems Manager Automation 之间的同步调用。 

有关示例输出,请参阅其他信息部分。 

AWS DevOps

相关资源

其他信息

实施详情

此模式提供了一个部署两个 Systems Manager 运行手册的 CloudFormation 模板:

  • SfnRunCommandByInstanceIds使用实例 ID 运行AWS-RunShellScriptAWS-RunPowerShellScript命令。

  • SfnRunCommandByTargets使用目标运行AWS-RunShellScriptAWS-RunPowerShellScript命令。

使用 Step Functions 中的.waitForTaskToken选项时,每个 runbook 都实现了四个步骤来实现同步调用。

步骤

操作

描述

1

Branch

检查shell参数值(ShellPowerShell),以决定是在 Linux 上运行AWS-RunShellScript还是在 Window AWS-RunPowerShellScript s 上运行。

2

RunCommand_ShellRunCommand_PowerShell

接受多个输入并运行RunShellScriptRunPowerShellScript命令。有关更多信息,请查看 Systems Manager 控制台上RunCommand_ShellRunCommand_PowerShell自动化文档的详细信息选项卡。

3

SendTaskFailure

在步骤 2 中止或取消时运行。它调用 Step Functions send_task_failure API,该 API 接受三个参数作为输入:状态机传递的令牌、失败错误和对失败原因的描述。

4

SendTaskSuccess

在步骤 2 成功时运行。它调用 Step Functions send_task_success API,该 API 接受状态机传递的令牌作为输入。

运行手册参数

SfnRunCommandByInstanceIds运行手册:

参数名称

类型

必需或可选

描述

shell

String

必需

实例外壳AWS-RunShellScript用于决定是在 Linux 上运行还是在 Window AWS-RunPowerShellScript s 上运行。

deliveryTimeout

整数

可选

等待命令传送到实例上的 SSM 代理的时间(以秒为单位)。此参数的最小值为 30(0.5 分钟),最大值为 2592000(720 小时)。

executionTimeout

String

可选

在被视为已失败前命令将运行的时间(单位:秒)。默认值为 3600(1 小时)。最长值为 172800(48 小时)。

workingDirectory

String

可选

实例上工作目录的路径。

Commands

StringList

必需

要运行的 Shell 脚本或命令。

InstanceIds

StringList

必需

要在其中运行命令的实例的 ID。

taskToken

String

必需

用于回调响应的任务令牌。

SfnRunCommandByTargets运行手册:

名称

类型

必需或可选

描述

shell

String

必需

实例外壳AWS-RunShellScript用于决定是在 Linux 上运行还是在 Window AWS-RunPowerShellScript s 上运行。

deliveryTimeout

整数

可选

等待命令传送到实例上的 SSM 代理的时间(以秒为单位)。此参数的最小值为 30(0.5 分钟),最大值为 2592000(720 小时)。

executionTimeout

整数

可选

在被视为已失败前命令将运行的时间(单位:秒)。默认值为 3600(1 小时)。最长值为 172800(48 小时)。

workingDirectory

String

可选

实例上工作目录的路径。

Commands

StringList

必需

要运行的 Shell 脚本或命令。

Targets

MapList

必需

一组搜索条件,使用您指定的键值对来识别实例。例如:[{"Key":"InstanceIds","Values":["i-02573cafcfEXAMPLE","i-0471e04240EXAMPLE"]}]

taskToken

String

必需

用于回调响应的任务令牌。

示例输出

下表提供了 Step 函数的示例输出。它显示步骤 5(TaskSubmitted)和步骤 6(TaskSucceeded)之间的总运行时间超过 100 秒。这表明步骤函数等待sleep 100命令完成后才移至工作流程中的下一个任务。

ID

类型

步骤

资源

运行时间 (ms)

Timestamp

1

ExecutionStarted

-

0

2022 年 3 月 11 日下午 02:50:34.303

2

TaskStateEntered

StartAutomationWaitForCallBack

-

40

2022 年 3 月 11 日下午 02:50:34.343

3

TaskScheduled

StartAutomationWaitForCallBack

-

40

2022 年 3 月 11 日下午 02:50:34.343

4

TaskStarted

StartAutomationWaitForCallBack

-

154

2022 年 3 月 11 日下午 02:50:34.457

5

TaskSubmitted

StartAutomationWaitForCallBack

-

657

2022 年 3 月 11 日下午 02:50:34.960

6

TaskSucceeded

StartAutomationWaitForCallBack

-

103835

2022 年 3 月 11 日下午 02:52:18.138

7

TaskStateExited

StartAutomationWaitForCallBack

-

103860

2022 年 3 月 11 日下午 02:52:18.163

8

ExecutionSucceeded

-

103897

2022 年 3 月 11 日下午 02:52:18.200