AWS Systems Manager
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWSSupport-StartEC2RescueWorkflow

描述

AWSSupport-StartEC2RescueWorkflow Automation 文档在为修复实例而创建的帮助程序实例上运行提供的 base64 编码脚本(Bash 或 Powershell)。实例的根卷已附加并挂载到帮助程序实例(也称为 EC2Rescue 实例)。如果实例是 Windows,请提供 Powershell 脚本。否则,请使用 Bash。工作流程会设置一些可供脚本使用的环境变量。环境变量包含有关您提供的输入的信息,以及有关离线根卷的信息。离线卷已挂载,可供使用。例如,您可以将 Desired State Configuration 文件保存到离线 Windows 根卷,或 chroot 到一个离线 Linux 根卷并执行离线修复。

附加信息

要对脚本进行 base64 编码,可以使用 Powershell 或 Bash。Powershell:

[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes([System.IO.File]::ReadAllText('PATH_TO_FILE')))

Bash:

base64 PATH_TO_FILE

下面是您可以在离线脚本中使用的环境变量列表,具体视目标操作系统而定

Windows:

变量 描述 示例值

$env:EC2RESCUE_ACCOUNT_ID

{{ global:ACCOUNT_ID }}

123456789012

$env:EC2RESCUE_DATE

{{ global:DATE }}

2018-09-07

$env:EC2RESCUE_DATE_TIME

{{ global:DATE_TIME }}

2018-09-07_18.09.59

$env:EC2RESCUE_EC2RW_DIR

EC2Rescue for Windows 安装路径

C:\Program Files\Amazon\EC2Rescue

$env:EC2RESCUE_EC2RW_DIR

EC2Rescue for Windows 安装路径

C:\Program Files\Amazon\EC2Rescue

$env:EC2RESCUE_EXECUTION_ID

{{ automation:EXECUTION_ID }}

7ef8008e-219b-4aca-8bb5-65e2e898e20b

$env:EC2RESCUE_OFFLINE_CURRENT_CONTROL_SET

离线 Windows 目前控制设置路径

HKLM:\AWSTempSystem\ControlSet001

$env:EC2RESCUE_OFFLINE_DRIVE

离线 Windows 驱动器号

D:\

$env:EC2RESCUE_OFFLINE_EBS_DEVICE

离线根卷 EBS 设备

xvdf

$env:EC2RESCUE_OFFLINE_KERNEL_VER

离线 Windows 内核版本

6.1.7601.24214

$env:EC2RESCUE_OFFLINE_OS_ARCHITECTURE

离线 Windows 架构

AMD64

$env:EC2RESCUE_OFFLINE_OS_CAPTION

离线 Windows 标题

Windows Server 2008 R2(数据中心版)

$env:EC2RESCUE_OFFLINE_OS_TYPE

离线 Windows 操作系统类型

Server

$env:EC2RESCUE_OFFLINE_PROGRAM_FILES_DIR

离线 Windows 程序文件目录路径

D:\Program Files

$env:EC2RESCUE_OFFLINE_PROGRAM_FILES_X86_DIR

离线 Windows 程序文件 x86 目录路径

D:\Program Files (x86)

$env:EC2RESCUE_OFFLINE_REGISTRY_DIR

离线 Windows 注册表目录路径

D:\Windows\System32\config

$env:EC2RESCUE_OFFLINE_SYSTEM_ROOT

离线 Windows 系统根目录路径

D:\Windows

$env:EC2RESCUE_REGION

{{ global:REGION }}

us-west-1

$env:EC2RESCUE_S3_BUCKET

{{ S3BucketName }}

mybucket

$env:EC2RESCUE_S3_PREFIX

{{ S3Prefix }}

myprefix/

$env:EC2RESCUE_SOURCE_INSTANCE

{{ InstanceId }}

i-abcdefgh123456789

$script:EC2RESCUE_OFFLINE_WINDOWS_INSTALL

离线 Windows 安装元数据

客户 Powershell 对象

Linux:

变量 描述 示例值

EC2RESCUE_ACCOUNT_ID

{{ global:ACCOUNT_ID }}

123456789012

EC2RESCUE_DATE

{{ global:DATE }}

2018-09-07

EC2RESCUE_DATE_TIME

{{ global:DATE_TIME }}

2018-09-07_18.09.59

EC2RESCUE_EC2RL_DIR

EC2Rescue for Linux 安装路径

/usr/local/ec2rl-1.1.3

EC2RESCUE_EXECUTION_ID

{{ automation:EXECUTION_ID }}

7ef8008e-219b-4aca-8bb5-65e2e898e20b

EC2RESCUE_OFFLINE_DEVICE

离线设备名称

/dev/xvdf1

EC2RESCUE_OFFLINE_EBS_DEVICE

离线根卷 EBS 设备

/dev/sdf

EC2RESCUE_OFFLINE_SYSTEM_ROOT

离线根卷挂载点

/mnt/mount

EC2RESCUE_PYTHON

Python 版本

python2.7

