从 Amazon S3 运行脚本 - AWS Systems Manager

从 Amazon S3 运行脚本

本节介绍如何从 Amazon Simple Storage Service (Amazon S3) 下载和运行脚本。以下主题包含与 Amazon S3 相关的信息和术语。要了解有关 Amazon S3 的更多信息,请参阅什么是 Amazon S3? 您可以运行不同类型的脚本,包括 Ansible Playbooks、Python、Ruby、Shell 和 PowerShell。

还可以下载包括多个脚本的目录。在运行目录中的主脚本时,AWS Systems Manager 还会运行该目录中包含的任何引用的脚本。

请注意有关从 Amazon S3 运行脚本的以下重要详细信息:

  • Systems Manager 不会验证您的脚本是否能够在节点上运行。在下载和运行脚本之前,请确认相应节点上已经安装所需软件。否则,您可以创建一个复合文档,以使用 Run Command 或 AWS Systems Manager 的功能 State Manager 安装该软件,然后再下载和运行脚本。

  • 验证并确保您的用户、角色或组已经获得读取 S3 存储桶所需的 AWS Identity and Access Management(IAM)权限。

  • 确保 Amazon Elastic Compute Cloud (Amazon EC2) 实例上的实例配置文件拥有 s3:ListBuckets3:GetObject 权限。如果实例配置文件没有这些权限,系统将无法从 S3 存储桶下载脚本。有关更多信息,请参阅 IAM 用户指南中的使用实例配置文件

从 Amazon S3 运行 Shell 脚本

以下信息包含帮助您使用 AWS Systems Manager 控制台或 AWS Command Line Interface(AWS CLI)从 Amazon Simple Storage Service(Amazon S3)运行脚本的过程。尽管示例中使用了 Shell 脚本,但可以替换其他类型的脚本。

从 Amazon S3 运行 Shell 脚本(控制台)

从 Amazon S3 运行 Shell 脚本
  1. 访问 https://console.aws.amazon.com/systems-manager/,打开 AWS Systems Manager 控制台。

  2. 在导航窗格中,选择 Run Command

  3. 选择 Run command(运行命令)

  4. Command document (命令文档) 列表中,选择 AWS-RunRemoteScript

  5. 命令参数中,执行以下操作:

    • 源类型中,选择 S3

    • Source Info (源信息) 文本框中,按以下格式输入访问源所需的信息。将每个示例资源占位符替换为您自己的信息。

      注意

      将 https://s3.aws-api-domain 替换为您的存储桶 URL。您可以在 Objects(对象)选项卡上复制 Amazon S3 中的存储桶 URL。

      {"path":"https://s3.aws-api-domain/path to script"}

      示例如下:

      {"path":"https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/scripts/shell/helloWorld.sh"}
    • Command Line (命令行) 字段中,输入用于脚本执行的参数。下面是一个例子。

      helloWorld.sh argument-1 argument-2
    • (可选)在 Working Directory(工作目录)字段中,输入节点(要在其中下载和运行脚本)上的目录的名称。

    • (可选) 在执行超时中,指定脚本命令执行失败之前系统要等待的秒数。

  6. Targets(目标)部分中,通过指定标签、手动选择实例或边缘设备或指定资源组,选择要在其上运行此操作的托管式节点。

    提示

    如果未列出您希望看到的托管式节点,请参阅 排除托管式节点可用性的问题 以获取故障排除技巧。

  7. 对于 Other parameters(其他参数)

    • 对于 Comment(注释),请输入有关此命令的信息。

    • 对于 Timeout (seconds) (超时 (秒)),请指定在整个命令执行失败之前系统等待的秒数。

  8. 对于 Rate control(速率控制)

    • 对于 Concurrency(并发),请指定要同时运行该命令的托管式节点的数量或百分比。

      注意

      如果您通过指定应用于托管式节点的标签或指定 AWS Resource Groups 来选择目标,但不确定有多少个托管式节点已被设为目标,则可通过指定百分比来限制可同时运行该文档的目标的数量。

    • 对于 Error threshold(错误阈值),请指定当命令在一定数量或百分比的节点上失败后,何时在其他托管式节点上停止运行该命令。例如,如果您指定三个错误,Systems Manager 将在收到第四个错误时停止发送该命令。仍在处理该命令的托管式节点也可能发送错误。

  9. (可选)对于 输出选项,要将命令输出保存到文件,请选中 将命令输出写入 S3 存储桶 框。在输入框中输入存储桶和前缀(文件夹)名称。

    注意

    授予将数据写入 S3 存储桶的能力的 S3 权限,是分配给实例的实例配置文件(适用于 EC2 实例)或 IAM 服务角色(混合激活的计算机)的权限,而不是执行此任务的 IAM 用户的权限。有关更多信息,请参阅配置 Systems Manager 所需的实例权限为混合环境创建 IAM 服务角色。此外,如果指定的 S3 存储桶位于不同的 AWS 账户 中,请确保与该托管式节点关联的实例配置文件或 IAM 服务角色具有写入该存储桶的所需权限。

  10. SNS 通知部分,如果需要发送有关命令执行状态的通知,请选中 Enable SNS notifications(启用 SNS 通知)复选框。

    有关为 Run Command 配置 Amazon SNS 通知的更多信息,请参阅 使用 Amazon SNS 通知监控 Systems Manager 状态更改

  11. 选择 Run(运行)

从 Amazon S3 运行 Shell 脚本(命令行)

  1. 安装并配置 AWS Command Line Interface(AWS CLI)(如果尚未执行该操作)。

    有关信息,请参阅安装或更新 AWS CLI 的最新版本

  2. 运行以下命令。将每个示例资源占位符替换为您自己的信息。

    注意

    将 https://s3.aws-api-domain/script path 替换为您的存储桶 URL。您可以在 Objects(对象)选项卡上复制 Amazon S3 中的存储桶 URL。

    Linux & macOS
    aws ssm send-command \ --document-name "AWS-RunRemoteScript" \ --output-s3-bucket-name "bucket-name" \ --output-s3-key-prefix "key-prefix" \ --targets "Key=InstanceIds,Values=instance-id" \ --parameters '{"sourceType":["S3"],"sourceInfo":["{\"path\":\"https://s3.aws-api-domain/script path\"}"],"commandLine":["script name and arguments"]}'
    Windows
    aws ssm send-command ^ --document-name "AWS-RunRemoteScript" ^ --output-s3-bucket-name "bucket-name" ^ --output-s3-key-prefix "key-prefix" ^ --targets "Key=InstanceIds,Values=instance-id" ^ --parameters "sourceType"="S3",sourceInfo='{\"path\":\"https://s3.aws-api-domain/script path\"}',"commandLine"="script name and arguments"
    PowerShell
    Send-SSMCommand ` -DocumentName "AWS-RunRemoteScript" ` -OutputS3BucketName "bucket-name" ` -OutputS3KeyPrefix "key-prefix" ` -Target @{Key="InstanceIds";Values=@("instance-id")} ` -Parameter @{ sourceType="S3";sourceInfo='{"path": "https://s3.aws-api-domain/script path"}',; "commandLine"="script name and arguments"}