EC2RESCUE_REGION

{{ global:REGION }}

us-west-1

EC2RESCUE_S3_BUCKET

{{ S3BucketName }}

mybucket

EC2RESCUE_S3_PREFIX

{{ S3Prefix }}

myprefix/

EC2RESCUE_SOURCE_INSTANCE

{{ InstanceId }}

i-abcdefgh123456789

文档类型

Automation

所有者

Amazon

平台

Windows、Linux

参数

  • 实例 ID

    类型:字符串

    说明:(必需)您的 EC2 实例的 ID。重要信息:AWS Systems Manager Automation 会停止此实例。存储在实例存储卷中的数据将丢失。如果不使用弹性 IP,则公有 IP 地址将发生更改。

  • OfflineScript

    类型:字符串

    说明:(必需)将对帮助程序实例运行的 Base64 编码的脚本。如果源实例为 Linux,使用 Bash;如果为 Windows,则使用 PowerShell。

  • EC2RescueInstanceType

    类型:字符串

    允许的值:t2.small、t2.medium、t2.large

    默认值:t2.small

    说明:(可选)EC2Rescue 实例的 EC2 实例类型。

  • SubnetId

    类型:字符串

    默认值:SelectedInstanceSubnet

    说明:(可选)EC2Rescue 实例的子网 ID。默认情况下,使用提供的实例所在的同一子网。重要说明:如果提供了自定义子网,则其必须与 InstanceId 位于同一可用区中,并且必须允许访问 SSM 终端节点。

  • S3BucketName

    类型:字符串

    说明:(可选)您账户中用于上传故障排除日志的 S3 存储桶的名称。请确保存储桶策略不会向不需要访问收集的日志的各方授予不必要的读/写权限。

  • S3Prefix

    类型:字符串

    默认值:AWSSupport-EC2Rescue

    说明:(可选)S3 日志的前缀。

  • AMIPrefix

    类型:字符串

    默认值:AWSSupport-EC2Rescue

    说明:(可选)备份 AMI 名称的前缀。

  • CreatePreEC2RescueBackup

    类型:字符串

    允许的值:True、False

    默认值:False

    说明:(可选)将其设置为 True 可在运行脚本前创建 InstanceId 的 AMI。Automation 完成后,AMI 仍将存在。对此 AMI 的安全访问由您负责;或者,您也可以将其删除。

  • CreatePostEC2RescueBackup

    类型:字符串

    允许的值:True、False

    默认值:False

    说明:(可选)将其设置为 True 可在运行脚本后、启动其前创建 InstanceId 的 AMI。Automation 完成后,AMI 仍将存在。对此 AMI 的安全访问由您负责;或者,您也可以将其删除。

  • UniqueId

    类型:字符串

    默认值:{{ automation:EXECUTION_ID }}

    说明:(可选)工作流程的唯一标识符。

  • AutomationAssumeRole

    类型:字符串

    说明:(可选)允许 Automation 代表您执行操作的角色的 ARN。如果未指定任何角色,Systems Manager Automation 使用您的 IAM 权限运行此文档。

示例

在 Windows 帮助程序实例上打印环境变量

aws ssm start-automation-execution --document-name "AWSSupport-StartEC2RescueWorkflow" --parameters "InstanceId=WINDOWSINSTANCEID,OfflineScript=R2V0LUNoaWxkSXRlbSBlbnY6KiB8IFNvcnQtT2JqZWN0IE5hbWU="

在 Linux 帮助程序实例上打印环境变量

aws ssm start-automation-execution --document-name "AWSSupport-StartEC2RescueWorkflow" --parameters "InstanceId=LINUXINSTANCEID,OfflineScript=IyEvYmluL2Jhc2gKcHJpbnRlbnYgfCBzb3J0"

检索执行输出

aws ssm get-automation-execution --automation-execution-id EXECUTIONID --output text --query 'AutomationExecution.Output'

所需的 IAM 权限

建议为运行 Automation 的用户附加 AmazonSSMAutomationRole IAM 托管策略。除了此策略以外,用户还必须:

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "lambda:InvokeFunction", "lambda:DeleteFunction", "lambda:GetFunction" ], "Resource": "arn:aws:lambda:*:An-AWS-Account-ID:function:AWSSupport-EC2Rescue-*", "Effect": "Allow" }, { "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::awssupport-ssm.*/*.template", "arn:aws:s3:::awssupport-ssm.*/*.zip" ], "Effect": "Allow" }, { "Action": [ "iam:CreateRole", "iam:CreateInstanceProfile", "iam:GetRole", "iam:GetInstanceProfile", "iam:PutRolePolicy", "iam:DetachRolePolicy", "iam:AttachRolePolicy", "iam:PassRole", "iam:AddRoleToInstanceProfile", "iam:RemoveRoleFromInstanceProfile", "iam:DeleteRole", "iam:DeleteRolePolicy", "iam:DeleteInstanceProfile" ], "Resource": [ "arn:aws:iam::An-AWS-Account-ID:role/AWSSupport-EC2Rescue-*", "arn:aws:iam::An-AWS-Account-ID:instance-profile/AWSSupport-EC2Rescue-*" ], "Effect": "Allow" }, { "Action": [ "lambda:CreateFunction", "ec2:CreateVpc", "ec2:ModifyVpcAttribute", "ec2:DeleteVpc", "ec2:CreateInternetGateway", "ec2:AttachInternetGateway", "ec2:DetachInternetGateway", "ec2:DeleteInternetGateway", "ec2:CreateSubnet", "ec2:DeleteSubnet", "ec2:CreateRoute", "ec2:DeleteRoute", "ec2:CreateRouteTable", "ec2:AssociateRouteTable", "ec2:DisassociateRouteTable", "ec2:DeleteRouteTable", "ec2:CreateVpcEndpoint", "ec2:DeleteVpcEndpoints", "ec2:ModifyVpcEndpoint", "ec2:Describe*" ], "Resource": "*", "Effect": "Allow" } ] }

文档步骤

  1. aws:executeAwsApi - 描述提供的实例

  2. aws:executeAwsApi - 描述提供的实例的根卷

  3. aws:assertAwsResourceProperty - 检查根卷设备类型是不是 EBS

  4. aws:assertAwsResourceProperty - 检查根卷是否未加密

  5. aws:assertAwsResourceProperty - 检查提供的子网 ID

    1. (使用当前实例子网)- 如果 *SubnetId = SelectedInstanceSubnet*,则运行 aws:createStack 来部署 EC2Rescue CloudFormation 堆栈

    2. (创建新的 VPC)- 如果 *SubnetId = CreateNewVPC*,然后运行 aws:createStack 来部署 EC2Rescue CloudFormation 堆栈

    3. (使用自定义子网)- 在所有其他情况下:

      aws:assertAwsResourceProperty - 检查提供的子网是否与提供的实例位于同一可用区中

      aws:createStack - 部署 EC2Rescue CloudFormation 堆栈

  6. aws:invokeLambdaFunction - 执行其他输入验证

  7. aws:executeAwsApi – 更新 EC2Rescue CloudFormation 堆栈来创建 EC2Rescue 帮助程序实例

  8. aws:waitForAwsResourceProperty - 等待 EC2Rescue CloudFormation 堆栈完成更新

  9. aws:executeAwsApi - 描述 EC2Rescue CloudFormation 堆栈输出来获取 EC2Rescue 帮助程序实例 ID

  10. aws:waitForAwsResourceProperty - 等待 EC2Rescue 帮助程序实例变为托管实例

  11. aws:changeInstanceState - 停止提供的实例

  12. aws:changeInstanceState - 停止提供的实例

  13. aws:changeInstanceState - 强制停止提供的实例

  14. aws:assertAwsResourceProperty - 检查 CreatePreEC2RescueBackup 输入值

    1. (在运行 EC2Rescue 前创建备份)- 如果 *CreatePreEC2RescueBackup = True*

    2. aws:executeAwsApi - 创建提供的实例的 AMI 备份

    3. aws:createTags - 标记 AMI 备份

  15. aws:runCommand - 在 EC2Rescue 帮助程序实例上安装 EC2Rescue

  16. aws:executeAwsApi - 从提供的实例中分离根卷

  17. aws:assertAwsResourceProperty - 检查提供的实例的平台

    1. (实例为 Windows):

      aws:executeAwsApi - 将根卷作为 *xvdf* 附加到 EC2Rescue 帮助程序实例

      aws:sleep - 睡眠 10 秒

      aws:runCommand - 在 Powershell 中运行提供的离线脚本

    2. (实例为 Linux):

      aws:executeAwsApi - 将根卷作为 */dev/sdf* 附加到 EC2Rescue 帮助程序实例

      aws:sleep - 睡眠 10 秒

      aws:runCommand - 在 Bash 中运行提供的离线脚本

  18. aws:changeInstanceState - 停止 EC2Rescue 帮助程序实例

  19. aws:changeInstanceState - 强制停止 EC2Rescue 帮助程序实例

  20. aws:executeAwsApi - 从 EC2Rescue 帮助程序实例中分离根卷

  21. aws:executeAwsApi - 将根卷附加回提供的实例

  22. aws:assertAwsResourceProperty - 检查 CreatePostEC2RescueBackup 输入值

    1. (在运行 EC2Rescue 后创建备份)- 如果 *CreatePostEC2RescueBackup = True*

    2. aws:executeAwsApi - 创建提供的实例的 AMI 备份

    3. aws:createTags - 标记 AMI 备份

  23. aws:executeAwsApi - 为提供的实例的根卷恢复初始的终止时删除状态

  24. aws:changeInstanceState - 将提供的实例恢复为初始状态(运行/停止)

  25. aws:deleteStack - 删除 EC2Rescue CloudFormation 堆栈

输出

runScriptForLinux.Output

runScriptForWindows.Output

preScriptBackup.ImageId

postScriptBackup.ImageId